fix mt-mapperd pithos read bug. plus some minor fixes
[archipelago] / xseg / xtypes / xlock.h
1 #ifndef _XLOCK_H
2 #define _XLOCK_H
3
4 #define MFENCE() __sync_synchronize()
5 #define BARRIER() __asm__ __volatile__ ("" ::: "memory")
6 #define __pause() __asm__ __volatile__ ("pause\n");
7 #undef __pause
8 #define __pause()
9
10 #define Noone ((unsigned long)-1)
11
12 struct xlock {
13         long owner;
14 } __attribute__ ((aligned (16))); /* support up to 128bit longs */
15
16 static inline unsigned long xlock_acquire(struct xlock *lock, unsigned long who)
17 {
18         for (;;) {
19                 for (; *(volatile unsigned long *)(&lock->owner) != Noone; )
20                         __pause();
21
22                 if (__sync_bool_compare_and_swap(&lock->owner, Noone, who))
23                         break;
24         }
25
26         return who;
27 }
28
29 static inline unsigned long xlock_try_lock(struct xlock *lock, unsigned long who)
30 {
31         return __sync_bool_compare_and_swap(&lock->owner, Noone, who);
32 }
33
34 static inline void xlock_release(struct xlock *lock)
35 {
36         BARRIER();
37         lock->owner = Noone;
38 }
39
40 static inline unsigned long xlock_get_owner(struct xlock *lock)
41 {
42         return *(volatile unsigned long *)(&lock->owner);
43 }
44
45 #endif