This is for http://mbed.org/forum/bugs-suggestions/topic/1074/

Dependencies:   mbed

Revision:
0:49c0ef6111e6
Child:
1:70466efca68e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Semaphore.h	Wed Sep 08 12:53:38 2010 +0000
@@ -0,0 +1,32 @@
+#ifndef _SEMAPHORE_H_
+#define _SEMAPHORE_H_
+
+/*
+ * http://mbed.org/forum/mbed/topic/181/#comment-799
+ */
+
+class Semaphore {
+public:
+    Semaphore(): s(SemFree) {}
+
+    bool take(bool block = true) {
+        int oldval;
+        do {
+            oldval = __ldrex(&s);
+        } while ((block && oldval == SemTaken) || __strex(SemTaken, &s) != 0);
+        if (!block) {
+            __clrex();
+        }
+        return (oldval == SemFree);
+    }
+
+    void release() {
+        s = SemFree;
+    }
+
+private:
+    enum { SemFree, SemTaken };
+    int s;
+};
+
+#endif
\ No newline at end of file