summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-05-16 20:57:32 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-05-16 20:57:32 +0000
commit7361340ab5eaaac90b2c8820061b540f68e5ab7d (patch)
tree87798f413f0402584b8be2b036f72ef8be547662
parenta39f566a7f5959d8a85663f0ceccfd468e67af50 (diff)
downloadrockbox-7361340ab5eaaac90b2c8820061b540f68e5ab7d.zip
rockbox-7361340ab5eaaac90b2c8820061b540f68e5ab7d.tar.gz
rockbox-7361340ab5eaaac90b2c8820061b540f68e5ab7d.tar.bz2
rockbox-7361340ab5eaaac90b2c8820061b540f68e5ab7d.tar.xz
Changed queue API. Added mutex functions
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@601 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/kernel.c27
-rw-r--r--firmware/kernel.h11
2 files changed, 35 insertions, 3 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c
index 8474126..c6ac1fb 100644
--- a/firmware/kernel.c
+++ b/firmware/kernel.c
@@ -71,14 +71,14 @@ void queue_init(struct event_queue *q)
q->write = 0;
}
-struct event *queue_wait(struct event_queue *q)
+void queue_wait(struct event_queue *q, struct event *ev)
{
while(q->read == q->write)
{
switch_thread();
}
- return &q->events[(q->read++) & QUEUE_LENGTH_MASK];
+ *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK];
}
void queue_post(struct event_queue *q, int id, void *data)
@@ -190,3 +190,26 @@ int tick_remove_task(void (*f)(void))
set_irq_level(oldlevel);
return -1;
}
+
+/****************************************************************************
+ * Simple mutex functions
+ ****************************************************************************/
+void mutex_init(struct mutex *m)
+{
+ m->count = 0;
+}
+
+void mutex_lock(struct mutex *m)
+{
+ /* Wait until the lock is open... */
+ while(m->count)
+ yield();
+
+ /* ...and lock it */
+ m->count++;
+}
+
+void mutex_unlock(struct mutex *m)
+{
+ m->count--;
+}
diff --git a/firmware/kernel.h b/firmware/kernel.h
index 951ccee..cd5539b 100644
--- a/firmware/kernel.h
+++ b/firmware/kernel.h
@@ -41,6 +41,11 @@ struct event_queue
unsigned int write;
};
+struct mutex
+{
+ int count;
+};
+
/* global tick variable */
extern long current_tick;
@@ -53,7 +58,11 @@ int tick_add_task(void (*f)(void));
int tick_remove_task(void (*f)(void));
extern void queue_init(struct event_queue *q);
-extern struct event *queue_wait(struct event_queue *q);
+extern void queue_wait(struct event_queue *q, struct event *ev);
extern void queue_post(struct event_queue *q, int id, void *data);
+extern void mutex_init(struct mutex *m);
+extern void mutex_lock(struct mutex *m);
+extern void mutex_unlock(struct mutex *m);
+
#endif