00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _MPCL_EVENT_THREADED_EVENT_HANDLER__
00030 #define _MPCL_EVENT_THREADED_EVENT_HANDLER__
00031
00032 #include <mpcl/event/event_handler.hh>
00033 #include <mpcl/system/all.hh>
00034
00035
00037 namespace mpcl
00038 {
00039
00041 namespace event
00042 {
00043
00049 template <typename TEvent>
00050 class TThreadedEventHandler :
00051 public TEventHandler<TEvent> ,
00052 public mpcl::system::TThread
00053 {
00054
00055 private:
00056
00061 mutable mpcl::system::TMutex tMutex;
00062
00063
00064 public:
00065
00066
00067
00068
00069
00071 TThreadedEventHandler (void) :
00072 TEventHandler<TEvent> () ,
00073 TThread () ,
00074 tMutex () {}
00075
00081 TEvent pop (void)
00082 {
00083 TEvent tEvent;
00084
00085 tMutex.lock();
00086 tEvent = TEventHandler<TEvent>::pop();
00087 tMutex.unlock();
00088 return tEvent;
00089 }
00090
00096 void push (const TEvent& rktSOURCE_EVENT)
00097 {
00098 tMutex.lock();
00099 TEventHandler<TEvent>::push (rktSOURCE_EVENT);
00100 tMutex.unlock();
00101 }
00102
00103
00104 public:
00105
00106
00107
00108
00109
00115 bool isEmpty (void) const
00116 {
00117 bool gIsEmpty;
00118
00119 tMutex.lock();
00120 gIsEmpty = TEventHandler<TEvent>::isEmpty();
00121 tMutex.unlock();
00122 return gIsEmpty;
00123 }
00124
00125 };
00126
00127 }
00128
00129 }
00130
00131
00132 #endif // not _MPCL_EVENT_THREADED_EVENT_HANDLER__