forked RemoteIR
Fork of RemoteIR by
Diff: Semaphore.h
- Revision:
- 0:ec264f4ce158
- Child:
- 9:dcfdac59ef74
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Semaphore.h Tue Aug 17 08:50:54 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