OpenWalnut  1.4.0
WModuleCombiner.cpp
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