58f31910a500294f3f13929c9b6084e5170fc207
[sip-router] / fastlock.h
1 /*
2  * fast arhitecture specific locking
3  *
4  * $Id$
5  *
6  * 
7  */
8
9
10
11 #ifndef fastlock_h
12 #define fastlock_h
13
14
15 #include <sched.h>
16
17
18
19
20 typedef  volatile int fl_lock_t;
21
22
23
24 #define init_lock( l ) (l)=0
25
26
27
28 /*test and set lock, ret 1 if lock held by someone else, 0 otherwise*/
29 inline static int tsl(fl_lock_t* lock)
30 {
31         int val;
32
33 #ifdef __i386
34
35 #ifdef NOSMP
36         val=0;
37         asm volatile(
38                 " btsl $0, %1 \n\t"
39                 " adcl $0, %0 \n\t"
40                 : "=q" (val), "=m" (*lock) : "0"(val) : "memory", "cc" /* "cc" */
41         );
42 #else
43         val=1;
44         asm volatile( 
45                 " xchg %b1, %0" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"
46         );
47 #endif /*NOSMP*/
48 #elif defined __sparc
49         asm volatile(
50                         "ldstub [%1], %0 \n\t"
51 #ifndef NOSMP
52                         "membar #StoreStore | #StoreLoad \n\t"
53 #endif
54                         : "=r"(val) : "r"(lock):"memory"
55         );
56         
57 #elif defined __arm__
58         asm volatile(
59                         "# here \n\t"
60                         "swpb %0, %1, [%2] \n\t"
61                         : "=r" (val)
62                         : "r"(1), "r" (lock) : "memory"
63         );
64         
65 #else
66 #error "unknown arhitecture"
67 #endif
68         return val;
69 }
70
71
72
73 inline static void get_lock(fl_lock_t* lock)
74 {
75 #ifdef ADAPTIVE_WAIT
76         int i=ADAPTIVE_WAIT_LOOPS;
77 #endif
78         
79         while(tsl(lock)){
80 #ifdef BUSY_WAIT
81 #elif defined ADAPTIVE_WAIT
82                 if (i>0) i--;
83                 else sched_yield();
84 #else
85                 sched_yield();
86 #endif
87         }
88 }
89
90
91
92 inline static void release_lock(fl_lock_t* lock)
93 {
94 #ifdef __i386
95         char val;
96         val=0;
97         asm volatile(
98                 " movb $0, (%0)" : /*no output*/ : "r"(lock): "memory"
99                 /*" xchg %b0, %1" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"*/
100         ); 
101 #elif defined __sparc
102         asm volatile(
103 #ifndef NOSMP
104                         "membar #LoadStore | #StoreStore \n\t" /*is this really needed?*/
105 #endif
106                         "stb %%g0, [%0] \n\t"
107                         : /*no output*/
108                         : "r" (lock)
109                         : "memory"
110         );
111 #elif defined __arm__
112         asm volatile(
113                 " str %0, [%1] \n\r" 
114                 : /*no outputs*/ 
115                 : "r"(0), "r"(lock)
116                 : "memory"
117         );
118 #else
119 #error "unknown arhitecture"
120 #endif
121 }
122
123
124
125 #endif