this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Support pthread_cond_*

+61 -20
+57 -20
src/libSystem/libc/pthread.cpp
··· 77 77 return rv; 78 78 } 79 79 80 + static int InitializeMacroInitializedMutex(__darwin_pthread_mutex_t* mutex) 81 + { 82 + pthread_mutexattr_t mta; 83 + pthread_mutexattr_init(&mta); 84 + int type; 85 + 86 + switch (mutex->signature) 87 + { 88 + case __darwin_pthread_mutex_t::SIGNATURE_MACRO_INITIALIZED_R: 89 + type = PTHREAD_MUTEX_RECURSIVE; 90 + break; 91 + case __darwin_pthread_mutex_t::SIGNATURE_MACRO_INITIALIZED_E: 92 + type = PTHREAD_MUTEX_ERRORCHECK; 93 + break; 94 + case __darwin_pthread_mutex_t::SIGNATURE_MACRO_INITIALIZED: 95 + default: 96 + type = PTHREAD_MUTEX_NORMAL; 97 + } 98 + 99 + pthread_mutexattr_settype(&mta, type); 100 + 101 + return __darwin_pthread_mutex_init(mutex, &mta); 102 + } 103 + 80 104 template<typename Func, typename... Args> int AutoAllocMutexGeneric(Func f, __darwin_pthread_mutex_t* mutex, Args... args) 81 105 { 82 106 int rv; 83 107 if (mutex->signature != __darwin_pthread_mutex_t::SIGNATURE_NATIVE_INITIALIZED) 84 108 { 85 - pthread_mutexattr_t mta; 86 - pthread_mutexattr_init(&mta); 87 - int type; 88 - 89 - switch (mutex->signature) 90 - { 91 - case __darwin_pthread_mutex_t::SIGNATURE_MACRO_INITIALIZED_R: 92 - type = PTHREAD_MUTEX_RECURSIVE; 93 - break; 94 - case __darwin_pthread_mutex_t::SIGNATURE_MACRO_INITIALIZED_E: 95 - type = PTHREAD_MUTEX_ERRORCHECK; 96 - break; 97 - case __darwin_pthread_mutex_t::SIGNATURE_MACRO_INITIALIZED: 98 - default: 99 - type = PTHREAD_MUTEX_NORMAL; 100 - } 101 - 102 - pthread_mutexattr_settype(&mta, type); 103 - 104 - rv = __darwin_pthread_mutex_init(mutex, &mta); 109 + rv = InitializeMacroInitializedMutex(mutex); 105 110 if (rv) 106 111 return rv; 107 112 } ··· 207 212 int __darwin_pthread_mutex_unlock(__darwin_pthread_mutex_t* mutex) 208 213 { 209 214 return AutoAllocMutexGeneric(pthread_mutex_unlock, mutex); 215 + } 216 + 217 + int __darwin_pthread_cond_timedwait(pthread_cond_t *cond, __darwin_pthread_mutex_t* mutex, const struct timespec *abstime) 218 + { 219 + int rv; 220 + if (mutex->signature != __darwin_pthread_mutex_t::SIGNATURE_NATIVE_INITIALIZED) 221 + { 222 + rv = InitializeMacroInitializedMutex(mutex); 223 + if (rv) 224 + return rv; 225 + } 226 + 227 + rv = pthread_cond_timedwait(cond, &mutex->native, abstime); 228 + if (rv) 229 + rv = errnoLinuxToDarwin(rv); 230 + return rv; 231 + } 232 + 233 + int __darwin_pthread_cond_wait(pthread_cond_t *cond, __darwin_pthread_mutex_t* mutex) 234 + { 235 + int rv; 236 + if (mutex->signature != __darwin_pthread_mutex_t::SIGNATURE_NATIVE_INITIALIZED) 237 + { 238 + rv = InitializeMacroInitializedMutex(mutex); 239 + if (rv) 240 + return rv; 241 + } 242 + 243 + rv = pthread_cond_wait(cond, &mutex->native); 244 + if (rv) 245 + rv = errnoLinuxToDarwin(rv); 246 + return rv; 210 247 } 211 248 212 249
+4
src/libSystem/libc/pthread.h
··· 49 49 int __darwin_pthread_mutex_trylock(__darwin_pthread_mutex_t* mutex); 50 50 int __darwin_pthread_mutex_unlock(__darwin_pthread_mutex_t* mutex); 51 51 52 + // pthread_cond 53 + int __darwin_pthread_cond_timedwait(pthread_cond_t *cond, __darwin_pthread_mutex_t* mutex, const struct timespec *abstime); 54 + int __darwin_pthread_cond_wait(pthread_cond_t *cond, __darwin_pthread_mutex_t* mutex); 55 + 52 56 pid_t __darwin_pthread_mach_thread_np(pthread_t pth); 53 57 54 58 // TODO: add other pthread functions for errno translation