1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-10 13:23:41 +00:00

1. Added sem_timedwait to macos

2. Added Workaround for pthread_timedjoin_np() for macos
This commit is contained in:
Bryan Roe
2020-04-21 16:22:39 -07:00
parent b8358a32f2
commit 6cfd62ed42
2 changed files with 70 additions and 4 deletions

View File

@@ -372,6 +372,17 @@ void ILibDispatchSemaphore_trywait(sem_t* s)
{
dispatch_semaphore_wait(((dispatch_semaphore_t*)s)[0], DISPATCH_TIME_NOW);
}
int ILibDispatchSemaphore_timedwait(sem_t* s, struct timespec *ts)
{
struct timeval tv;
gettimeofday(&tv, NULL);
uint64_t seconds = ts->tv_sec - tv.tv_sec;
uint64_t ns = ts->tv_nsec - (tv.tv_usec * 1000);
uint64_t delta = ns + (seconds * 1000000000);
return((int)dispatch_semaphore_wait(((dispatch_semaphore_t*)s)[0], dispatch_time(DISPATCH_TIME_NOW, (int64_t)delta)));
}
void ILibDispatchSemaphore_post(sem_t* s)
{
dispatch_semaphore_signal(((dispatch_semaphore_t*)s)[0]);
@@ -9412,6 +9423,31 @@ void ILIBLOGMESSAGEX(char *format, ...)
ILIBLOGMESSSAGE(dest);
}
#ifdef __APPLE__
typedef struct ILibThread_AppleThread
{
pthread_t tid;
voidfp1 method;
void *arg;
int joinable;
sem_t s;
}ILibThread_AppleThread;
void* ILibThread_AppleThread_Start(void *arg)
{
ILibThread_AppleThread *apple = (ILibThread_AppleThread*)arg;
apple->method(apple->arg);
if (apple->joinable != 0)
{
sem_post(&(apple->s));
}
else
{
ILibMemory_Free(apple);
}
return(NULL);
}
#endif
//! Platform Agnostic method to Spawn a detached worker thread with normal priority/affinity
/*!
\param method Handler to dispatch on the new thread
@@ -9420,15 +9456,25 @@ void ILIBLOGMESSAGEX(char *format, ...)
*/
void* ILibSpawnNormalThreadEx(voidfp1 method, void* arg, int detached)
{
#if defined (_POSIX) || defined (__APPLE__)
#if defined (_POSIX)
intptr_t result;
void* (*fptr) (void* a);
pthread_t newThread;
fptr = (void*(*)(void*))method;
#if defined(__APPLE__)
ILibThread_AppleThread *ret = (ILibThread_AppleThread*)ILibMemory_SmartAllocate(sizeof(ILibThread_AppleThread));
ret->method = method; ret->arg = arg;
if (detached != 0) { sem_init(&(ret->s), 0, 0); ret->joinable = 1; }
result = (intptr_t)pthread_create(&newThread, NULL, ILibThread_AppleThread_Start, ret);
ret->tid = newThread;
if (detached != 0) { pthread_detach(newThread); }
return(ret);
#else
result = (intptr_t)pthread_create(&newThread, NULL, fptr, arg);
if (detached != 0) { pthread_detach(newThread); }
return(result == 0 ? (void*)newThread : NULL);
#endif
#endif
#ifdef WIN32
return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)method, arg, 0, NULL );
@@ -9442,7 +9488,18 @@ void* ILibSpawnNormalThreadEx(voidfp1 method, void* arg, int detached)
#ifndef WIN32
int ILibThread_TimedJoinEx(void *thr, struct timespec* timeout)
{
#ifdef __APPLE__
int ret = 1;
if (ILibMemory_CanaryOK(thr) && ((ILibThread_AppleThread*)thr)->joinable != 0)
{
ILibThread_AppleThread *ath = (ILibThread_AppleThread*)thr;
if ((ret = sem_timedwait(&(ath->s), timeout)) == 0) { sem_destroy(&(ath->s)); }
ILibMemory_Free(thr);
}
return(ret);
#else
return(pthread_timedjoin_np((pthread_t)thr, NULL, timeout));
#endif
}
struct timespec *ILibThread_ms2ts(uint32_t ms, struct timespec *ts)
{
@@ -9450,7 +9507,7 @@ struct timespec *ILibThread_ms2ts(uint32_t ms, struct timespec *ts)
long lv;
gettimeofday(&tv, NULL);
ts->tv_sec = tv.tv_sec + (ms / 1000);
ts->tv_sec = tv.tv_sec;
ts->tv_nsec = tv.tv_usec * 1000;
ts->tv_sec += (ms / 1000);
@@ -9480,8 +9537,15 @@ void ILibThread_Join(void *thr)
#ifdef WIN32
WaitForSingleObject((HANDLE)thr, INFINITE);
#else
void *r;
pthread_join((pthread_t)thr, &r);
#ifdef __APPLE__
if (ILibMemory_CanaryOK(thr) && ((ILibThread_AppleThread*)thr)->joinable!=0)
{
pthread_join(((ILibThread_AppleThread*)thr)->tid, NULL);
ILibMemory_Free(thr);
}
#else
pthread_join((pthread_t)thr, NULL);
#endif
#endif
}

View File

@@ -143,10 +143,12 @@ struct sockaddr_in6;
#define sem_wait(x) ILibDispatchSemaphore_wait(x)
#define sem_trywait(x) ILibDispatchSemaphore_trywait(s)
#define sem_post(x) ILibDispatchSemaphore_post(x)
#define sem_timedwait(x, timeout) ILibDispatchSemaphore_timedwait(x, timeout)
void ILibDispatchSemaphore_Init(sem_t* s, int pShared, int value);
void ILibDispatchSemaphore_Destroy(sem_t* s);
void ILibDispatchSemaphore_wait(sem_t* s);
void ILibDispatchSemaphore_trywait(sem_t* s);
int ILibDispatchSemaphore_timedwait(sem_t *x, struct timespec *timeout);
void ILibDispatchSemaphore_post(sem_t* s);
#endif