pt_max_wrappers = 5,
lock_entry_free = 0,
+ lock_unlocking = 0xAAAAAAAA,
lock_unowned = 0xFFFFFFFF,
NUM_TRAMPOLINES = 32,
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;
}
-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");
}