summaryrefslogtreecommitdiff
path: root/source/api_wrappers
diff options
context:
space:
mode:
Diffstat (limited to 'source/api_wrappers')
-rw-r--r--source/api_wrappers/linux/CEventObject.cpp51
-rw-r--r--source/api_wrappers/linux/CEventObject.h2
-rw-r--r--source/api_wrappers/linux/CSemaphore.cpp48
-rw-r--r--source/api_wrappers/linux/CSemaphore.h2
-rw-r--r--source/api_wrappers/linux/CSemaphoreQueue.cpp4
-rw-r--r--source/api_wrappers/linux/CThreadWrapper.cpp10
-rw-r--r--source/api_wrappers/linux/CThreadWrapper.h3
-rw-r--r--source/api_wrappers/linux/CWaitableObjectCollection.cpp13
-rw-r--r--source/api_wrappers/linux/OS.cpp18
-rw-r--r--source/api_wrappers/linux/Types.h3
-rw-r--r--source/api_wrappers/linux/sdf0
11 files changed, 109 insertions, 45 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;
}
diff --git a/source/api_wrappers/linux/CEventObject.h b/source/api_wrappers/linux/CEventObject.h
index 9c86087..987b33e 100644
--- a/source/api_wrappers/linux/CEventObject.h
+++ b/source/api_wrappers/linux/CEventObject.h
@@ -33,7 +33,7 @@ public:
void UnsetEvent();
DWORD Wait(DWORD dwTimeout = INFINITE);
private:
- sem_t m_sem;
+ sem_t *m_sem;
};
#endif /* _CEVENTOBJECT_H */
diff --git a/source/api_wrappers/linux/CSemaphore.cpp b/source/api_wrappers/linux/CSemaphore.cpp
index 0246091..5dae856 100644
--- a/source/api_wrappers/linux/CSemaphore.cpp
+++ b/source/api_wrappers/linux/CSemaphore.cpp
@@ -3,21 +3,33 @@
* License terms: 3-clause BSD license
******************************************************************************/
-#include <errno.h>
+#include <sys/errno.h>
#include <semaphore.h>
#include <sys/time.h>
+#include <fcntl.h>
#include "Types.h"
#include "CSemaphore.h"
#include "OS.h"
+
CSemaphore::CSemaphore(unsigned int initial_count)
{
- sem_init(&m_semaphore, 0, initial_count);
+ 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_semaphore = sem_open(sem_name, O_CREAT | O_EXCL, 0666 , 0);
+ if (m_semaphore != SEM_FAILED)
+ break;
+ sem_nr++;
+ }
}
CSemaphore::~CSemaphore()
{
- sem_destroy(&m_semaphore);
+ sem_close(m_semaphore);
}
bool CSemaphore::Release(unsigned int count)
@@ -27,7 +39,7 @@ bool CSemaphore::Release(unsigned int count)
}
for (unsigned int i = 0; i < count; ++i) {
- if (sem_post(&m_semaphore)) {
+ if (sem_post(m_semaphore)) {
return false;
}
}
@@ -38,15 +50,33 @@ bool CSemaphore::Release(unsigned int count)
DWORD CSemaphore::Wait(DWORD timeout)
{
if (INFINITE == timeout) {
- sem_wait(&m_semaphore);
+ sem_wait(m_semaphore);
} else {
- timespec absoulute_time = OS::GetAbsoluteTime(timeout);
+ struct timeval curr_time, start_time;
+ DWORD dwTimePassed = 0;
int ret;
- /* coverity[returned_null] */
- while (-1 == (ret = sem_timedwait(&m_semaphore, &absoulute_time)) && errno == EINTR);
+ gettimeofday(&start_time, NULL);
+
+ /* Try to lock the semaphore */
+ ret = sem_trywait(m_semaphore);
+ if (ret != 0) {
+ while (dwTimePassed < timeout) {
+ /* Sleep 1ms */
+ OS::Sleep(1);
+
+ /* Try to lock the semaphore again*/
+ ret = sem_trywait(m_semaphore);
+ 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;
+ }
- if (0 != ret) {
return WAIT_TIMEOUT;
}
}
diff --git a/source/api_wrappers/linux/CSemaphore.h b/source/api_wrappers/linux/CSemaphore.h
index 24af4ad..0abe5dd 100644
--- a/source/api_wrappers/linux/CSemaphore.h
+++ b/source/api_wrappers/linux/CSemaphore.h
@@ -19,7 +19,7 @@ public:
DWORD Wait(DWORD timeout = INFINITE);
private:
- sem_t m_semaphore;
+ sem_t* m_semaphore;
};
#endif /* _CSEMAPHORE_H */
diff --git a/source/api_wrappers/linux/CSemaphoreQueue.cpp b/source/api_wrappers/linux/CSemaphoreQueue.cpp
index 0a2f573..448b4ee 100644
--- a/source/api_wrappers/linux/CSemaphoreQueue.cpp
+++ b/source/api_wrappers/linux/CSemaphoreQueue.cpp
@@ -13,7 +13,7 @@
CSemaphoreQueue::CSemaphoreQueue(unsigned int MaxCount) : m_MaximumCount(MaxCount)
{
m_pEventObject = new CEventObject();
- m_pSemaphore = new CSemaphore();
+ m_pSemaphore = new CSemaphore(0);
m_ObjectCollection.Add(m_pEventObject);
m_ObjectCollection.Add(m_pSemaphore);
@@ -62,6 +62,7 @@ RemoveResult CSemaphoreQueue::RemoveHead(void **ppObject, size_t mSecTimeout)
} else {
// Should never occur
assert(false);
+
return REMOVE_CANCEL;;
}
}
@@ -99,6 +100,7 @@ void CSemaphoreQueue::AddToQueueTail(void *pObject)
void *CSemaphoreQueue::RemoveFromQueueHead()
{
void *Object;
+
Object = m_Queue[m_CurrentHead];
IncrementHead();
return Object;
diff --git a/source/api_wrappers/linux/CThreadWrapper.cpp b/source/api_wrappers/linux/CThreadWrapper.cpp
index 4fe9362..5d38fcf 100644
--- a/source/api_wrappers/linux/CThreadWrapper.cpp
+++ b/source/api_wrappers/linux/CThreadWrapper.cpp
@@ -35,6 +35,7 @@ CThreadWrapper::CThreadWrapper(void *(*pStartAddress)(void *), void *pArgument)
m_pStartAddress = pStartAddress;
m_pArgument = pArgument;
m_tid = (pthread_t)0;
+ m_ThreadEndedEvt = new CEventObject();
}
// ******************************************************************************
@@ -44,6 +45,7 @@ CThreadWrapper::CThreadWrapper(void *(*pStartAddress)(void *), void *pArgument)
// ******************************************************************************
CThreadWrapper::~CThreadWrapper()
{
+ delete m_ThreadEndedEvt;
}
// ******************************************************************************
@@ -53,8 +55,8 @@ CThreadWrapper::~CThreadWrapper()
// ******************************************************************************
DWORD CThreadWrapper::Wait(DWORD dwMilliseconds)
{
- if ((int)m_tid != 0) {
- return m_ThreadEndedEvt.Wait(dwMilliseconds);
+ if (m_tid != 0) {
+ return m_ThreadEndedEvt->Wait(dwMilliseconds);
} else {
return WAIT_OBJECT_0;
}
@@ -102,7 +104,7 @@ void *CThreadWrapper::ThreadFunc(void *arg)
pthis->m_pStartAddress(pthis->m_pArgument);
// Thread has finished, set appropriate event here
- pthis->m_ThreadEndedEvt.SetEvent();
+ pthis->m_ThreadEndedEvt->SetEvent();
pthread_detach(pthread_self());
pthis->m_tid = (pthread_t)0;
return NULL;
@@ -115,5 +117,5 @@ void *CThreadWrapper::ThreadFunc(void *arg)
// ******************************************************************************
DWORD CThreadWrapper::GetThreadId()
{
- return (DWORD)m_tid;
+ return (long long)m_tid;
}
diff --git a/source/api_wrappers/linux/CThreadWrapper.h b/source/api_wrappers/linux/CThreadWrapper.h
index e02a6e8..9e0e473 100644
--- a/source/api_wrappers/linux/CThreadWrapper.h
+++ b/source/api_wrappers/linux/CThreadWrapper.h
@@ -10,6 +10,7 @@
#include "CEventObject.h"
#include <pthread.h>
+
typedef void *(*StartAddress_t)(void *);
class CThreadWrapper : public CWaitableObject
@@ -26,7 +27,7 @@ private:
pthread_t m_tid;
StartAddress_t m_pStartAddress;
void *m_pArgument;
- CEventObject m_ThreadEndedEvt;
+ CEventObject *m_ThreadEndedEvt;
protected:
static void *ThreadFunc(void *Arg);
diff --git a/source/api_wrappers/linux/CWaitableObjectCollection.cpp b/source/api_wrappers/linux/CWaitableObjectCollection.cpp
index e48fd1c..9b47bbc 100644
--- a/source/api_wrappers/linux/CWaitableObjectCollection.cpp
+++ b/source/api_wrappers/linux/CWaitableObjectCollection.cpp
@@ -9,6 +9,7 @@
#include "Types.h"
#include "CWaitableObjectCollection.h"
#include <assert.h>
+#include <sys/time.h>
CWaitableObjectCollection::CWaitableObjectCollection()
{
@@ -30,11 +31,9 @@ CWaitableObject *CWaitableObjectCollection::Wait(DWORD dwTimeout)
vector<CWaitableObject *>::iterator it;
DWORD dwTimePassed = 0;
struct timespec ts;
- struct timespec curr_time, start_time;
+ struct timeval curr_time, start_time;
- if (-1 == clock_gettime(CLOCK_REALTIME, &start_time)) {
- return NULL;
- }
+ gettimeofday(&start_time, NULL);
do {
for (it = m_objs.begin(); it != m_objs.end(); ++it) {
@@ -54,12 +53,10 @@ CWaitableObject *CWaitableObjectCollection::Wait(DWORD dwTimeout)
// coverity[returned_null]
while (-1 == nanosleep(&ts, &ts) && EINTR == errno);
- if (-1 == clock_gettime(CLOCK_REALTIME, &curr_time)) {
- return NULL;
- }
+ gettimeofday(&curr_time, NULL);
dwTimePassed = 1000 * (curr_time.tv_sec - start_time.tv_sec) + \
- (curr_time.tv_nsec - start_time.tv_nsec) / 1000000;
+ (curr_time.tv_usec - start_time.tv_usec) / 1000;
} while (dwTimePassed < dwTimeout);
diff --git a/source/api_wrappers/linux/OS.cpp b/source/api_wrappers/linux/OS.cpp
index 55c82bd..6ed6425 100644
--- a/source/api_wrappers/linux/OS.cpp
+++ b/source/api_wrappers/linux/OS.cpp
@@ -5,6 +5,7 @@
#include <time.h>
#include <errno.h>
+#include <sys/time.h>
#include "Types.h"
#include "OS.h"
@@ -31,29 +32,30 @@ void OS::Sleep(DWORD dwMilliseconds)
time_t OS::GetSystemTimeInMs()
{
- timespec systemTime;
- clock_gettime(CLOCK_REALTIME, &systemTime);
- return (systemTime.tv_sec * 1000) + (systemTime.tv_nsec / 1000000);
+ struct timeval current_time;
+
+ gettimeofday(&current_time, NULL);
+
+ return (current_time.tv_sec * 1000) + (current_time.tv_usec / 1000);
}
timespec OS::GetAbsoluteTime(DWORD dwTimeout)
{
timespec absolute_time;
- timespec current_time;
-
+ timeval current_time;
long timeout_nsec;
- clock_gettime(CLOCK_REALTIME, &current_time);
+ gettimeofday(&current_time, NULL);
absolute_time.tv_sec = current_time.tv_sec + (dwTimeout / 1000);
timeout_nsec = (dwTimeout % 1000) * 1000000L;
- if ((1000000000 - current_time.tv_nsec) < timeout_nsec) {
+ if ((1000000000 - current_time.tv_usec * 1000) < timeout_nsec) {
// overflow will occur!
absolute_time.tv_sec++;
}
- absolute_time.tv_nsec = (current_time.tv_nsec + timeout_nsec) % 1000000000;
+ absolute_time.tv_nsec = (current_time.tv_usec * 1000 + timeout_nsec) % 1000000000;
return absolute_time;
}
diff --git a/source/api_wrappers/linux/Types.h b/source/api_wrappers/linux/Types.h
index 14929b4..4f720aa 100644
--- a/source/api_wrappers/linux/Types.h
+++ b/source/api_wrappers/linux/Types.h
@@ -17,5 +17,8 @@ typedef unsigned int DWORD;
#define WINAPI
+#define SEM_NAME_MAX_LENGTH 16
+#define SEM_MAX_NR 1000
+
#endif /* _TYPES_H */
diff --git a/source/api_wrappers/linux/sdf b/source/api_wrappers/linux/sdf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/api_wrappers/linux/sdf