+#ifndef __EVENT_LOOP_H__
+#define __EVENT_LOOP_H__
+
+#include <pthread.h>
+
+#include "stg/noncopyable.h"
+#include "actions.h"
+
+class EVENT_LOOP : private NONCOPYABLE,
+ private ACTIONS_LIST
+{
+ public:
+ bool Start();
+ bool Stop();
+ bool IsRunning() const { return _running; }
+
+ template <class ACTIVE_CLASS, typename DATA_TYPE>
+ void Enqueue(ACTIVE_CLASS & ac,
+ typename ACTOR<ACTIVE_CLASS, DATA_TYPE>::TYPE a,
+ DATA_TYPE d);
+
+ private:
+ bool _running;
+ bool _stopped;
+ pthread_t _tid;
+ pthread_mutex_t _mutex;
+ pthread_cond_t _condition;
+
+ EVENT_LOOP();
+ virtual ~EVENT_LOOP();
+
+ static void * Run(void *);
+ void Runner();
+
+ friend class EVENT_LOOP_SINGLETON;
+};
+
+class EVENT_LOOP_SINGLETON : private NONCOPYABLE
+{
+ public:
+ static EVENT_LOOP & GetInstance();
+
+ private:
+ static EVENT_LOOP * _instance;
+ static void CreateInstance();
+
+ EVENT_LOOP_SINGLETON() {}
+ ~EVENT_LOOP_SINGLETON() {}
+};
+
+template <class ACTIVE_CLASS, typename DATA_TYPE>
+void EVENT_LOOP::Enqueue(ACTIVE_CLASS & ac,
+ typename ACTOR<ACTIVE_CLASS, DATA_TYPE>::TYPE a,
+ DATA_TYPE d)
+{
+STG_LOCKER lock(&_mutex);
+// Add new action
+ACTIONS_LIST::Enqueue(ac, a, d);
+// Signal about new action
+pthread_cond_signal(&_condition);
+}
+
+#endif