X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2F3ds%2Fpthread.h;h=4c58fe5ea8434fccc27d843d830b23138ae14190;hb=03f41c38234fece3e1b4efefb9f4efb381e24b46;hp=cc3c965462614b680725a05188d22599e23def4f;hpb=a34093eb63d1645fd2de9b412efe2587df9fdb3f;p=pcsx_rearmed.git diff --git a/frontend/3ds/pthread.h b/frontend/3ds/pthread.h index cc3c9654..4c58fe5e 100644 --- a/frontend/3ds/pthread.h +++ b/frontend/3ds/pthread.h @@ -11,20 +11,26 @@ #define CTR_PTHREAD_STACK_SIZE 0x10000 #define FALSE 0 -typedef int32_t pthread_t; -typedef int pthread_attr_t; - -typedef LightLock pthread_mutex_t; -typedef int pthread_mutexattr_t; - typedef struct { uint32_t semaphore; LightLock lock; uint32_t waiting; -} pthread_cond_t; +} cond_t; + +#if !defined(PTHREAD_SCOPE_PROCESS) +/* An earlier version of devkitARM does not define the pthread types. Can remove in r54+. */ + +typedef uint32_t pthread_t; +typedef int pthread_attr_t; +typedef LightLock pthread_mutex_t; +typedef int pthread_mutexattr_t; + +typedef uint32_t pthread_cond_t; typedef int pthread_condattr_t; +#endif + static inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg) { @@ -80,41 +86,56 @@ static inline int pthread_mutex_destroy(pthread_mutex_t *mutex) { } static inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) { - if (svcCreateSemaphore(&cond->semaphore, 0, 1)) + cond_t *cond_data = calloc(1, sizeof(cond_t)); + if (!cond_data) goto error; - LightLock_Init(&cond->lock); - cond->waiting = 0; + if (svcCreateSemaphore(&cond_data->semaphore, 0, 1)) + goto error; + + LightLock_Init(&cond_data->lock); + cond_data->waiting = 0; + *cond = cond_data; return 0; error: - svcCloseHandle(cond->semaphore); + svcCloseHandle(cond_data->semaphore); + if (cond_data) + free(cond_data); return -1; } static inline int pthread_cond_signal(pthread_cond_t *cond) { int32_t count; - LightLock_Lock(&cond->lock); - if (cond->waiting) { - cond->waiting--; - svcReleaseSemaphore(&count, cond->semaphore, 1); + cond_t *cond_data = (cond_t *)*cond; + LightLock_Lock(&cond_data->lock); + if (cond_data->waiting) { + cond_data->waiting--; + svcReleaseSemaphore(&count, cond_data->semaphore, 1); } - LightLock_Unlock(&cond->lock); + LightLock_Unlock(&cond_data->lock); return 0; } static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *lock) { - LightLock_Lock(&cond->lock); - cond->waiting++; + cond_t *cond_data = (cond_t *)*cond; + LightLock_Lock(&cond_data->lock); + cond_data->waiting++; LightLock_Unlock(lock); - LightLock_Unlock(&cond->lock); - svcWaitSynchronization(cond->semaphore, INT64_MAX); + LightLock_Unlock(&cond_data->lock); + svcWaitSynchronization(cond_data->semaphore, INT64_MAX); LightLock_Lock(lock); return 0; } static inline int pthread_cond_destroy(pthread_cond_t *cond) { - svcCloseHandle(cond->semaphore); + if (*cond) { + cond_t *cond_data = (cond_t *)*cond; + + svcCloseHandle(cond_data->semaphore); + free(*cond); + } + *cond = 0; return 0; }