Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

CTask.hpp

Go to the documentation of this file.
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

Generated on Wed Mar 5 21:31:47 2003 for JIC by doxygen1.3-rc3