robert bouwens
/
TestSemaphoreProgram
testharness for my semphore class
Semaphore.h@0:a2eb037fbb76, 2010-09-14 (annotated)
- Committer:
- roberto_b
- Date:
- Tue Sep 14 20:38:26 2010 +0000
- Revision:
- 0:a2eb037fbb76
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
roberto_b | 0:a2eb037fbb76 | 1 | // Copyright (C) 2010 Robert M. Bouwens |
roberto_b | 0:a2eb037fbb76 | 2 | |
roberto_b | 0:a2eb037fbb76 | 3 | #ifndef _SEMAPHORE_H_ |
roberto_b | 0:a2eb037fbb76 | 4 | #define _SEMAPHORE_H_ |
roberto_b | 0:a2eb037fbb76 | 5 | |
roberto_b | 0:a2eb037fbb76 | 6 | /* |
roberto_b | 0:a2eb037fbb76 | 7 | * http://mbed.org/forum/mbed/topic/181/#comment-799 |
roberto_b | 0:a2eb037fbb76 | 8 | */ |
roberto_b | 0:a2eb037fbb76 | 9 | |
roberto_b | 0:a2eb037fbb76 | 10 | class Semaphore { |
roberto_b | 0:a2eb037fbb76 | 11 | public: |
roberto_b | 0:a2eb037fbb76 | 12 | Semaphore(): s(SemFree) {}; |
roberto_b | 0:a2eb037fbb76 | 13 | |
roberto_b | 0:a2eb037fbb76 | 14 | bool try_enter() { |
roberto_b | 0:a2eb037fbb76 | 15 | int oldval = __ldrex(&s); |
roberto_b | 0:a2eb037fbb76 | 16 | if (oldval == SemTaken) { |
roberto_b | 0:a2eb037fbb76 | 17 | __clrex(); |
roberto_b | 0:a2eb037fbb76 | 18 | return false; |
roberto_b | 0:a2eb037fbb76 | 19 | } |
roberto_b | 0:a2eb037fbb76 | 20 | s = SemTaken; |
roberto_b | 0:a2eb037fbb76 | 21 | __clrex(); |
roberto_b | 0:a2eb037fbb76 | 22 | return SemTaken == s; |
roberto_b | 0:a2eb037fbb76 | 23 | }; |
roberto_b | 0:a2eb037fbb76 | 24 | |
roberto_b | 0:a2eb037fbb76 | 25 | void release() { |
roberto_b | 0:a2eb037fbb76 | 26 | s = SemFree; |
roberto_b | 0:a2eb037fbb76 | 27 | }; |
roberto_b | 0:a2eb037fbb76 | 28 | |
roberto_b | 0:a2eb037fbb76 | 29 | private: |
roberto_b | 0:a2eb037fbb76 | 30 | enum { SemFree = 1, SemTaken = 2 }; |
roberto_b | 0:a2eb037fbb76 | 31 | volatile int s; |
roberto_b | 0:a2eb037fbb76 | 32 | }; |
roberto_b | 0:a2eb037fbb76 | 33 | |
roberto_b | 0:a2eb037fbb76 | 34 | #endif |