testharness for my semphore class

Dependencies:   mbed

Committer:
roberto_b
Date:
Tue Sep 14 20:38:26 2010 +0000
Revision:
0:a2eb037fbb76

        

Who changed what in which revision?

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