1 /* radare - LGPL - Copyright 2009-2020 - thestr4ng3r */
2 
3 #include <r_th.h>
4 
r_th_cond_new(void)5 R_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)21 R_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)29 R_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)37 R_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)45 R_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