* atomic_add, compare_and_swap: Generic implementation (pthreads).
[cacao.git] / src / threads / native / generic-primitives.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3
4 #include <pthread.h>
5
6 extern pthread_mutex_t _atomic_add_lock;
7 extern pthread_mutex_t _cas_lock;
8 extern pthread_mutex_t _mb_lock;
9
10
11 static inline void atomic_add(volatile int *mem, int val)
12 {
13   pthread_mutex_lock(&_atomic_add_lock);
14
15   /* do the atomic add */
16   *mem += val;
17
18   pthread_mutex_unlock(&_atomic_add_lock);
19 }
20
21
22 static inline long compare_and_swap(volatile long *p, long oldval, long newval)
23 {
24   long ret;
25
26   pthread_mutex_lock(&_cas_lock);
27
28   /* do the compare-and-swap */
29
30   ret = *p;
31
32   if (oldval == ret)
33     *p = newval;
34
35   pthread_mutex_unlock(&_cas_lock);
36
37   return ret;
38 }
39
40
41 #define MEMORY_BARRIER()                  (pthread_mutex_lock(&_mb_lock), \
42                                            pthread_mutex_unlock(&_mb_lock))
43 #define STORE_ORDER_BARRIER()             MEMORY_BARRIER()
44 #define MEMORY_BARRIER_BEFORE_ATOMIC()    /* nothing */
45 #define MEMORY_BARRIER_AFTER_ATOMIC()     /* nothing */
46
47 #endif /* _MACHINE_INSTR_H */