SUMO - Simulation of Urban MObility
|
00001 /* ========================================================================= 00002 * included modules 00003 * ======================================================================= */ 00004 #ifdef _MSC_VER 00005 #include <windows_config.h> 00006 #else 00007 #include <config.h> 00008 #endif 00009 00010 #include <utils/common/StdDefs.h> 00011 #include "MFXInterThreadEventClient.h" 00012 #include "FXSingleEventThread.h" 00013 #include "fxexdefs.h" 00014 #ifndef WIN32 00015 #include <pthread.h> 00016 #include <stdlib.h> 00017 #include <unistd.h> 00018 #else 00019 #include <process.h> 00020 #endif 00021 00022 #ifdef CHECK_MEMORY_LEAKS 00023 #include <foreign/nvwa/debug_new.h> 00024 #endif 00025 00026 #ifndef WIN32 00027 # define PIPE_READ 0 00028 # define PIPE_WRITE 1 00029 #endif 00030 00031 using namespace FXEX; 00032 00033 // Message map 00034 FXDEFMAP(FXSingleEventThread) FXSingleEventThreadMap[] = { 00035 FXMAPFUNC(SEL_IO_READ, FXSingleEventThread::ID_THREAD_EVENT, FXSingleEventThread::onThreadSignal), 00036 FXMAPFUNC(SEL_THREAD, 0, FXSingleEventThread::onThreadEvent), 00037 }; 00038 FXIMPLEMENT(FXSingleEventThread, FXObject, FXSingleEventThreadMap, ARRAYNUMBER(FXSingleEventThreadMap)) 00039 00040 00041 00042 FXSingleEventThread::FXSingleEventThread(FXApp* a, MFXInterThreadEventClient* client) 00043 : FXObject(), myClient(client) { 00044 myApp = (a); 00045 #ifndef WIN32 00046 FXMALLOC(&event, FXThreadEventHandle, 2); 00047 FXint res = pipe(event); 00048 FXASSERT(res == 0); 00049 myApp->addInput(event[PIPE_READ], INPUT_READ, this, ID_THREAD_EVENT); 00050 #else 00051 event = CreateEvent(NULL, FALSE, FALSE, NULL); 00052 FXASSERT(event != NULL); 00053 myApp->addInput(event, INPUT_READ, this, ID_THREAD_EVENT); 00054 #endif 00055 } 00056 00057 00058 FXSingleEventThread::~FXSingleEventThread() { 00059 #ifndef WIN32 00060 myApp->removeInput(event[PIPE_READ], INPUT_READ); 00061 ::close(event[PIPE_READ]); 00062 ::close(event[PIPE_WRITE]); 00063 FXFREE(&event); 00064 #else 00065 myApp->removeInput(event, INPUT_READ); 00066 ::CloseHandle(event); 00067 #endif 00068 } 00069 00070 00071 void 00072 FXSingleEventThread::signal() { 00073 FXuint seltype = SEL_THREAD; 00074 #ifndef WIN32 00075 ::write(event[PIPE_WRITE], &seltype, sizeof(seltype)); 00076 #else 00077 ::SetEvent(event); 00078 #endif 00079 } 00080 00081 00082 void 00083 FXSingleEventThread::signal(FXuint seltype) { 00084 UNUSED_PARAMETER(seltype); 00085 #ifndef WIN32 00086 ::write(event[PIPE_WRITE], &seltype, sizeof(seltype)); 00087 #else 00088 ::SetEvent(event); 00089 #endif 00090 } 00091 00092 00093 long 00094 FXSingleEventThread::onThreadSignal(FXObject*, FXSelector, void*) { 00095 FXuint seltype = SEL_THREAD; 00096 #ifndef WIN32 00097 ::read(event[PIPE_READ], &seltype, sizeof(seltype)); 00098 #else 00099 //FIXME need win32 support 00100 #endif 00101 FXSelector sel = FXSEL(SEL_THREAD, 0); 00102 handle(this, sel, 0); 00103 return 0; 00104 } 00105 00106 00107 long 00108 FXSingleEventThread::onThreadEvent(FXObject*, FXSelector , void*) { 00109 myClient->eventOccured(); 00110 /* 00111 FXuint seltype1 = FXSELTYPE(SEL_THREAD); 00112 if(myTarget && myTarget->handle(this,FXSEL(seltype1,mySelector),NULL)) { 00113 } 00114 FXuint seltype = FXSELTYPE(sel); 00115 return myTarget && myTarget->handle(this,FXSEL(seltype,mySelector),NULL); 00116 */ 00117 return 1; 00118 } 00119 00120 00121 void 00122 FXSingleEventThread::sleep(long ms) { 00123 #ifdef WIN32 00124 Sleep(ms); 00125 #else 00126 long long us = ms * 1000; 00127 usleep(us); 00128 #endif 00129 } 00130 00131 00132