From: Kevin O'Connor Date: Sat, 27 Feb 2010 18:49:47 +0000 (-0500) Subject: Introduce simple "mutex" locking code. X-Git-Tag: rel-0.6.0~26 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e9086652b3901df4ff29bdd5eb095d0e3b8c349a;p=seabios.git Introduce simple "mutex" locking code. Locks are not normally necessary because SeaBIOS uses a cooperative multitasking system. However, occasionally it is necessary to be able to lock a resource across yield calls. This patch introduces a simple mechanism for doing that. --- diff --git a/src/stacks.c b/src/stacks.c index a35ca3d..c783967 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -248,6 +248,26 @@ wait_threads(void) yield(); } +void +mutex_lock(struct mutex_s *mutex) +{ + ASSERT32FLAT(); + if (! CONFIG_THREADS) + return; + while (mutex->isLocked) + yield(); + mutex->isLocked = 1; +} + +void +mutex_unlock(struct mutex_s *mutex) +{ + ASSERT32FLAT(); + if (! CONFIG_THREADS) + return; + mutex->isLocked = 0; +} + /**************************************************************** * Thread preemption diff --git a/src/util.h b/src/util.h index 9f71d65..9b4fd3a 100644 --- a/src/util.h +++ b/src/util.h @@ -208,6 +208,9 @@ struct thread_info *getCurThread(void); void yield(void); void run_thread(void (*func)(void*), void *data); void wait_threads(void); +struct mutex_s { u32 isLocked; }; +void mutex_lock(struct mutex_s *mutex); +void mutex_unlock(struct mutex_s *mutex); void start_preempt(void); void finish_preempt(void); void check_preempt(void);