diff options
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r-- | firmware/kernel.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 8474126a0d..c6ac1fb7aa 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -71,14 +71,14 @@ void queue_init(struct event_queue *q) | |||
71 | q->write = 0; | 71 | q->write = 0; |
72 | } | 72 | } |
73 | 73 | ||
74 | struct event *queue_wait(struct event_queue *q) | 74 | void queue_wait(struct event_queue *q, struct event *ev) |
75 | { | 75 | { |
76 | while(q->read == q->write) | 76 | while(q->read == q->write) |
77 | { | 77 | { |
78 | switch_thread(); | 78 | switch_thread(); |
79 | } | 79 | } |
80 | 80 | ||
81 | return &q->events[(q->read++) & QUEUE_LENGTH_MASK]; | 81 | *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK]; |
82 | } | 82 | } |
83 | 83 | ||
84 | void queue_post(struct event_queue *q, int id, void *data) | 84 | void queue_post(struct event_queue *q, int id, void *data) |
@@ -190,3 +190,26 @@ int tick_remove_task(void (*f)(void)) | |||
190 | set_irq_level(oldlevel); | 190 | set_irq_level(oldlevel); |
191 | return -1; | 191 | return -1; |
192 | } | 192 | } |
193 | |||
194 | /**************************************************************************** | ||
195 | * Simple mutex functions | ||
196 | ****************************************************************************/ | ||
197 | void mutex_init(struct mutex *m) | ||
198 | { | ||
199 | m->count = 0; | ||
200 | } | ||
201 | |||
202 | void mutex_lock(struct mutex *m) | ||
203 | { | ||
204 | /* Wait until the lock is open... */ | ||
205 | while(m->count) | ||
206 | yield(); | ||
207 | |||
208 | /* ...and lock it */ | ||
209 | m->count++; | ||
210 | } | ||
211 | |||
212 | void mutex_unlock(struct mutex *m) | ||
213 | { | ||
214 | m->count--; | ||
215 | } | ||