X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=kernel%2Fsrc%2FbbtkFactory.cxx;h=6b4079344912f2c976bba2e3e209c044990f6d7e;hb=981ac411655ee59f6cf7a6e89099a4366ac4b18b;hp=74d515ded67b1fb1106fe203631eac73c8eeba44;hpb=5afbcf4593f1c4401ed7d5687dec068e89dfa8e7;p=bbtk.git diff --git a/kernel/src/bbtkFactory.cxx b/kernel/src/bbtkFactory.cxx index 74d515d..6b40793 100644 --- a/kernel/src/bbtkFactory.cxx +++ b/kernel/src/bbtkFactory.cxx @@ -4,8 +4,8 @@ Program: bbtk Module: $RCSfile: bbtkFactory.cxx,v $ Language: C++ -Date: $Date: 2008/03/04 08:09:04 $ -Version: $Revision: 1.26 $ +Date: $Date: 2008/03/11 12:27:21 $ +Version: $Revision: 1.30 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de @@ -37,20 +37,6 @@ PURPOSE. See the above copyright notices for more information. #include // std::toupper -// was in gdcm ... -/* -#ifdef _MSC_VER -# define getcwd _getcwd -#endif - -#if defined(_MSC_VER) || defined(__BORLANDC__) -# include -#else -# include -#endif - -*/ - namespace bbtk { @@ -61,6 +47,7 @@ namespace bbtk //=================================================================== /// Default ctor Factory::Factory() + : mExecuter(0) { bbtkDebugMessage("Kernel",7,"Factory::Factory()"<GetBBTKVersion() != bbtk::GetVersion() ) { @@ -215,6 +208,9 @@ namespace bbtk << " whereas application build with version " << bbtk::GetVersion()); } + + pack.mPackage->AddFactory(this); + mPackageMap[pkgname] = pack; std::string separator = ConfigurationFile::GetInstance().Get_file_separator (); @@ -444,71 +440,85 @@ namespace bbtk //=================================================================== /// \brief Close the package referenced by the iterator - /// - /// If it is a dynamically loaded package - /// - Loads and calls the function "DeletePackage" of the dynamic library (responsible for package desallocation) - /// - Closes the dynamic library - /// - Erases the package entry in the packages map - /// - /// Else simply erases the package entry in the packages map - void Factory::ClosePackage(PackageMapType::iterator& i) + /// + /// First removes the factory from the set of factories which use the package + /// If the set is empty then : + /// If it is a dynamically loaded package : + /// - Loads and calls the function "DeletePackage" of the dynamic library (responsible for package desallocation) + /// - Closes the dynamic library + /// Else : + /// - deletes the package normally + /// + /// Finally erases the package entry in the packages map + void Factory::ClosePackage(PackageMapType::iterator& i) { bbtkDebugMessageInc("Kernel",7,"Factory::ClosePackage(\"" <second.mPackage->GetName() <<"\")"<second.mDynamicLibraryHandler) - { - - // If it is a dynamically loaded package - // Loads the Package delete function - - std::string delfname(i->second.mPackage->GetName()); - delfname += "DeletePackage"; + + // Removes this from the set of factories which use the package + i->second.mPackage->RemoveFactory(this); + + // If no more factory which use it + if (i->second.mPackage->GetFactorySet().empty()) + { + // If it is a dynamically loaded package + if (i->second.mDynamicLibraryHandler) + { + + + // Loads the Package delete function + + std::string delfname(i->second.mPackage->GetName()); + delfname += "DeletePackage"; #if defined(__GNUC__) - void *delf = dlsym(i->second.mDynamicLibraryHandler, delfname.c_str()); - if (!delf) - { - bbtkError("could not close package \"" - <second.mPackage->GetName() - <<"\" :"<second.mDynamicLibraryHandler, delfname.c_str()); + if (!delf) + { + bbtkError("could not close package \"" + <second.mPackage->GetName() + <<"\" :"<second.mDynamicLibraryHandler, - delfname.c_str()); - if (!delf) - { - bbtkError("could not close package \"" - <second.mPackage->GetName() - <<"\" : "<second.mDynamicLibraryHandler, + delfname.c_str()); + if (!delf) + { + bbtkError("could not close package \"" + <second.mPackage->GetName() + <<"\" : "<second.mDynamicLibraryHandler); + dlclose(i->second.mDynamicLibraryHandler); #elif defined(_WIN32) - - FreeLibrary(i->second.mDynamicLibraryHandler); + + FreeLibrary(i->second.mDynamicLibraryHandler); #endif - } - else - { - // If it is a manually inserted package - delete i->second.mPackage; - } + } - // remove the entry in the map - mPackageMap.erase(i); - bbtkDebugDecTab("Kernel",7); - } - //=================================================================== + else + { + // If it is a manually inserted package : delete it normally + delete i->second.mPackage; + } + } + + // in any cases remove the entry in the map + mPackageMap.erase(i); + bbtkDebugDecTab("Kernel",7); + } + //=================================================================== + //=================================================================== @@ -614,12 +624,12 @@ namespace bbtk bbtkDebugMessageInc("Kernel",9,"Factory::InsertPackage(\""<< p->GetName()<<"\")"<AddFactory(this); PackageInfoType pack; pack.mDynamicLibraryHandler = 0; - pack.mPackage = p; - mPackageMap[p->GetName()] = pack; + bbtkDebugDecTab("Kernel",9); } //=================================================================== @@ -639,12 +649,12 @@ namespace bbtk if (i!=mPackageMap.end()) { - ClosePackage(i); + ClosePackage(i); } else { - bbtkError("Factory::RemovePackage(\""<< - p->GetName()<<"\") : package absent from factory"); + bbtkError("Factory::RemovePackage(\""<< + p->GetName()<<"\") : package absent from factory"); } bbtkDebugDecTab("Kernel",9); @@ -721,53 +731,7 @@ namespace bbtk <bbGetName()<<"\",\""<bbGetOutputType(output).name() ); - std::string t2 ( to->bbGetInputType(input).name() ); - - - if ( t1 == t2 ) - //from->bbGetOutputType(output) == - // to->bbGetInputType(input) ) - { - c = new Connection(from,output,to,input); - } - else - { - // std::cout << "Adaptive connection "<bbGetName() + "." + output + "-" - + to->bbGetName() + "." + input; - - BlackBox* b = 0; - PackageMapType::const_iterator i; - for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i ) - { - b = i->second.mPackage->NewAdaptor(from->bbGetOutputType(output), - to->bbGetInputType(input), - name); - if (b) break; - } - if (!b) - { - bbtkError("did not find any <" - <bbGetOutputType(output)) - <<"> to <" - <bbGetInputType(input)) - <<"> adaptor"); - } - c = new AdaptiveConnection(from,output,to,input,b); - } - bbtkDebugDecTab("Kernel",7); - - return c; - */ + return new Connection(from,output,to,input,this); } //===================================================================