Changes in uspace/lib/libc/arch/sparc64/include/atomic.h [228666c:e15e0e8] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/arch/sparc64/include/atomic.h
r228666c re15e0e8 46 46 * 47 47 * @param val Atomic variable. 48 * @param i 48 * @param i Signed value to be added. 49 49 * 50 50 * @return Value of the atomic variable as it existed before addition. 51 *52 51 */ 53 static inline atomic_count_t atomic_add(atomic_t *val, atomic_count_t i)52 static inline long atomic_add(atomic_t *val, int i) 54 53 { 55 atomic_count_t a; 56 atomic_count_t b; 57 54 uint64_t a, b; 55 58 56 do { 59 volatile uintptr_t ptr = (uintptr_t) &val->count;60 61 a = *(( atomic_count_t *) ptr);57 volatile uintptr_t x = (uint64_t) &val->count; 58 59 a = *((uint64_t *) x); 62 60 b = a + i; 63 64 asm volatile ( 65 "casx %0, %2, %1\n" 66 : "+m" (*((atomic_count_t *) ptr)), 67 "+r" (b) 68 : "r" (a) 69 ); 61 asm volatile ("casx %0, %2, %1\n" : "+m" (*((uint64_t *)x)), "+r" (b) : "r" (a)); 70 62 } while (a != b); 71 63 72 64 return a; 73 65 } 74 66 75 static inline atomic_count_tatomic_preinc(atomic_t *val)67 static inline long atomic_preinc(atomic_t *val) 76 68 { 77 69 return atomic_add(val, 1) + 1; 78 70 } 79 71 80 static inline atomic_count_tatomic_postinc(atomic_t *val)72 static inline long atomic_postinc(atomic_t *val) 81 73 { 82 74 return atomic_add(val, 1); 83 75 } 84 76 85 static inline atomic_count_tatomic_predec(atomic_t *val)77 static inline long atomic_predec(atomic_t *val) 86 78 { 87 79 return atomic_add(val, -1) - 1; 88 80 } 89 81 90 static inline atomic_count_tatomic_postdec(atomic_t *val)82 static inline long atomic_postdec(atomic_t *val) 91 83 { 92 84 return atomic_add(val, -1);
Note:
See TracChangeset
for help on using the changeset viewer.