summaryrefslogtreecommitdiff
path: root/firmware/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r--firmware/kernel.c27
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
74struct event *queue_wait(struct event_queue *q) 74void 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
84void queue_post(struct event_queue *q, int id, void *data) 84void 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 ****************************************************************************/
197void mutex_init(struct mutex *m)
198{
199 m->count = 0;
200}
201
202void 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
212void mutex_unlock(struct mutex *m)
213{
214 m->count--;
215}