Merge pull request #391 from justinweiss/async-cd-reads
[pcsx_rearmed.git] / frontend / 3ds / pthread.h
1
2 #ifndef _3DS_PTHREAD_WRAP__
3 #define _3DS_PTHREAD_WRAP__
4
5 #include <stdlib.h>
6 #include <string.h>
7 #include <stdio.h>
8
9 #include "3ds_utils.h"
10
11 #define CTR_PTHREAD_STACK_SIZE 0x10000
12 #define FALSE 0
13
14 typedef int32_t pthread_t;
15 typedef int pthread_attr_t;
16
17 typedef LightLock pthread_mutex_t;
18 typedef int pthread_mutexattr_t;
19
20 typedef struct {
21   uint32_t semaphore;
22   LightLock lock;
23   uint32_t waiting;
24 } pthread_cond_t;
25
26 typedef int pthread_condattr_t;
27
28 static inline int pthread_create(pthread_t *thread,
29       const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)
30 {
31    int procnum = -2; // use default cpu
32    bool isNew3DS;
33    APT_CheckNew3DS(&isNew3DS);
34
35    if (isNew3DS)
36      procnum = 2;
37
38    *thread = threadCreate(start_routine, arg, CTR_PTHREAD_STACK_SIZE, 0x25, procnum, FALSE);
39    return 0;
40 }
41
42
43 static inline int pthread_join(pthread_t thread, void **retval)
44 {
45    (void)retval;
46
47    if(threadJoin(thread, INT64_MAX))
48       return -1;
49
50    threadFree(thread);
51
52    return 0;
53 }
54
55
56 static inline void pthread_exit(void *retval)
57 {   
58    (void)retval;
59
60    threadExit(0);
61 }
62
63 static inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) {
64   LightLock_Init(mutex);
65   return 0;
66 }
67
68 static inline int pthread_mutex_lock(pthread_mutex_t *mutex) {
69   LightLock_Lock(mutex);
70   return 0;
71 }
72
73 static inline int pthread_mutex_unlock(pthread_mutex_t *mutex) {
74   LightLock_Unlock(mutex);
75   return 0;
76 }
77
78 static inline int pthread_mutex_destroy(pthread_mutex_t *mutex) {
79   return 0;
80 }
81
82 static inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) {
83   if (svcCreateSemaphore(&cond->semaphore, 0, 1))
84     goto error;
85
86   LightLock_Init(&cond->lock);
87   cond->waiting = 0;
88   return 0;
89
90  error:
91   svcCloseHandle(cond->semaphore);
92   return -1;
93 }
94
95 static inline int pthread_cond_signal(pthread_cond_t *cond) {
96   int32_t count;
97   LightLock_Lock(&cond->lock);
98   if (cond->waiting) {
99     cond->waiting--;
100     svcReleaseSemaphore(&count, cond->semaphore, 1);
101   }
102   LightLock_Unlock(&cond->lock);
103   return 0;
104 }
105
106 static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *lock) {
107   LightLock_Lock(&cond->lock);
108   cond->waiting++;
109   LightLock_Unlock(lock);
110   LightLock_Unlock(&cond->lock);
111   svcWaitSynchronization(cond->semaphore, INT64_MAX);
112   LightLock_Lock(lock);
113   return 0;
114 }
115
116 static inline int pthread_cond_destroy(pthread_cond_t *cond) {
117   svcCloseHandle(cond->semaphore);
118   return 0;
119 }
120
121
122 #endif //_3DS_PTHREAD_WRAP__
123