00001 00002 #include "Core/precomp.h" 00003 #include "event_listener_unix.h" 00004 #include "event_trigger_unix.h" 00005 #include "API/Core/System/system.h" 00006 00007 #include <sys/time.h> 00008 #include <sys/types.h> 00009 #include <unistd.h> 00010 00012 // CL_EventListener_Unix construction: 00013 00014 CL_EventListener_Unix::CL_EventListener_Unix(CL_EventListener *owner) 00015 : 00016 CL_EventListener_Generic(owner) 00017 { 00018 } 00019 00020 CL_EventListener_Unix::~CL_EventListener_Unix() 00021 { 00022 } 00023 00025 // CL_EventListener_Unix implementation: 00026 00027 bool CL_EventListener_Unix::wait(int timeout) 00028 { 00029 if (triggers.empty()) // no triggers, just do the sleep. 00030 { 00031 CL_System::sleep(timeout); 00032 return false; 00033 } 00034 00035 fd_set rfds; 00036 FD_ZERO(&rfds); 00037 int highest_fd = -1; 00038 00039 std::list<CL_EventTrigger_Generic *>::iterator it; 00040 for (it = triggers.begin(); it != triggers.end(); it++) 00041 { 00042 CL_EventTrigger_Unix *trigger = static_cast<CL_EventTrigger_Unix*>(*it); 00043 00044 if (trigger->wait_pipe[0] > highest_fd) highest_fd = trigger->wait_pipe[0]; 00045 FD_SET(trigger->wait_pipe[0], &rfds); 00046 } 00047 00048 timeval tv; 00049 tv.tv_sec = 0; 00050 tv.tv_usec = timeout; 00051 00052 int result = select( 00053 highest_fd+1, 00054 &rfds, 00055 NULL, 00056 NULL, 00057 (timeout == 1) ? NULL : &tv); 00058 00059 if (result <= 0) return false; 00060 return true; 00061 }
1.2.6 written by Dimitri van Heesch,
© 1997-2001