diff options
author | Martin Doege <mdoege@compuserve.com> | 2014-06-26 20:30:22 +0200 |
---|---|---|
committer | sapier <Sapier at GMX dot net> | 2014-06-29 17:27:33 +0200 |
commit | c410e9182d322a8c095ef94fbadf4d8f541e6b98 (patch) | |
tree | b4626b67e9f6f10b43395013c7a275037aa463a3 /src/jthread/pthread | |
parent | ee7af21e411d5d43ba67f4b67603f72e62b0570d (diff) | |
download | minetest-c410e9182d322a8c095ef94fbadf4d8f541e6b98.tar.gz minetest-c410e9182d322a8c095ef94fbadf4d8f541e6b98.tar.bz2 minetest-c410e9182d322a8c095ef94fbadf4d8f541e6b98.zip |
OS X compatibility fixes
Diffstat (limited to 'src/jthread/pthread')
-rw-r--r-- | src/jthread/pthread/jevent.cpp | 13 | ||||
-rw-r--r-- | src/jthread/pthread/jsemaphore.cpp | 59 |
2 files changed, 68 insertions, 4 deletions
diff --git a/src/jthread/pthread/jevent.cpp b/src/jthread/pthread/jevent.cpp index 26a6fb05c..6a45a37d2 100644 --- a/src/jthread/pthread/jevent.cpp +++ b/src/jthread/pthread/jevent.cpp @@ -29,6 +29,19 @@ #define UNUSED(expr) do { (void)(expr); } while (0) +#ifdef __MACH__ +#undef sem_t +#define sem_t semaphore_t +#undef sem_init +#define sem_init(s, p, c) semaphore_create(mach_task_self(), (s), 0, (c)) +#undef sem_wait +#define sem_wait(s) semaphore_wait(*(s)) +#undef sem_post +#define sem_post(s) semaphore_signal(*(s)) +#undef sem_destroy +#define sem_destroy(s) semaphore_destroy(mach_task_self(), *(s)) +#endif + Event::Event() { int sem_init_retval = sem_init(&sem, 0, 0); assert(sem_init_retval == 0); diff --git a/src/jthread/pthread/jsemaphore.cpp b/src/jthread/pthread/jsemaphore.cpp index ee1431065..f6d7f022f 100644 --- a/src/jthread/pthread/jsemaphore.cpp +++ b/src/jthread/pthread/jsemaphore.cpp @@ -20,13 +20,33 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <errno.h> #include <sys/time.h> #include "jthread/jsemaphore.h" +#ifdef __MACH__ +#include <unistd.h> +#endif #define UNUSED(expr) do { (void)(expr); } while (0) +#ifdef __MACH__ +#undef sem_t +#undef sem_init +#undef sem_wait +#undef sem_post +#undef sem_destroy +#define sem_t semaphore_t +#define sem_init(s, p, c) semaphore_create(mach_task_self(), (s), 0, (c)) +#define sem_wait(s) semaphore_wait(*(s)) +#define sem_post(s) semaphore_signal(*(s)) +#define sem_destroy(s) semaphore_destroy(mach_task_self(), *(s)) +pthread_mutex_t semcount_mutex; +#endif + JSemaphore::JSemaphore() { int sem_init_retval = sem_init(&m_semaphore,0,0); assert(sem_init_retval == 0); UNUSED(sem_init_retval); +#ifdef __MACH__ + semcount = 0; +#endif } JSemaphore::~JSemaphore() { @@ -45,16 +65,32 @@ void JSemaphore::Post() { int sem_post_retval = sem_post(&m_semaphore); assert(sem_post_retval == 0); UNUSED(sem_post_retval); +#ifdef __MACH__ + pthread_mutex_lock(&semcount_mutex); + semcount++; + pthread_mutex_unlock(&semcount_mutex); +#endif } void JSemaphore::Wait() { int sem_wait_retval = sem_wait(&m_semaphore); assert(sem_wait_retval == 0); UNUSED(sem_wait_retval); +#ifdef __MACH__ + pthread_mutex_lock(&semcount_mutex); + semcount--; + pthread_mutex_unlock(&semcount_mutex); +#endif } bool JSemaphore::Wait(unsigned int time_ms) { +#ifdef __MACH__ + mach_timespec_t waittime; + waittime.tv_sec = time_ms / 1000; + waittime.tv_nsec = 1000000 * (time_ms % 1000); +#else struct timespec waittime; +#endif struct timeval now; if (gettimeofday(&now, NULL) == -1) { @@ -62,15 +98,26 @@ bool JSemaphore::Wait(unsigned int time_ms) { return false; } +#ifndef __MACH__ waittime.tv_nsec = ((time_ms % 1000) * 1000 * 1000) + (now.tv_usec * 1000); waittime.tv_sec = (time_ms / 1000) + (waittime.tv_nsec / (1000*1000*1000)) + now.tv_sec; waittime.tv_nsec %= 1000*1000*1000; +#endif errno = 0; - int sem_wait_retval = sem_timedwait(&m_semaphore,&waittime); +#ifdef __MACH__ + int sem_wait_retval = semaphore_timedwait(m_semaphore, waittime); +#else + int sem_wait_retval = sem_timedwait(&m_semaphore, &waittime); +#endif if (sem_wait_retval == 0) { +#ifdef __MACH__ + pthread_mutex_lock(&semcount_mutex); + semcount--; + pthread_mutex_unlock(&semcount_mutex); +#endif return true; } else { @@ -81,10 +128,14 @@ bool JSemaphore::Wait(unsigned int time_ms) { } int JSemaphore::GetValue() { - int retval = 0; - sem_getvalue(&m_semaphore,&retval); - +#ifdef __MACH__ + pthread_mutex_lock(&semcount_mutex); + retval = semcount; + pthread_mutex_unlock(&semcount_mutex); +#else + sem_getvalue(&m_semaphore, &retval); +#endif return retval; } |