1 /* radare - LGPL - Copyright 2009-2020 - thestr4ng3r */ 2 3 #include <r_th.h> 4 r_th_cond_new(void)5R_API RThreadCond *r_th_cond_new(void) { 6 RThreadCond *cond = R_NEW0 (RThreadCond); 7 if (!cond) { 8 return NULL; 9 } 10 #if HAVE_PTHREAD 11 if (pthread_cond_init (&cond->cond, NULL) != 0) { 12 free (cond); 13 return NULL; 14 } 15 #elif __WINDOWS__ 16 InitializeConditionVariable (&cond->cond); 17 #endif 18 return cond; 19 } 20 r_th_cond_signal(RThreadCond * cond)21R_API void r_th_cond_signal(RThreadCond *cond) { 22 #if HAVE_PTHREAD 23 pthread_cond_signal (&cond->cond); 24 #elif __WINDOWS__ 25 WakeConditionVariable (&cond->cond); 26 #endif 27 } 28 r_th_cond_signal_all(RThreadCond * cond)29R_API void r_th_cond_signal_all(RThreadCond *cond) { 30 #if HAVE_PTHREAD 31 pthread_cond_broadcast (&cond->cond); 32 #elif __WINDOWS__ 33 WakeAllConditionVariable (&cond->cond); 34 #endif 35 } 36 r_th_cond_wait(RThreadCond * cond,RThreadLock * lock)37R_API void r_th_cond_wait(RThreadCond *cond, RThreadLock *lock) { 38 #if HAVE_PTHREAD 39 pthread_cond_wait (&cond->cond, &lock->lock); 40 #elif __WINDOWS__ 41 SleepConditionVariableCS (&cond->cond, &lock->lock, INFINITE); 42 #endif 43 } 44 r_th_cond_free(RThreadCond * cond)45R_API void r_th_cond_free(RThreadCond *cond) { 46 if (!cond) { 47 return; 48 } 49 #if HAVE_PTHREAD 50 pthread_cond_destroy (&cond->cond); 51 #endif 52 free (cond); 53 } 54