00001 00002 #ifndef CSignalsMTControler_hpp 00003 #define CSignalsMTControler_hpp 00004 00005 /* 00006 * Descripcion: Controlador de señales para aplicación MT. 00007 * Se evita el que un handle se llame más de una vez (una por thread). 00008 * Habrá un metodo que deberá correr en un thread y se encargará de tratar 00009 * las señales. 00010 * Notas: 00011 * - No es MT safe (no se puede usar de manera segura en mas de un thread) 00012 * - En una aplicación MT si instalamos este manejador así de manera global 00013 * Cada uno de los threads va a recibir la señal (al menos en Linux) 00014 * - Esta implementación no se puede usar como singleton (tiene un metodo de inicialiación 00015 * aparte del constructor 00016 * 00017 * 00018 */ 00019 00020 #include <ace/Singleton.h> 00021 #include <ace/Signal.h> // definición de NSIG 00022 #include "jic/signal/CSignalHandle.hpp" 00023 #include "jic/signal/CSignalsControler.hpp" 00024 #include <ace/Synch.h> 00025 00026 namespace SIGNAL 00027 { 00028 00029 class CSignalsMTControler : public CSignalsControler 00030 { 00031 public: 00032 00033 virtual CSignalHandle *registerHandler(int sigNum,CSignalHandle *signalHandler); 00034 virtual CSignalHandle *removeHandler(int sigNum); 00035 00036 friend class ACE_Unmanaged_Singleton<CSignalsMTControler, ACE_SYNCH_MUTEX>; // Investigar porque 00037 // esto no tiene efecto (1) 00038 CSignalsMTControler(); // Si (1) tuviese efecto este constructor sería privado/protegido, lo cual sería 00039 // lo suyo @ 00040 00041 protected: 00042 static void * entryPoint(void *arg); 00043 static void dispatcher(int sigNum); 00044 00045 private: 00046 static ACE_Thread_Mutex m_mutex; // Asegura que los cambios sobre los booleanos de 00047 // las activaciones se hagan de manera correcta 00048 static bool m_signalActivated[NSIG]; 00049 00050 }; 00051 00052 typedef ACE_Unmanaged_Singleton<CSignalsMTControler, ACE_SYNCH_MUTEX> SignalsMTControler; // El objeto Singleton 00053 00054 00055 } /* SIGNAL */ 00056 00057 #endif