33 #include "../common/WLogger.h"
34 #include "../common/WThreadedRunner.h"
35 #include "../common/exceptions/WSignalSubscriptionFailed.h"
36 #include "WBatchLoader.h"
37 #include "WModuleCombiner.h"
38 #include "WModuleFactory.h"
39 #include "WModuleInputConnector.h"
40 #include "WModuleOutputConnector.h"
41 #include "WModuleTypes.h"
42 #include "combiner/WApplyCombiner.h"
43 #include "exceptions/WModuleAlreadyAssociated.h"
44 #include "exceptions/WModuleUninitialized.h"
45 #include "WDataModule.h"
47 #include "WModuleContainer.h"
52 m_description( description ),
53 m_crashIfModuleCrashes( true )
86 "ModuleContainer (" +
getName() +
")", LL_INFO );
88 if( !module->isInitialized()() )
91 s <<
"Could not add module \"" << module->getName() <<
"\" to container \"" +
getName() +
"\". Reason: module not initialized.";
97 if( module->getAssociatedContainer() == shared_from_this() )
100 "ModuleContainer (" +
getName() +
")", LL_INFO );
105 if( module->isAssociated()() )
107 module->getAssociatedContainer()->remove( module );
112 wlock->get().insert( module );
115 module->setAssociatedContainer( boost::static_pointer_cast< WModuleContainer >( shared_from_this() ) );
126 boost::signals2::connection signalCon = module->subscribeSignal( WM_ERROR, func );
130 boost::shared_lock<boost::shared_mutex> slock = boost::shared_lock<boost::shared_mutex>(
m_errorNotifiersLock );
133 signalCon = module->subscribeSignal( WM_ERROR, ( *iter ) );
147 for( InputConnectorList::const_iterator ins = module->getInputConnectors().begin(); ins != module->getInputConnectors().end(); ++ins )
149 signalCon = ( *ins )->subscribeSignal( CONNECTION_ESTABLISHED, ( *iter ) );
157 for( InputConnectorList::const_iterator ins = module->getInputConnectors().begin(); ins != module->getInputConnectors().end(); ++ins )
159 signalCon = ( *ins )->subscribeSignal( CONNECTION_CLOSED, ( *iter ) );
166 signalCon = module->subscribeSignal( WM_READY, ( *iter ) );
172 subscriptionsLock.reset();
175 m_progress->addSubProgress( module->getRootProgressCombiner() );
192 module->isReady().wait();
204 if( module->getAssociatedContainer() != shared_from_this() )
210 module->disconnect();
213 m_progress->removeSubProgress( module->getRootProgressCombiner() );
219 std::pair< ModuleSubscriptionsIterator, ModuleSubscriptionsIterator > subscriptions = subscriptionsLock->get().equal_range( module );
223 ( *it ).second.disconnect();
226 subscriptionsLock->get().erase( subscriptions.first, subscriptions.second );
227 subscriptionsLock.reset();
231 wlock->get().erase( module );
234 module->setAssociatedContainer( boost::shared_ptr< WModuleContainer >() );
237 boost::shared_lock<boost::shared_mutex> slock = boost::shared_lock<boost::shared_mutex>(
m_removedNotifiersLock );
257 if( ( *iter )->getType() == MODULE_DATA )
259 boost::shared_ptr< WDataModule > dm = boost::static_pointer_cast<
WDataModule >( *iter );
262 if( dm->isReady()() )
277 boost::shared_lock<boost::shared_mutex> slock = boost::shared_lock<boost::shared_mutex>(
m_pendingThreadsLock );
281 ( *listIter )->wait(
true );
290 for(
ModuleConstIterator listIter = lock->get().begin(); listIter != lock->get().end(); ++listIter )
293 "ModuleContainer (" +
getName() +
")", LL_INFO );
294 ( *listIter )->wait(
true );
295 ( *listIter )->setAssociatedContainer( boost::shared_ptr< WModuleContainer >() );
302 wlock->get().clear();
317 boost::unique_lock<boost::shared_mutex> lock;
336 std::ostringstream s;
337 s <<
"Could not subscribe to unknown signal.";
345 boost::unique_lock<boost::shared_mutex> lock;
354 std::ostringstream s;
355 s <<
"Could not subscribe to unknown signal.";
363 boost::unique_lock<boost::shared_mutex> lock;
366 case CONNECTION_ESTABLISHED:
371 case CONNECTION_CLOSED:
377 std::ostringstream s;
378 s <<
"Could not subscribe to unknown signal.";
386 boost::shared_ptr< WModule >prototype = boost::shared_ptr< WModule >();
405 boost::shared_ptr< WModule > prototype )
408 if( applyOn->isAssociated()() && ( applyOn->getAssociatedContainer() != shared_from_this() ) )
411 std::string(
"\" is associated with another container." ) );
419 applyOn->isReadyOrCrashed().wait();
420 m->isReadyOrCrashed().wait();
431 if( !ins.empty() && !outs.empty() )
433 ( *ins.begin() )->connect( ( *outs.begin() ) );
442 boost::shared_ptr< WBatchLoader > t = boost::shared_ptr< WBatchLoader >(
new WBatchLoader( filenames,
443 boost::static_pointer_cast< WModuleContainer >( shared_from_this() ) )
445 t->setSuppressColormaps( suppressColormaps );
453 boost::shared_ptr< WBatchLoader > t = boost::shared_ptr< WBatchLoader >(
new WBatchLoader( filenames,
454 boost::static_pointer_cast< WModuleContainer >( shared_from_this() ) )
456 t->setSuppressColormaps( suppressColormaps );
464 boost::unique_lock<boost::shared_mutex> lock = boost::unique_lock<boost::shared_mutex>(
m_pendingThreadsLock );
471 boost::unique_lock<boost::shared_mutex> lock = boost::unique_lock<boost::shared_mutex>(
m_pendingThreadsLock );
478 errorLog() <<
"Error in module \"" << module->getName() <<
"\". Forwarding to nesting container.";
485 infoLog() <<
"Crash caused this container to shutdown.";
510 for(
ModuleConstIterator listIter = lock->get().begin(); listIter != lock->get().end(); ++listIter )
513 if( name == ( *listIter )->getName() )
515 result.push_back( ( *listIter ) );
524 WCombinerTypes::WCompatiblesList complist;
536 for(
ModuleConstIterator listIter = lock->get().begin(); listIter != lock->get().end(); ++listIter )
538 WCombinerTypes::WOneToOneCombiners lComp = WApplyCombiner::createCombinerList< WApplyCombiner>( module, ( *listIter ) );
540 if( lComp.size() != 0 )
542 complist.push_back( WCombinerTypes::WCompatiblesGroup( ( *listIter ), lComp ) );
547 std::sort( complist.begin(), complist.end(), WCombinerTypes::compatiblesSort );