00001 00002 #include "Core/precomp.h" 00003 #include "event_trigger_unix.h" 00004 00005 #include <sys/time.h> 00006 #include <sys/types.h> 00007 #include <unistd.h> 00008 00010 // CL_EventTrigger_Unix construction: 00011 00012 CL_EventTrigger_Unix::CL_EventTrigger_Unix() 00013 { 00014 pipe(wait_pipe); 00015 } 00016 00017 CL_EventTrigger_Unix::~CL_EventTrigger_Unix() 00018 { 00019 close(wait_pipe[0]); 00020 close(wait_pipe[1]); 00021 } 00022 00024 // CL_EventTrigger_Unix attributes: 00025 00026 bool CL_EventTrigger_Unix::get_flag() const 00027 { 00028 return wait(0); 00029 } 00030 00032 // CL_EventTrigger_Unix operations: 00033 00034 void CL_EventTrigger_Unix::reset() const 00035 { 00036 char v = 0; 00037 while (wait(0)) read(wait_pipe[0], &v, 1); 00038 } 00039 00040 void CL_EventTrigger_Unix::set_flag() 00041 { 00042 char v = 1; 00043 if (!wait(0)) write(wait_pipe[1], &v, 1); 00044 } 00045 00046 bool CL_EventTrigger_Unix::wait(int timeout) const 00047 { 00048 fd_set rfds; 00049 FD_ZERO(&rfds); 00050 FD_SET(wait_pipe[0], &rfds); 00051 00052 timeval tv; 00053 tv.tv_sec = 0; 00054 tv.tv_usec = timeout; 00055 00056 int result = select(wait_pipe[0]+1, &rfds, NULL, NULL, (timeout == 1) ? NULL : &tv); 00057 if (result <= 0) return false; 00058 00059 return true; 00060 } 00061 00063 // CL_EventTrigger_Unix implementation:
1.2.6 written by Dimitri van Heesch,
© 1997-2001