diff options
Diffstat (limited to 'source/api_wrappers/linux/CEventObject.cpp')
-rw-r--r-- | source/api_wrappers/linux/CEventObject.cpp | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/source/api_wrappers/linux/CEventObject.cpp b/source/api_wrappers/linux/CEventObject.cpp index 5f5acda..6c0f6c3 100644 --- a/source/api_wrappers/linux/CEventObject.cpp +++ b/source/api_wrappers/linux/CEventObject.cpp @@ -5,7 +5,8 @@ #include <errno.h> #include <sys/time.h> - +#include <fcntl.h> +#include <time.h> #include "Types.h" #include "CEventObject.h" #include "OS.h" @@ -17,7 +18,17 @@ // ****************************************************************************** CEventObject::CEventObject() { - sem_init(&m_sem, 0, 0); + char sem_name[SEM_NAME_MAX_LENGTH]; + int sem_nr = 1; + while(sem_nr <= SEM_MAX_NR) { + snprintf(sem_name, SEM_NAME_MAX_LENGTH, "lcdriversem_%d", sem_nr); + + /* open semaphore with "rw" permissions for everyone - 0666 */ + m_sem = sem_open(sem_name, O_CREAT | O_EXCL, 0666 , 0); + if (m_sem != SEM_FAILED) + break; + sem_nr++; + } } // ****************************************************************************** @@ -27,7 +38,7 @@ CEventObject::CEventObject() // ****************************************************************************** CEventObject::~CEventObject() { - sem_destroy(&m_sem); + sem_close(m_sem); } // ****************************************************************************** @@ -37,7 +48,7 @@ CEventObject::~CEventObject() // ****************************************************************************** void CEventObject::SetEvent() { - sem_post(&m_sem); + sem_post(m_sem); } // ****************************************************************************** @@ -48,19 +59,35 @@ void CEventObject::SetEvent() DWORD CEventObject::Wait(DWORD dwTimeout) { if (INFINITE == dwTimeout) { - sem_wait(&m_sem); - return WAIT_OBJECT_0; + sem_wait(m_sem); } else { - timespec absolute_time = OS::GetAbsoluteTime(dwTimeout); + struct timeval curr_time, start_time; + DWORD dwTimePassed = 0; int ret; - /* coverity[returned_null] */ - while (-1 == (ret = sem_timedwait(&m_sem, &absolute_time)) && errno == EINTR); + gettimeofday(&start_time, NULL); + + /* Try to lock the semaphore */ + ret = sem_trywait(m_sem); + if (ret != 0) { + while (dwTimePassed < dwTimeout) { + /* Sleep 1ms */ + OS::Sleep(1); - if (0 == ret) { - return WAIT_OBJECT_0; - } else { + /* Try to lock the semaphore again*/ + ret = sem_trywait(m_sem); + if (ret == 0) { + return WAIT_OBJECT_0; + } + + gettimeofday(&curr_time, NULL); + + dwTimePassed = 1000 * (curr_time.tv_sec - start_time.tv_sec) + \ + (curr_time.tv_usec - start_time.tv_usec) / 1000; + } return WAIT_TIMEOUT; } } + + return WAIT_OBJECT_0; } |