Shinichiro Nakamura
/
TestProgramForBugTopic1074
This is for http://mbed.org/forum/bugs-suggestions/topic/1074/
Semaphore.h@1:70466efca68e, 2010-09-09 (annotated)
- Committer:
- shintamainjp
- Date:
- Thu Sep 09 10:21:06 2010 +0000
- Revision:
- 1:70466efca68e
- Parent:
- 0:49c0ef6111e6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shintamainjp | 0:49c0ef6111e6 | 1 | #ifndef _SEMAPHORE_H_ |
shintamainjp | 0:49c0ef6111e6 | 2 | #define _SEMAPHORE_H_ |
shintamainjp | 0:49c0ef6111e6 | 3 | |
shintamainjp | 0:49c0ef6111e6 | 4 | /* |
shintamainjp | 0:49c0ef6111e6 | 5 | * http://mbed.org/forum/mbed/topic/181/#comment-799 |
shintamainjp | 0:49c0ef6111e6 | 6 | */ |
shintamainjp | 0:49c0ef6111e6 | 7 | |
shintamainjp | 0:49c0ef6111e6 | 8 | class Semaphore { |
shintamainjp | 0:49c0ef6111e6 | 9 | public: |
shintamainjp | 0:49c0ef6111e6 | 10 | Semaphore(): s(SemFree) {} |
shintamainjp | 1:70466efca68e | 11 | bool try_enter() { |
shintamainjp | 1:70466efca68e | 12 | int oldval = __ldrex(&s); |
shintamainjp | 1:70466efca68e | 13 | if (oldval == SemTaken) { |
shintamainjp | 1:70466efca68e | 14 | return false; |
shintamainjp | 0:49c0ef6111e6 | 15 | } |
shintamainjp | 1:70466efca68e | 16 | __strex(SemTaken, &s); |
shintamainjp | 1:70466efca68e | 17 | return true; |
shintamainjp | 0:49c0ef6111e6 | 18 | } |
shintamainjp | 0:49c0ef6111e6 | 19 | void release() { |
shintamainjp | 1:70466efca68e | 20 | __strex(SemFree, &s); |
shintamainjp | 0:49c0ef6111e6 | 21 | s = SemFree; |
shintamainjp | 0:49c0ef6111e6 | 22 | } |
shintamainjp | 0:49c0ef6111e6 | 23 | private: |
shintamainjp | 0:49c0ef6111e6 | 24 | enum { SemFree, SemTaken }; |
shintamainjp | 1:70466efca68e | 25 | volatile int s; |
shintamainjp | 0:49c0ef6111e6 | 26 | }; |
shintamainjp | 0:49c0ef6111e6 | 27 | |
shintamainjp | 0:49c0ef6111e6 | 28 | #endif |