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()() )
274 const size_t nonZero = 1;
275 size_t numberOfModules = nonZero;
276 std::vector< boost::shared_ptr< WModule > > modulesToRemove;
278 while( numberOfModules != 0 )
280 modulesToRemove.clear();
284 numberOfModules = lock->get().size();
285 for(
ModuleConstIterator listIter = lock->get().begin(); listIter != lock->get().end(); ++listIter )
287 modulesToRemove.push_back( *listIter );
290 for( std::vector< boost::shared_ptr< WModule > >::iterator nameIter = modulesToRemove.begin();
291 nameIter != modulesToRemove.end();
304 boost::shared_lock<boost::shared_mutex> slock = boost::shared_lock<boost::shared_mutex>(
m_pendingThreadsLock );
308 ( *listIter )->wait(
true );
317 for(
ModuleConstIterator listIter = lock->get().begin(); listIter != lock->get().end(); ++listIter )
320 "ModuleContainer (" +
getName() +
")", LL_INFO );
321 ( *listIter )->wait(
true );
322 ( *listIter )->setAssociatedContainer( boost::shared_ptr< WModuleContainer >() );
329 wlock->get().clear();
344 boost::unique_lock<boost::shared_mutex> lock;
363 std::ostringstream s;
364 s <<
"Could not subscribe to unknown signal.";
372 boost::unique_lock<boost::shared_mutex> lock;
381 std::ostringstream s;
382 s <<
"Could not subscribe to unknown signal.";
390 boost::unique_lock<boost::shared_mutex> lock;
393 case CONNECTION_ESTABLISHED:
398 case CONNECTION_CLOSED:
404 std::ostringstream s;
405 s <<
"Could not subscribe to unknown signal.";
413 boost::shared_ptr< WModule >prototype = boost::shared_ptr< WModule >();
432 boost::shared_ptr< WModule > prototype )
435 if( applyOn->isAssociated()() && ( applyOn->getAssociatedContainer() != shared_from_this() ) )
438 std::string(
"\" is associated with another container." ) );
446 applyOn->isReadyOrCrashed().wait();
447 m->isReadyOrCrashed().wait();
458 if( !ins.empty() && !outs.empty() )
460 ( *ins.begin() )->connect( ( *outs.begin() ) );
469 boost::shared_ptr< WBatchLoader > t(
new WBatchLoader( filenames, boost::static_pointer_cast< WModuleContainer >( shared_from_this() ) ) );
470 t->setSuppressColormaps( suppressColormaps );
478 boost::shared_ptr< WBatchLoader > t(
new WBatchLoader( filenames, boost::static_pointer_cast< WModuleContainer >( shared_from_this() ) ) );
479 t->setSuppressColormaps( suppressColormaps );
487 boost::unique_lock<boost::shared_mutex> lock = boost::unique_lock<boost::shared_mutex>(
m_pendingThreadsLock );
494 boost::unique_lock<boost::shared_mutex> lock = boost::unique_lock<boost::shared_mutex>(
m_pendingThreadsLock );
501 errorLog() <<
"Error in module \"" << module->getName() <<
"\". Forwarding to nesting container.";
508 infoLog() <<
"Crash caused this container to shutdown.";
533 for(
ModuleConstIterator listIter = lock->get().begin(); listIter != lock->get().end(); ++listIter )
536 if( name == ( *listIter )->getName() )
538 result.push_back( ( *listIter ) );
547 WCombinerTypes::WCompatiblesList complist;
559 for(
ModuleConstIterator listIter = lock->get().begin(); listIter != lock->get().end(); ++listIter )
561 WCombinerTypes::WOneToOneCombiners lComp = WApplyCombiner::createCombinerList< WApplyCombiner>( module, ( *listIter ) );
563 if( lComp.size() != 0 )
565 complist.push_back( WCombinerTypes::WCompatiblesGroup( ( *listIter ), lComp ) );
570 std::sort( complist.begin(), complist.end(), WCombinerTypes::compatiblesSort );