StarBoard Orange - Example application No.2 (Version 0.0.4)

Dependencies:   mbed

Committer:
shintamainjp
Date:
Fri Aug 13 11:25:40 2010 +0000
Revision:
0:5d79cd4ac81d

        

Who changed what in which revision?

UserRevisionLine numberNew 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