00001 00002 #ifndef CTask_h 00003 #define CTask_h 1 00004 00005 #include <ace/Task.h> 00006 #include <ace/Synch.h> 00007 00008 #include <string> 00009 00010 // CTaskException 00011 #include "jic/exc/CTaskException.hpp" 00012 // CStateObservable 00013 #include "jic/base/CStateObservable.hpp" 00014 // STaskCounters 00015 #include "jic/task/STaskCounters.hpp" 00016 00017 namespace TASK { 00018 class CTasksControler; 00019 00020 } // namespace TASK 00021 00022 namespace TASK { 00023 00024 typedef ACE_Task<ACE_MT_SYNCH> ACE_Task; 00025 00026 typedef enum {eByControler,eByMessage} EStoppingWay; 00027 00028 // Durante la creacion de un task se indica como se para. 00029 // Teniendo dos opciones: 00030 // 00031 // - Por defecto se parará a través del CTasksControler 00032 // (singleton) 00033 // - Si se indica lo contrario se hará a través de un 00034 // mensaje de control que se enviará desde la tarea a la 00035 // cual se ha conectado. 00036 // 00037 // Notas: 00038 // - con la segunda opción se puede dar el caso de que la 00039 // tarea no se conecte. Esto es un error de programación. 00040 // - El objeto no es instanciable 00041 00042 class CTask : public ACE_Task 00043 { 00044 00045 public: 00046 CTask(); 00047 00048 CTask (std::string strName, int nThreads = 1, CTasksControler *pTaskControler = 0); 00049 00050 virtual ~CTask(); 00051 00052 void resetCounters (); 00053 00054 virtual EStoppingWay stoppingWay (); 00055 00056 virtual void start () throw (CTaskException); 00057 00058 // La parada es sincrona 00059 virtual void stop (); 00060 00061 // Especifica el tamaño de las colas 00062 void setWaterMarks (size_t high, size_t low); 00063 00064 const CStateObservable & getState (); 00065 00066 // Acctiones a realizar justo antes de una parada 00067 virtual void stopActions (); 00068 00069 // Acctiones a realizar justo al arrancar (se ejecutan una 00070 // vez arrancados todos los threads) 00071 virtual void startActions (); 00072 00073 // Acctiones a realizar justo antes de terminar el ultimo 00074 // thread. 00075 virtual void termActions (); 00076 00077 const std::string get_strName () const; 00078 00079 const int get_nNumThreads () const; 00080 00081 const CTasksControler * get_pTaskControler () const; 00082 00083 const int get_nRunningThreads () const; 00084 00085 const STaskCounters get_taskCounters () const; 00086 00087 // Additional Public Declarations 00088 00089 protected: 00090 00091 virtual void step () = 0; 00092 00093 virtual void preStoppingActions (); 00094 00095 void incInputCounter (); 00096 00097 void incOutputCounter (); 00098 00099 // Data Members for Class Attributes 00100 00101 // Flag para representar el estado en el cual se le ha 00102 // pedido parar a la tarea 00103 bool m_bToStop; 00104 00105 ACE_Thread_Mutex m_stateMutex; 00106 00107 ACE_Thread_Mutex m_countersMutex; 00108 00109 // Flag que indica si esta tarea no esta encadenada o si lo 00110 // está es la primera de la cadena. 00111 bool m_bIsHeadTask; 00112 00113 // Additional Protected Declarations 00114 00115 private: 00116 CTask(const CTask &right); 00117 00118 CTask & operator=(const CTask &right); 00119 00120 virtual int close (u_long flags = 0); 00121 00122 virtual int svc (); 00123 00124 void init (); 00125 00126 // Versión de svc para cuando la task se ejecuta en el 00127 // thread principal 00128 virtual int svcMain (); 00129 00130 // Additional Private Declarations 00131 00132 private: 00133 // Data Members for Class Attributes 00134 00135 std::string m_strName; 00136 00137 int m_nNumThreads; 00138 00139 CTasksControler *m_pTaskControler; 00140 00141 ACE_Barrier m_barrier; 00142 00143 int m_nRunningThreads; 00144 00145 // Data Members for Associations 00146 00147 STaskCounters m_taskCounters; 00148 00149 CStateObservable m_state; 00150 00151 // Additional Implementation Declarations 00152 00153 }; 00154 00155 // Class TASK::CTask 00156 00157 inline const std::string CTask::get_strName () const 00158 { 00159 return m_strName; 00160 } 00161 00162 inline const int CTask::get_nNumThreads () const 00163 { 00164 return m_nNumThreads; 00165 } 00166 00167 inline const CTasksControler * CTask::get_pTaskControler () const 00168 { 00169 return m_pTaskControler; 00170 } 00171 00172 inline const int CTask::get_nRunningThreads () const 00173 { 00174 return m_nRunningThreads; 00175 } 00176 00177 inline const STaskCounters CTask::get_taskCounters () const 00178 { 00179 return m_taskCounters; 00180 } 00181 00182 } // namespace TASK 00183 00184 #endif