eca7f442 |
/*
* fast arhitecture specific locking
*
* $Id$
*
*
*/
#ifndef fastlock_h
#define fastlock_h
#include <sched.h>
|
2781889b |
typedef volatile int fl_lock_t;
|
eca7f442 |
#define init_lock( l ) (l)=0
/*test and set lock, ret 1 if lock held by someone else, 0 otherwise*/
|
2781889b |
inline static int tsl(fl_lock_t* lock)
|
eca7f442 |
{
|
43cfbe04 |
volatile int val;
|
30f1f956 |
|
c4217e61 |
#ifdef __i386
|
cd5c8c64 |
#ifdef NOSMP
val=0;
asm volatile(
|
f9c47c02 |
" btsl $0, %1 \n\t"
|
cd5c8c64 |
" adcl $0, %0 \n\t"
|
f9c47c02 |
: "=q" (val), "=m" (*lock) : "0"(val) : "memory" /* "cc" */
|
cd5c8c64 |
);
#else
|
eca7f442 |
val=1;
asm volatile(
" xchg %b0, %1" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"
);
|
cd5c8c64 |
#endif /*NOSMP*/
|
43cfbe04 |
#elif defined __sparc
|
c4217e61 |
asm volatile(
"ldstub [%1], %0 \n\t"
|
cd5c8c64 |
#ifndef NOSMP
|
c4217e61 |
"membar #StoreStore | #StoreLoad \n\t"
|
cd5c8c64 |
#endif
|
c4217e61 |
: "=r"(val) : "r"(lock):"memory"
);
|
43cfbe04 |
#else
#error "unknown arhitecture"
|
c4217e61 |
#endif
|
43cfbe04 |
return val;
|
eca7f442 |
}
|
2781889b |
inline static void get_lock(fl_lock_t* lock)
|
eca7f442 |
{
|
30f1f956 |
#ifdef ADAPTIVE_WAIT
int i=ADAPTIVE_WAIT_LOOPS;
#endif
|
eca7f442 |
while(tsl(lock)){
|
30f1f956 |
#ifdef BUSY_WAIT
#elif defined ADAPTIVE_WAIT
if (i>0) i--;
else sched_yield();
#else
|
eca7f442 |
sched_yield();
|
30f1f956 |
#endif
|
eca7f442 |
}
}
|
2781889b |
inline static void release_lock(fl_lock_t* lock)
|
eca7f442 |
{
|
c4217e61 |
#ifdef __i386
|
43cfbe04 |
char val;
|
eca7f442 |
val=0;
asm volatile(
|
da87d067 |
" movb $0, (%0)" : /*no output*/ : "r"(lock): "memory"
/*" xchg %b0, %1" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"*/
|
bf0fab3f |
);
|
43cfbe04 |
#elif defined __sparc
|
c4217e61 |
asm volatile(
|
cd5c8c64 |
#ifndef NOSMP
|
c4217e61 |
"membar #LoadStore | #StoreStore \n\t" /*is this really needed?*/
|
cd5c8c64 |
#endif
|
c4217e61 |
"stb %%g0, [%0] \n\t"
: /*no output*/
: "r" (lock)
: "memory"
|
eca7f442 |
);
|
43cfbe04 |
#else
#error "unknown arhitecture"
|
c4217e61 |
#endif
|
eca7f442 |
}
#endif
|