00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <sys/syscall.h>
00028
00029 static inline long
00030 sys_futex0 (int *addr, int op, int val)
00031 {
00032 register long int gpr2 __asm__ ("2");
00033 register long int gpr3 __asm__ ("3");
00034 register long int gpr4 __asm__ ("4");
00035 register long int gpr5 __asm__ ("5");
00036
00037 gpr2 = (long) addr;
00038 gpr3 = op;
00039 gpr4 = val;
00040 gpr5 = 0;
00041
00042 __asm volatile ("svc %b1"
00043 : "=d" (gpr2)
00044 : "i" (SYS_futex),
00045 "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5)
00046 : "memory");
00047 return gpr2;
00048 }
00049
00050 static inline void
00051 futex_wait (int *addr, int val)
00052 {
00053 long err = sys_futex0 (addr, gomp_futex_wait, val);
00054 if (__builtin_expect (err == -ENOSYS, 0))
00055 {
00056 gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
00057 gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
00058 sys_futex0 (addr, gomp_futex_wait, val);
00059 }
00060 }
00061
00062 static inline void
00063 futex_wake (int *addr, int count)
00064 {
00065 long err = sys_futex0 (addr, gomp_futex_wake, count);
00066 if (__builtin_expect (err == -ENOSYS, 0))
00067 {
00068 gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
00069 gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
00070 sys_futex0 (addr, gomp_futex_wake, count);
00071 }
00072 }
00073
00074 static inline void
00075 cpu_relax (void)
00076 {
00077 __asm volatile ("" : : : "memory");
00078 }
00079
00080 static inline void
00081 atomic_write_barrier (void)
00082 {
00083 __sync_synchronize ();
00084 }