2 #include <ddekit/condvar.h>
3 #include <ddekit/lock.h>
4 #include <ddekit/memory.h>
5 #include <ddekit/panic.h>
6 #include <ddekit/semaphore.h>
8 #ifdef DDEBUG_LEVEL_SEMAPHORE
10 #define DDEBUG DDEBUG_LEVEL_SEMAPHORE
18 ddekit_thread_t
*wait_queue
;
21 #define SEM_DEBUG(p) \
23 DDEBUG_MSG_VERBOSE("%s, %p, %d\n",__func__, sem, sem->count); \
26 /*****************************************************************************
28 *************************+**************************************************/
29 ddekit_sem_t
*ddekit_sem_init(int value
)
33 sem
= (ddekit_sem_t
*) ddekit_simple_malloc(sizeof(ddekit_sem_t
));
36 sem
->wait_queue
= NULL
;
42 /*****************************************************************************
44 ****************************************************************************/
45 void ddekit_sem_deinit(ddekit_sem_t
*sem
)
48 ddekit_simple_free(sem
);
51 /*****************************************************************************
53 ****************************************************************************/
54 void ddekit_sem_down(ddekit_sem_t
*sem
)
58 if(sem
->wait_queue
== NULL
) {
59 sem
->wait_queue
= ddekit_thread_myself();
61 ddekit_thread_t
*pos
= sem
->wait_queue
;
62 while(pos
->next
!= NULL
) {
65 pos
->next
= ddekit_thread_myself();
67 _ddekit_thread_schedule();
73 /*****************************************************************************
74 * ddekit_sem_down_try *
75 ****************************************************************************/
76 int ddekit_sem_down_try(ddekit_sem_t
*sem
)
85 /*****************************************************************************
87 ****************************************************************************/
88 void ddekit_sem_up(ddekit_sem_t
*sem
)
91 if (sem
->wait_queue
== NULL
) {
95 ddekit_thread_t
*waiter
= sem
->wait_queue
;
96 sem
->wait_queue
= waiter
->next
;
98 _ddekit_thread_enqueue(waiter
);
99 ddekit_thread_schedule();
103 /****************************************************************************
104 * ddekit_sem_down_timed *
105 ***************************************************************************/
106 int ddekit_sem_down_timed(ddekit_sem_t
*sem
, int timo
)
108 ddekit_panic("not implemented!");