summaryrefslogtreecommitdiff
path: root/source/api_wrappers/linux/CEventObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/api_wrappers/linux/CEventObject.cpp')
-rw-r--r--source/api_wrappers/linux/CEventObject.cpp51
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;
}