Shinichiro Nakamura
/
TestProgramForBugTopic1074
This is for http://mbed.org/forum/bugs-suggestions/topic/1074/
Diff: Semaphore.h
- Revision:
- 1:70466efca68e
- Parent:
- 0:49c0ef6111e6
--- a/Semaphore.h Wed Sep 08 12:53:38 2010 +0000 +++ b/Semaphore.h Thu Sep 09 10:21:06 2010 +0000 @@ -8,25 +8,21 @@ class Semaphore { public: Semaphore(): s(SemFree) {} - - bool take(bool block = true) { - int oldval; - do { - oldval = __ldrex(&s); - } while ((block && oldval == SemTaken) || __strex(SemTaken, &s) != 0); - if (!block) { - __clrex(); + bool try_enter() { + int oldval = __ldrex(&s); + if (oldval == SemTaken) { + return false; } - return (oldval == SemFree); + __strex(SemTaken, &s); + return true; } - void release() { + __strex(SemFree, &s); s = SemFree; } - private: enum { SemFree, SemTaken }; - int s; + volatile int s; }; #endif \ No newline at end of file