OpenWalnut
1.4.0
|
00001 //--------------------------------------------------------------------------- 00002 // 00003 // Project: OpenWalnut ( http://www.openwalnut.org ) 00004 // 00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS 00006 // For more information see http://www.openwalnut.org/copying 00007 // 00008 // This file is part of OpenWalnut. 00009 // 00010 // OpenWalnut is free software: you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as published by 00012 // the Free Software Foundation, either version 3 of the License, or 00013 // (at your option) any later version. 00014 // 00015 // OpenWalnut is distributed in the hope that it will be useful, 00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 // GNU Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public License 00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>. 00022 // 00023 //--------------------------------------------------------------------------- 00024 00025 #include "../common/WLogger.h" 00026 00027 #include "WKernel.h" 00028 #include "WModuleContainer.h" 00029 00030 #include "WModuleCombiner.h" 00031 00032 WModuleCombiner::WModuleCombiner( boost::shared_ptr< WModuleContainer > target ): 00033 WThreadedRunner(), 00034 m_container( target ) 00035 { 00036 // initialize members 00037 } 00038 00039 WModuleCombiner::WModuleCombiner(): 00040 m_container( WKernel::getRunningKernel()->getRootContainer() ) 00041 { 00042 // initialize members 00043 } 00044 00045 WModuleCombiner::~WModuleCombiner() 00046 { 00047 // cleanup 00048 } 00049 00050 void WModuleCombiner::run() 00051 { 00052 // the module needs to be added here, as it else could be freed before the thread finishes ( remember: it is a shared_ptr). 00053 m_container->addPendingThread( shared_from_this() ); 00054 00055 // actually run 00056 WThreadedRunner::run(); 00057 } 00058 00059 void WModuleCombiner::threadMain() 00060 { 00061 try 00062 { 00063 apply(); 00064 } 00065 catch( ... ) 00066 { 00067 wlog::error( "ModuleCombiner" ) << "Exception thrown. Aborting module combiner."; 00068 } 00069 00070 // remove from list of threads 00071 m_container->finishedPendingThread( shared_from_this() ); 00072 } 00073