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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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