]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/plr/include/pthread_rep.h
update
[l4.git] / l4 / pkg / plr / include / pthread_rep.h
index 4fd590cf8ecd85af8874f9b340f87a9b32ee9eb6..8da18ddba4f274bf42892a7e58f4b11d28823235 100644 (file)
@@ -11,6 +11,7 @@ enum {
        pt_max_wrappers = 5,
 
        lock_entry_free = 0,
+       lock_unlocking  = 0xAAAAAAAA,
        lock_unowned    = 0xFFFFFFFF,
 
        NUM_TRAMPOLINES = 32,
@@ -22,12 +23,13 @@ enum {
 typedef struct {
   unsigned char trampolines[NUM_TRAMPOLINES * TRAMPOLINE_SIZE];
   struct {
-         l4_addr_t lockdesc;         // corresponding pthread_mutex_t ptr
-         l4_addr_t owner;            // lock owner
-         volatile l4_addr_t wait_count;  // count how many threads wait to acquire this lock
-         l4_addr_t acq_count;        // count how many threads acquired this lock
-         l4_addr_t wake_count;       // count how many threads should be unlocked
-         volatile l4_uint32_t lock;  // internal: lock for this row
+         volatile l4_addr_t lockdesc;            // corresponding pthread_mutex_t ptr
+         volatile l4_addr_t owner;               // lock owner
+         volatile l4_addr_t owner_epoch;         // lock holder's epoch
+         volatile l4_addr_t wait_count; // count how many threads wait to acquire this lock
+         volatile l4_addr_t acq_count;           // count how many threads acquired this lock
+         volatile l4_addr_t wake_count;          // count how many threads should be unlocked
+         volatile l4_uint32_t lock;     // internal: lock for this row
   } locks[NUM_LOCKS];
   volatile l4_umword_t replica_count; // number of replicas running a.t.m.
 } lock_info;
@@ -41,16 +43,19 @@ lock_info* get_lock_info(void) {
 }
 
 
-static inline void lock_li(lock_info *li, unsigned idx)
+static inline void lock_li(volatile lock_info *li, unsigned idx)
 {
-       while (l4util_cmpxchg32(&li->locks[idx].lock, 0, 1) == 0) {
-               asm volatile ("ud2" : : : "memory");
+       asm volatile ("" : : : "memory");
+       while (!l4util_cmpxchg32(&li->locks[idx].lock, 0, 1)) {
+               asm volatile ("ud2" : : : "eax", "memory");
        }
 }
 
-static inline void unlock_li(lock_info* li, unsigned idx)
+static inline void unlock_li(volatile lock_info* li, unsigned idx)
 {
+       asm volatile ("" : : : "eax", "memory");
        li->locks[idx].lock = 0;
+       asm volatile ("" ::: "memory");
 }