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

Dependencies:   mbed

Revision:
1:70466efca68e
Parent:
0:49c0ef6111e6
--- a/Semaphore.h	Wed Sep 08 12:53:38 2010 +0000
+++ b/Semaphore.h	Thu Sep 09 10:21:06 2010 +0000
@@ -8,25 +8,21 @@
 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();
+    bool try_enter() {
+        int oldval = __ldrex(&s);
+        if (oldval == SemTaken) {
+            return false;
         }
-        return (oldval == SemFree);
+        __strex(SemTaken, &s);
+        return true;
     }
-
     void release() {
+        __strex(SemFree, &s);
         s = SemFree;
     }
-
 private:
     enum { SemFree, SemTaken };
-    int s;
+    volatile int s;
 };
 
 #endif
\ No newline at end of file