Commit 353d2496ceb630e2f574474c80ce75de7ba85ac7
1 parent
a5768458
Rework smartCopy
If we are doing nonsense like composing algorithms in memory, checking for a NULL parent is not a viable way to detect when smartCopy has returned a loose transform. This is because root transforms created through algorithmCore or whatever also have NULL parents, but actually they will be deleted via QSharedPointers, so adding them to a parent chain is dangerous, and they can show up as child transforms if we say attach them as children of a stream or distribute transform as part of a parallelization scheme. So, instead we add an output parameter to smartCopy indicating if the returned pointer is a newly allocated transform, that is not already set up to be deleted.
Showing
4 changed files
with
25 additions
and
15 deletions
openbr/openbr_plugin.h
| @@ -1209,7 +1209,9 @@ public: | @@ -1209,7 +1209,9 @@ public: | ||
| 1209 | * and copy enough of their state that projectUpdate can safely be called on the original | 1209 | * and copy enough of their state that projectUpdate can safely be called on the original |
| 1210 | * instance, and the copy concurrently. | 1210 | * instance, and the copy concurrently. |
| 1211 | */ | 1211 | */ |
| 1212 | - virtual Transform * smartCopy() { return this;} | 1212 | + virtual Transform * smartCopy(bool & newTransform) { newTransform=false; return this;} |
| 1213 | + | ||
| 1214 | + virtual Transform * smartCopy() {bool junk; return smartCopy(junk);} | ||
| 1213 | 1215 | ||
| 1214 | /*! | 1216 | /*! |
| 1215 | * \brief Recursively retrieve a named event, returns NULL if an event is not found. | 1217 | * \brief Recursively retrieve a named event, returns NULL if an event is not found. |
openbr/plugins/meta.cpp
| @@ -614,13 +614,20 @@ class DistributeTemplateTransform : public MetaTransform | @@ -614,13 +614,20 @@ class DistributeTemplateTransform : public MetaTransform | ||
| 614 | 614 | ||
| 615 | public: | 615 | public: |
| 616 | 616 | ||
| 617 | - Transform * smartCopy() | 617 | + Transform * smartCopy(bool & newTransform) |
| 618 | { | 618 | { |
| 619 | - if (!transform->timeVarying()) | 619 | + if (!transform->timeVarying()) { |
| 620 | + newTransform = false; | ||
| 620 | return this; | 621 | return this; |
| 622 | + } | ||
| 623 | + newTransform = true; | ||
| 621 | 624 | ||
| 622 | DistributeTemplateTransform * output = new DistributeTemplateTransform; | 625 | DistributeTemplateTransform * output = new DistributeTemplateTransform; |
| 623 | - output->transform = transform->smartCopy(); | 626 | + bool newChild = false; |
| 627 | + output->transform = transform->smartCopy(newChild); | ||
| 628 | + if (newChild) | ||
| 629 | + output->transform->setParent(output); | ||
| 630 | + | ||
| 624 | return output; | 631 | return output; |
| 625 | } | 632 | } |
| 626 | 633 |
openbr/plugins/openbr_internal.h
| @@ -139,8 +139,9 @@ public: | @@ -139,8 +139,9 @@ public: | ||
| 139 | *\brief For transforms that don't do any training, this default implementation | 139 | *\brief For transforms that don't do any training, this default implementation |
| 140 | * which creates a new copy of the Transform from its description string is sufficient. | 140 | * which creates a new copy of the Transform from its description string is sufficient. |
| 141 | */ | 141 | */ |
| 142 | - virtual Transform * smartCopy() | 142 | + virtual Transform * smartCopy(bool & newTransform) |
| 143 | { | 143 | { |
| 144 | + newTransform = true; | ||
| 144 | return this->clone(); | 145 | return this->clone(); |
| 145 | } | 146 | } |
| 146 | 147 | ||
| @@ -250,10 +251,13 @@ public: | @@ -250,10 +251,13 @@ public: | ||
| 250 | * it creates a new copy of its own class, and gives that copy the child transforms | 251 | * it creates a new copy of its own class, and gives that copy the child transforms |
| 251 | * returned by calling smartCopy on this transforms children | 252 | * returned by calling smartCopy on this transforms children |
| 252 | */ | 253 | */ |
| 253 | - Transform * smartCopy() | 254 | + Transform * smartCopy(bool & newTransform) |
| 254 | { | 255 | { |
| 255 | - if (!timeVarying()) | 256 | + if (!timeVarying()) { |
| 257 | + newTransform = false; | ||
| 256 | return this; | 258 | return this; |
| 259 | + } | ||
| 260 | + newTransform = true; | ||
| 257 | 261 | ||
| 258 | QString name = metaObject()->className(); | 262 | QString name = metaObject()->className(); |
| 259 | name.replace("Transform",""); | 263 | name.replace("Transform",""); |
| @@ -266,8 +270,9 @@ public: | @@ -266,8 +270,9 @@ public: | ||
| 266 | 270 | ||
| 267 | foreach(Transform* t, transforms ) | 271 | foreach(Transform* t, transforms ) |
| 268 | { | 272 | { |
| 269 | - Transform * maybe_copy = t->smartCopy(); | ||
| 270 | - if (maybe_copy->parent() == NULL) | 273 | + bool newItem = false; |
| 274 | + Transform * maybe_copy = t->smartCopy(newItem); | ||
| 275 | + if (newItem) | ||
| 271 | maybe_copy->setParent(output); | 276 | maybe_copy->setParent(output); |
| 272 | output->transforms.append(maybe_copy); | 277 | output->transforms.append(maybe_copy); |
| 273 | } | 278 | } |
openbr/plugins/stream.cpp
| @@ -1092,10 +1092,6 @@ public: | @@ -1092,10 +1092,6 @@ public: | ||
| 1092 | 1092 | ||
| 1093 | // dst is set to all output received by the final stage, along | 1093 | // dst is set to all output received by the final stage, along |
| 1094 | // with anything output via the calls to finalize. | 1094 | // with anything output via the calls to finalize. |
| 1095 | - //dst = collectionStage->getOutput(); | ||
| 1096 | - | ||
| 1097 | - // dst is set to all output received by the final stage, along | ||
| 1098 | - // with anything output via the calls to finalize. | ||
| 1099 | foreach(const TemplateList & list, collector->sets) { | 1095 | foreach(const TemplateList & list, collector->sets) { |
| 1100 | dst.append(list); | 1096 | dst.append(list); |
| 1101 | } | 1097 | } |
| @@ -1378,10 +1374,10 @@ public: | @@ -1378,10 +1374,10 @@ public: | ||
| 1378 | basis.init(); | 1374 | basis.init(); |
| 1379 | } | 1375 | } |
| 1380 | 1376 | ||
| 1381 | - Transform * smartCopy() | 1377 | + Transform * smartCopy(bool & newTransform) |
| 1382 | { | 1378 | { |
| 1383 | // We just want the DirectStream to begin with, so just return a copy of that. | 1379 | // We just want the DirectStream to begin with, so just return a copy of that. |
| 1384 | - DirectStreamTransform * res = (DirectStreamTransform *) basis.smartCopy(); | 1380 | + DirectStreamTransform * res = (DirectStreamTransform *) basis.smartCopy(newTransform); |
| 1385 | res->activeFrames = this->activeFrames; | 1381 | res->activeFrames = this->activeFrames; |
| 1386 | return res; | 1382 | return res; |
| 1387 | } | 1383 | } |