diff options
Diffstat (limited to 'source/api_wrappers/linux/CEventObject.cpp')
-rw-r--r-- | source/api_wrappers/linux/CEventObject.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/source/api_wrappers/linux/CEventObject.cpp b/source/api_wrappers/linux/CEventObject.cpp new file mode 100644 index 0000000..5f5acda --- /dev/null +++ b/source/api_wrappers/linux/CEventObject.cpp @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (C) ST-Ericsson SA 2011 + * License terms: 3-clause BSD license + ******************************************************************************/ + +#include <errno.h> +#include <sys/time.h> + +#include "Types.h" +#include "CEventObject.h" +#include "OS.h" + +// ****************************************************************************** +// Name: CEventObject() +// Desc: CEventObject constructor which initializes the m_sem member +// Ret: +// ****************************************************************************** +CEventObject::CEventObject() +{ + sem_init(&m_sem, 0, 0); +} + +// ****************************************************************************** +// Name: ~CEventObject() +// Desc: CEventObject destructor +// Ret: +// ****************************************************************************** +CEventObject::~CEventObject() +{ + sem_destroy(&m_sem); +} + +// ****************************************************************************** +// Name: SetEvent() +// Desc: Sets an event by post-ing the member semaphore m_sem +// Ret: +// ****************************************************************************** +void CEventObject::SetEvent() +{ + sem_post(&m_sem); +} + +// ****************************************************************************** +// Name: Wait() +// Desc: implementation of the pure virtual base class member Wait() +// Ret: WAIT_OBJECT_0 when event occurs, or WAIT_TIMEOUT on timeout +// ****************************************************************************** +DWORD CEventObject::Wait(DWORD dwTimeout) +{ + if (INFINITE == dwTimeout) { + sem_wait(&m_sem); + return WAIT_OBJECT_0; + } else { + timespec absolute_time = OS::GetAbsoluteTime(dwTimeout); + int ret; + + /* coverity[returned_null] */ + while (-1 == (ret = sem_timedwait(&m_sem, &absolute_time)) && errno == EINTR); + + if (0 == ret) { + return WAIT_OBJECT_0; + } else { + return WAIT_TIMEOUT; + } + } +} |