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