From f20c3308a0d420bbc81089fad47108fa4f25aa17 Mon Sep 17 00:00:00 2001 From: guigues Date: Fri, 27 Feb 2009 11:20:25 +0000 Subject: [PATCH] Fixed (sure ? to test extensively) the problem with vtk-inherited black boxes desallocation --- kernel/src/bbtkBlackBox.cxx | 6 +-- kernel/src/bbtkFactory.cxx | 41 ++++++++++++----- kernel/src/bbtkVtkBlackBoxMacros.h | 64 ++++++++++++++++++++++----- packages/vtk/src/bbvtkImagePlanes.cxx | 53 +++++++++++++--------- packages/vtk/src/bbvtkImagePlanes.h | 8 +++- 5 files changed, 127 insertions(+), 45 deletions(-) diff --git a/kernel/src/bbtkBlackBox.cxx b/kernel/src/bbtkBlackBox.cxx index a4dea22..803e554 100644 --- a/kernel/src/bbtkBlackBox.cxx +++ b/kernel/src/bbtkBlackBox.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkBlackBox.cxx,v $ Language: C++ - Date: $Date: 2008/12/11 15:30:04 $ - Version: $Revision: 1.38 $ + Date: $Date: 2009/02/27 11:20:25 $ + Version: $Revision: 1.39 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -78,7 +78,7 @@ namespace bbtk b->bbDelete(); - bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""< BlackBox::Deleter(\""< mAlive; + do { + mAlive.clear(); + while (mPackageMap.begin() != mPackageMap.end()) + { + PackageMapType::iterator i = mPackageMap.begin(); + Package::WeakPointer p = i->second; + ClosePackage(i); + if (p.lock()) mAlive.push_back(p); + } + std::vector< Package::WeakPointer >::iterator i; + for (i=mAlive.begin();i!=mAlive.end();++i) + { + // If not dead : reinsert + if (i->lock()) + { + bbtkDebugMessage("Kernel",7,"Package "<lock()->GetName() + <<" still alive"<lock()); + } + } + } + while (mPackageMap.size()>0); + bbtkDebugDecTab("Kernel",7); } //=================================================================== @@ -358,9 +378,10 @@ namespace bbtk // remove the entry in the map mPackageMap.erase(i); // Release the package if not already destroyed - if (p.lock()) Package::Release(p); - - + if (p.lock()) + { + Package::Release(p); + } bbtkDebugDecTab("Kernel",7); } //=================================================================== diff --git a/kernel/src/bbtkVtkBlackBoxMacros.h b/kernel/src/bbtkVtkBlackBoxMacros.h index 448e2fe..ce87d7e 100644 --- a/kernel/src/bbtkVtkBlackBoxMacros.h +++ b/kernel/src/bbtkVtkBlackBoxMacros.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkVtkBlackBoxMacros.h,v $ Language: C++ - Date: $Date: 2008/10/17 08:18:14 $ - Version: $Revision: 1.7 $ + Date: $Date: 2009/02/27 11:20:25 $ + Version: $Revision: 1.8 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -36,7 +36,7 @@ */ #ifndef __bbtkVtkBlackBoxMacros_h__ #define __bbtkVtkBlackBoxMacros_h__ -//#include +#include //#include #include @@ -47,11 +47,48 @@ //=========================================================================== //=========================================================================== +//=========================================================================== +#define BBTK_VTK_DISABLE_GARBAGE_COLLECTOR \ + public: \ + virtual void Register(vtkObjectBase* o) {} \ + virtual void UnRegister(vtkObjectBase* o) {} \ + protected: \ + virtual void ReportReferences(vtkGarbageCollector* collector) {} + +/* + + public: \ + virtual void Register(vtkObjectBase* o) {} \ + { + this->RegisterInternal(o, 1); + } + virtual void UnRegister(vtkObjectBase* o) + { + this->UnRegisterInternal(o, 1); + } + + protected: + + virtual void ReportReferences(vtkGarbageCollector* collector) + { + // Report references held by this object that may be in a loop. + this->Superclass::ReportReferences(collector); + vtkGarbageCollectorReport(collector, this->OtherObject, "Other Object"); + } +*/ +//=========================================================================== //=========================================================================== #define BBTK_VTK_DELETE() \ void bbDelete() { \ + for (int i=0; iSetSource(NULL); \ + /*std::cout << "VTK : bbDelete() "< "<<#CLASS \ <<"::New(\""< "<<#CLASS \ <<"::bbClone(\""<UnRegister(this); + //=========================================================================== /// Declares a vtkImageAlgorithm-inherited AtomicBlackBox input #define BBTK_DECLARE_VTK_IMAGE_ALGORITHM_INPUT(NAME,TYPE) \ @@ -104,7 +147,7 @@ { return GetImageDataInput(0); /*vtkParent::GetInput();*/ } \ void bbSetInput##NAME (TYPE d) \ { vtkParent::SetInput( (vtkDataObject*) d); \ - /*bbSetModifiedStatus();*/ } + BBTK_VTK_UNREGISTER(d);/*bbSetModifiedStatus();*/ } //=========================================================================== //=========================================================================== @@ -115,7 +158,7 @@ { return GetPolyDataInput(0); /*vtkParent::GetInput();*/ } \ void bbSetInput##NAME (TYPE d) \ { vtkParent::SetInput( (vtkDataObject*) d); \ - /*bbSetModifiedStatus();*/ } + BBTK_VTK_UNREGISTER(d);/*bbSetModifiedStatus();*/ } //=========================================================================== //=========================================================================== @@ -135,7 +178,8 @@ TYPE bbGetInput##NAME () \ { return dynamic_cast(vtkParent::GetInput()); } \ void bbSetInput##NAME (TYPE d) \ - { vtkParent::SetInput( (vtkDataObject*) d); /*vtkParent::GetOutput() = d;*/ } + { vtkParent::SetInput( (vtkDataObject*) d); \ + BBTK_VTK_UNREGISTER(d);/*vtkParent::GetOutput() = d;*/ } //=========================================================================== diff --git a/packages/vtk/src/bbvtkImagePlanes.cxx b/packages/vtk/src/bbvtkImagePlanes.cxx index 8ff343d..ccfba10 100644 --- a/packages/vtk/src/bbvtkImagePlanes.cxx +++ b/packages/vtk/src/bbvtkImagePlanes.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbvtkImagePlanes.cxx,v $ Language: C++ - Date: $Date: 2009/01/08 10:18:37 $ - Version: $Revision: 1.19 $ + Date: $Date: 2009/02/27 11:20:26 $ + Version: $Revision: 1.20 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -108,25 +108,25 @@ namespace bbvtk { //================================================================ - class myCallbackPlane : public vtkCommand + class ImagePlanes::VtkCallbackType : public vtkCommand { public: - static myCallbackPlane *New() + static VtkCallbackType *New() { - return new myCallbackPlane; + return new VtkCallbackType; } virtual void Execute(vtkObject *caller, unsigned long, void*) { - currentBlackBox->Process(); - currentBlackBox->bbSignalOutputModification(); + mBlackBox->Process(); + mBlackBox->bbSignalOutputModification(); } - void SetCurrentBlackBox(ImagePlanes *cBB) {currentBlackBox = cBB;}; - void SetVtkPlaneWidget( vtkImagePlaneWidget *planeWidget ); - myCallbackPlane() {}; + void SetBlackBox(ImagePlanes *BB) { mBlackBox = BB;}; + // void SetVtkPlaneWidget( vtkImagePlaneWidget *planeWidget ); + VtkCallbackType() {}; private: - vtkPlaneWidget *planeWidget; - ImagePlanes *currentBlackBox; + // vtkPlaneWidget *planeWidget; + ImagePlanes *mBlackBox; }; //================================================================ @@ -206,20 +206,33 @@ namespace bbvtk picker->UnRegister(NULL); - myCallbackPlane *_myCallback = myCallbackPlane::New(); - _myCallback->SetCurrentBlackBox(this); - planeWidgetX->AddObserver(vtkCommand::InteractionEvent,_myCallback); - planeWidgetY->AddObserver(vtkCommand::InteractionEvent,_myCallback); - planeWidgetZ->AddObserver(vtkCommand::InteractionEvent,_myCallback); + mVtkCallback = VtkCallbackType::New(); + mVtkCallback->SetBlackBox(this); + planeWidgetX->AddObserver(vtkCommand::InteractionEvent,mVtkCallback); + planeWidgetY->AddObserver(vtkCommand::InteractionEvent,mVtkCallback); + planeWidgetZ->AddObserver(vtkCommand::InteractionEvent,mVtkCallback); } //--------------------------------------------------------------------- void ImagePlanes::bbUserDestructor() { - if (bbGetOutputPlaneX()) bbGetOutputPlaneX()->UnRegister(NULL); - if (bbGetOutputPlaneY()) bbGetOutputPlaneY()->UnRegister(NULL); - if (bbGetOutputPlaneZ()) bbGetOutputPlaneZ()->UnRegister(NULL); + if (bbGetOutputPlaneX()) + { + bbGetOutputPlaneX()->SetInput(NULL); + bbGetOutputPlaneX()->UnRegister(NULL); + } + if (bbGetOutputPlaneY()) + { + bbGetOutputPlaneY()->SetInput(NULL); + bbGetOutputPlaneY()->UnRegister(NULL); + } + if (bbGetOutputPlaneZ()) + { + bbGetOutputPlaneZ()->SetInput(NULL); + bbGetOutputPlaneZ()->UnRegister(NULL); + } + mVtkCallback->Delete(); } //--------------------------------------------------------------------- diff --git a/packages/vtk/src/bbvtkImagePlanes.h b/packages/vtk/src/bbvtkImagePlanes.h index 686ec71..f41e8a9 100644 --- a/packages/vtk/src/bbvtkImagePlanes.h +++ b/packages/vtk/src/bbvtkImagePlanes.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbvtkImagePlanes.h,v $ Language: C++ - Date: $Date: 2009/01/08 10:18:37 $ - Version: $Revision: 1.12 $ + Date: $Date: 2009/02/27 11:20:26 $ + Version: $Revision: 1.13 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -63,6 +63,8 @@ namespace bbvtk { typedef std::vector winLevel; + + class /*BBTK_EXPORT*/ ImagePlanes : public bbtk::AtomicBlackBox { @@ -87,6 +89,8 @@ namespace bbvtk virtual void bbUserDestructor(); void Init(); private: + class VtkCallbackType; + VtkCallbackType* mVtkCallback; vtkImageData* image; }; -- 2.45.1