1 #include "common.h"
2
3 #include <ddekit/condvar.h>
4 #include <ddekit/lock.h>
5 #include <ddekit/memory.h>
6
7 #ifdef DDEBUG_LEVEL_CONDVAR
8 #undef DDEBUG
9 #define DDEBUG DDEBUG_LEVEL_CONDVAR
10 #endif
11
12 #include "debug.h"
13 #include "util.h"
14 #include "thread.h"
15
16 struct ddekit_condvar {
17 ddekit_thread_t * wait_queue;
18 };
19
20 /*****************************************************************************/
21 /* ddekit_condvar_init */
22 /*****************************************************************************/
ddekit_condvar_init(void)23 ddekit_condvar_t * ddekit_condvar_init(void) {
24 ddekit_condvar_t *cv;
25 cv = (ddekit_condvar_t *) ddekit_simple_malloc(sizeof(ddekit_condvar_t));
26 DDEBUG_MSG_VERBOSE("cv: %p", cv);
27 return cv;
28 }
29
30 /*****************************************************************************/
31 /* ddekit_condvar_deinit */
32 /*****************************************************************************/
ddekit_condvar_deinit(ddekit_condvar_t * cvp)33 void ddekit_condvar_deinit(ddekit_condvar_t *cvp) {
34 DDEBUG_MSG_VERBOSE("cv: %p", cvp);
35 ddekit_simple_free(cvp);
36 }
37
38 /*****************************************************************************/
39 /* ddekit_condvar_wait */
40 /*****************************************************************************/
ddekit_condvar_wait(ddekit_condvar_t * cv,ddekit_lock_t * mp)41 void ddekit_condvar_wait(ddekit_condvar_t *cv, ddekit_lock_t *mp) {
42
43 DDEBUG_MSG_VERBOSE("wait cv: %p, thread id: %d, name: %s",
44 cv, ddekit_thread_myself()->id, ddekit_thread_myself()->name);
45
46 ddekit_lock_unlock(mp);
47
48 if(cv->wait_queue == NULL) {
49 cv->wait_queue = ddekit_thread_myself();
50 } else {
51 ddekit_thread_t *pos = cv->wait_queue;
52 while(pos->next != NULL) {
53 pos = pos->next;
54 }
55 pos->next = ddekit_thread_myself();
56 }
57
58 _ddekit_thread_schedule();
59
60 DDEBUG_MSG_VERBOSE("wakeup cv: %p, thread id: %d, name: %s",
61 cv, ddekit_thread_myself()->id, ddekit_thread_myself()->name);
62
63 ddekit_lock_lock(mp);
64 }
65 /*****************************************************************************/
66 /* ddekit_condvar_wait_timed */
67 /*****************************************************************************/
ddekit_condvar_wait_timed(ddekit_condvar_t * cvp,ddekit_lock_t * mp,int timo)68 int ddekit_condvar_wait_timed
69 (ddekit_condvar_t *cvp, ddekit_lock_t *mp, int timo)
70 {
71 /*
72 * Only used by ddefbsd, so not implemented
73 */
74 WARN_UNIMPL;
75 return 0;
76 }
77
78
79 /*****************************************************************************/
80 /* ddekit_condvar_signal */
81 /*****************************************************************************/
ddekit_condvar_signal(ddekit_condvar_t * cv)82 void ddekit_condvar_signal(ddekit_condvar_t *cv)
83 {
84
85 DDEBUG_MSG_VERBOSE("cv: %p", cv);
86
87 if(cv->wait_queue) {
88 ddekit_thread_t *th = cv->wait_queue;
89 cv->wait_queue = th->next;
90 th->next = NULL;
91 _ddekit_thread_enqueue(th);
92
93 DDEBUG_MSG_VERBOSE("waking up cv: %p, thread id: %d, name: %s",
94 cv, th->id, th->name);
95 }
96 ddekit_thread_schedule();
97 }
98
99
100 /*****************************************************************************/
101 /* ddekit_condvar_broadcast */
102 /*****************************************************************************/
ddekit_condvar_broadcast(ddekit_condvar_t * cv)103 void ddekit_condvar_broadcast(ddekit_condvar_t *cv) {
104
105 DDEBUG_MSG_VERBOSE("cv: %p", cv);
106
107 while (cv->wait_queue) {
108 ddekit_thread_t *th = cv->wait_queue;
109 cv->wait_queue = th->next;
110 th->next = NULL;
111 _ddekit_thread_enqueue(th);
112
113 DDEBUG_MSG_VERBOSE("waking up cv: %p, thread id: %d, name: %s",
114 cv, th->id, th->name);
115
116 }
117 ddekit_thread_schedule();
118 }
119
120