19 volatile unsigned int lock;
28 :
"=q"(tmp),
"=m"(lock->lock)
29 :
"0"(tmp) :
"memory");
40#if defined(__x86_64__)
41 __asm__ __volatile__(
"" : : :
"memory");
42 *(
unsigned char*)&lock->lock = 0;
47 :
"=q"(tmp),
"=m"(lock->lock)
48 :
"0"(tmp) :
"memory");
53#define INIT_LOCK(LOCK_VAR) ((LOCK_VAR) = 0)
54#define TRY_LOCK(LOCK_VAR) spin_trylock((spinlock_t *)(LOCK_VAR))
59extern int debug_locks;
60#define LOCK(LOCK_VAR) do { \
61 if (debug_locks) fprintf(stderr,"[%d] %s:%d: LOCK(%p)\n", \
62 (int)pthread_self(), \
63 __BASE_FILE__, __LINE__,&(LOCK_VAR)); \
64 if (TRY_LOCK(&(LOCK_VAR))) break; \
65 while (IS_LOCKED(LOCK_VAR)) continue; \
67#define IS_LOCKED(LOCK_VAR) ((LOCK_VAR) != 0)
68#define IS_UNLOCKED(LOCK_VAR) ((LOCK_VAR) == 0)
69#define UNLOCK(LOCK_VAR) if (debug_locks) fprintf(stderr,"[%d] %s:%d: UNLOCK(%p)\n", \
70 (int)pthread_self(), \
71 __BASE_FILE__, __LINE__,&(LOCK_VAR)); \
72 spin_unlock((spinlock_t *)&(LOCK_VAR))
74#define LOCK(LOCK_VAR) { do { \
75 if (TRY_LOCK(&(LOCK_VAR))) break; \
76 while (IS_LOCKED(LOCK_VAR)) continue; \
78#define IS_LOCKED(LOCK_VAR) ((LOCK_VAR) != 0)
79#define IS_UNLOCKED(LOCK_VAR) ((LOCK_VAR) == 0)
80#define UNLOCK(LOCK_VAR) spin_unlock((spinlock_t *)&(LOCK_VAR))
89#define RWLOCK_OFFSET (1<<24)
100 __asm__ __volatile__(
113 __asm__ __volatile__(
116 :
"m"(lock->lock),
"0"(tmp));
118 if (__builtin_expect(tmp >= 0, 1))
127 return lock->lock < 0;
134 if (__builtin_expect(read_trylock(lock) != 0, 1))
137 __asm__ __volatile__(
"rep;nop" :
"=m"(lock->lock) : :
"memory");
138 }
while (read_is_locked(lock));
145 __asm__ __volatile__(
148 :
"m"(lock->lock),
"i"(RWLOCK_OFFSET));
156 tmp = -RWLOCK_OFFSET;
157 __asm__ __volatile__(
160 :
"m"(lock->lock),
"0"(tmp));
162 if (__builtin_expect(tmp == 0, 1))
171 return lock->lock != 0;
178 if (__builtin_expect(write_trylock(lock) != 0, 1))
181 __asm__ __volatile__(
"rep;nop" :
"=m"(lock->lock) : :
"memory");
182 }
while (write_is_locked(lock));
186#define INIT_RWLOCK(lock) init_rwlock(&(lock))
187#define READ_LOCK(lock) read_lock(&(lock))
188#define READ_UNLOCK(lock) read_unlock(&(lock))
189#define WRITE_LOCK(lock) write_lock(&(lock))
190#define WRITE_UNLOCK(lock) write_unlock(&(lock))
199#define MUTEX_LOCK(LOCK_VAR) ((debug_locks ? fprintf(stderr,"[%d] %s:%d: MULOCK(%p)\n", (int)pthread_self(), \
200 __BASE_FILE__, __LINE__,(LOCK_VAR)) : 1), \
201 pthread_mutex_lock((LOCK_VAR)) )
202#define MUTEX_TRYLOCK(LOCK_VAR) pthread_mutex_trylock(LOCK_VAR)
203#define MUTEX_UNLOCK(LOCK_VAR) if ((debug_locks ? fprintf(stderr,"[%d] %s:%d: MUNLOCK(%p)\n", (int)pthread_self(), \
204 __BASE_FILE__, __LINE__,(LOCK_VAR)) : 1), \
205 pthread_mutex_unlock((LOCK_VAR)) )
207#define MUTEX_LOCK(LOCK_VAR) pthread_mutex_lock(LOCK_VAR)
208#define MUTEX_TRYLOCK(LOCK_VAR) pthread_mutex_trylock(LOCK_VAR)
209#define MUTEX_UNLOCK(LOCK_VAR) pthread_mutex_unlock(LOCK_VAR)
214#define MUTEX_LOCK(LOCK_VAR)
215#define MUTEX_TRYLOCK(LOCK_VAR)
216#define MUTEX_UNLOCK(LOCK_VAR)