main_thread.h
00001 00002 /*************************************************************************** 00003 * main_thread.h - Fawkes main thread 00004 * 00005 * Created: Thu Nov 2 16:46:37 2006 00006 * Copyright 2006-2008 Tim Niemueller [www.niemueller.de] 00007 * 00008 ****************************************************************************/ 00009 00010 /* This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2 of the License, or 00013 * (at your option) any later version. A runtime exception applies to 00014 * this software (see LICENSE.GPL_WRE file mentioned below for details). 00015 * 00016 * This program is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU Library General Public License for more details. 00020 * 00021 * Read the full text in the LICENSE.GPL_WRE file in the doc directory. 00022 */ 00023 00024 #ifndef __FAWKES_MAIN_THREAD_H_ 00025 #define __FAWKES_MAIN_THREAD_H_ 00026 00027 #include <core/threading/thread.h> 00028 #include <aspect/mainloop/employer.h> 00029 #include <aspect/logger/employer.h> 00030 00031 #include <list> 00032 #include <string> 00033 00034 namespace fawkes { 00035 class ArgumentParser; 00036 class LocalBlackBoard; 00037 class Configuration; 00038 class ConfigNetworkHandler; 00039 class MultiLogger; 00040 class NetworkLogger; 00041 class Clock; 00042 class TimeWait; 00043 class AspectIniFin; 00044 class PluginManager; 00045 class Time; 00046 class PluginNetworkHandler; 00047 class InterruptibleBarrier; 00048 class Mutex; 00049 } 00050 class FawkesThreadManager; 00051 class FawkesNetworkManager; 00052 00053 class FawkesMainThread 00054 : public fawkes::Thread, 00055 public fawkes::MainLoopEmployer, 00056 public fawkes::LoggerEmployer 00057 { 00058 public: 00059 FawkesMainThread(fawkes::ArgumentParser *argp); 00060 virtual ~FawkesMainThread(); 00061 00062 virtual void once(); 00063 virtual void loop(); 00064 00065 virtual void set_mainloop_thread(fawkes::Thread *mainloop_thread); 00066 00067 virtual void add_logger(fawkes::Logger *logger); 00068 virtual void remove_logger(fawkes::Logger *logger); 00069 00070 /** Stub to see name in backtrace for easier debugging. @see Thread::run() */ 00071 protected: virtual void run() { Thread::run(); } 00072 00073 private: 00074 void destruct(); 00075 00076 fawkes::ArgumentParser *__argp; 00077 fawkes::Configuration *__config; 00078 fawkes::ConfigNetworkHandler *__config_nethandler; 00079 fawkes::LocalBlackBoard *__blackboard; 00080 fawkes::MultiLogger *__multi_logger; 00081 fawkes::NetworkLogger *__network_logger; 00082 fawkes::Clock *__clock; 00083 fawkes::TimeWait *__time_wait; 00084 fawkes::AspectIniFin *__aspect_inifin; 00085 00086 fawkes::Thread *__mainloop_thread; 00087 fawkes::Mutex *__mainloop_mutex; 00088 fawkes::InterruptibleBarrier *__mainloop_barrier; 00089 00090 FawkesThreadManager *__thread_manager; 00091 fawkes::PluginManager *__plugin_manager; 00092 fawkes::PluginNetworkHandler *__plugin_nethandler; 00093 FawkesNetworkManager *__network_manager; 00094 00095 std::list<std::string> __recovered_threads; 00096 unsigned int __desired_loop_time_usec; 00097 float __desired_loop_time_sec; 00098 unsigned int __max_thread_time_usec; 00099 unsigned int __max_thread_time_nanosec; 00100 fawkes::Time *__loop_start; 00101 fawkes::Time *__loop_end; 00102 bool __enable_looptime_warnings; 00103 }; 00104 00105 #endif

