SUMO - Simulation of Urban MObility
FXSingleEventThread.cpp
Go to the documentation of this file.
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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines