Shinichiro Nakamura
/
TestProgramForBugTopic1074
This is for http://mbed.org/forum/bugs-suggestions/topic/1074/
Diff: Semaphore.h
- Revision:
- 0:49c0ef6111e6
- Child:
- 1:70466efca68e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Semaphore.h Wed Sep 08 12:53:38 2010 +0000 @@ -0,0 +1,32 @@ +#ifndef _SEMAPHORE_H_ +#define _SEMAPHORE_H_ + +/* + * http://mbed.org/forum/mbed/topic/181/#comment-799 + */ + +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(); + } + return (oldval == SemFree); + } + + void release() { + s = SemFree; + } + +private: + enum { SemFree, SemTaken }; + int s; +}; + +#endif \ No newline at end of file