forked RemoteIR
Fork of RemoteIR by
Semaphore.h@0:ec264f4ce158, 2010-08-17 (annotated)
- Committer:
- shintamainjp
- Date:
- Tue Aug 17 08:50:54 2010 +0000
- Revision:
- 0:ec264f4ce158
- Child:
- 9:dcfdac59ef74
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shintamainjp | 0:ec264f4ce158 | 1 | #ifndef _SEMAPHORE_H_ |
shintamainjp | 0:ec264f4ce158 | 2 | #define _SEMAPHORE_H_ |
shintamainjp | 0:ec264f4ce158 | 3 | |
shintamainjp | 0:ec264f4ce158 | 4 | /* |
shintamainjp | 0:ec264f4ce158 | 5 | * http://mbed.org/forum/mbed/topic/181/#comment-799 |
shintamainjp | 0:ec264f4ce158 | 6 | */ |
shintamainjp | 0:ec264f4ce158 | 7 | |
shintamainjp | 0:ec264f4ce158 | 8 | class Semaphore { |
shintamainjp | 0:ec264f4ce158 | 9 | public: |
shintamainjp | 0:ec264f4ce158 | 10 | Semaphore(): s(SemFree) {} |
shintamainjp | 0:ec264f4ce158 | 11 | |
shintamainjp | 0:ec264f4ce158 | 12 | bool take(bool block = true) { |
shintamainjp | 0:ec264f4ce158 | 13 | int oldval; |
shintamainjp | 0:ec264f4ce158 | 14 | do { |
shintamainjp | 0:ec264f4ce158 | 15 | oldval = __ldrex(&s); |
shintamainjp | 0:ec264f4ce158 | 16 | } while ((block && oldval == SemTaken) || __strex(SemTaken, &s) != 0); |
shintamainjp | 0:ec264f4ce158 | 17 | if (!block) { |
shintamainjp | 0:ec264f4ce158 | 18 | __clrex(); |
shintamainjp | 0:ec264f4ce158 | 19 | } |
shintamainjp | 0:ec264f4ce158 | 20 | return (oldval == SemFree); |
shintamainjp | 0:ec264f4ce158 | 21 | } |
shintamainjp | 0:ec264f4ce158 | 22 | |
shintamainjp | 0:ec264f4ce158 | 23 | void release() { |
shintamainjp | 0:ec264f4ce158 | 24 | s = SemFree; |
shintamainjp | 0:ec264f4ce158 | 25 | } |
shintamainjp | 0:ec264f4ce158 | 26 | |
shintamainjp | 0:ec264f4ce158 | 27 | private: |
shintamainjp | 0:ec264f4ce158 | 28 | enum { SemFree, SemTaken }; |
shintamainjp | 0:ec264f4ce158 | 29 | int s; |
shintamainjp | 0:ec264f4ce158 | 30 | }; |
shintamainjp | 0:ec264f4ce158 | 31 | |
shintamainjp | 0:ec264f4ce158 | 32 | #endif |