mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
1.9 KiB
98 lines
1.9 KiB
/*
|
|
*
|
|
* simple locking test program
|
|
* (no paralles stuff)
|
|
*
|
|
* Compile with: gcc -D__CPU_i386 -O3 on x86 machines and
|
|
* gcc -mips2 -O2 -D__CPU_mips on mips machines.
|
|
* -- andrei
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
typedef volatile int fl_lock_t;
|
|
|
|
|
|
|
|
int tsl(fl_lock_t* lock)
|
|
{
|
|
long val;
|
|
|
|
#ifdef __CPU_mips
|
|
long tmp=0;
|
|
|
|
asm volatile(
|
|
".set noreorder\n\t"
|
|
"1: ll %1, %2 \n\t"
|
|
" li %0, 1 \n\t"
|
|
" sc %0, %2 \n\t"
|
|
" beqz %0, 1b \n\t"
|
|
" nop \n\t"
|
|
".set reorder\n\t"
|
|
: "=&r" (tmp), "=&r" (val), "=m" (*lock)
|
|
: "0" (tmp), "m" (*lock)
|
|
: "cc"
|
|
);
|
|
#elif defined __CPU_i386
|
|
val=1;
|
|
asm volatile(
|
|
" xchg %b1, %0" : "=q" (val), "=m" (*lock) : "0" (val)
|
|
);
|
|
#else
|
|
#error "cpu type not defined, add -D__CPU_<type> when compiling"
|
|
#endif
|
|
|
|
return val;
|
|
}
|
|
|
|
|
|
|
|
void release_lock(fl_lock_t* lock)
|
|
{
|
|
#ifdef __CPU_mips
|
|
int tmp;
|
|
tmp=0;
|
|
asm volatile(
|
|
".set noreorder \n\t"
|
|
" sync \n\t"
|
|
" sw $0, %0 \n\t"
|
|
".set reorder \n\t"
|
|
: /*no output*/ : "m" (*lock) : "memory"
|
|
);
|
|
#elif defined __CPU_i386
|
|
asm volatile(
|
|
" movb $0, (%0)" : /*no output*/ : "r"(lock): "memory"
|
|
);
|
|
#else
|
|
#error "cpu type not defined, add -D__CPU_<type> when compiling"
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
fl_lock_t lock;
|
|
int r;
|
|
|
|
lock=0;
|
|
printf("starting locking basic tests...\n");
|
|
|
|
r=tsl(&lock);
|
|
printf(" tsl should return 0 ... %d\n", r);
|
|
printf(" lock should be 1 now ... %d\n", lock);
|
|
r=tsl(&lock);
|
|
printf(" tsl should return 1 ... %d\n", r);
|
|
printf(" lock should still be 1 now ... %d\n", lock);
|
|
release_lock(&lock);
|
|
printf(" release_lock: lock should be 0 now ... %d\n", lock);
|
|
printf("trying tsl once more...\n");
|
|
r=tsl(&lock);
|
|
printf(" tsl should return 0 ... %d\n", r);
|
|
printf(" lock should be 1 now ... %d\n", lock);
|
|
printf("\ndone.\n");
|
|
return 0;
|
|
}
|