Changeset View
Changeset View
Standalone View
Standalone View
sys/sys/atomic_common.h
Show All 30 Lines | |||||
*/ | */ | ||||
#ifndef _SYS_ATOMIC_COMMON_H_ | #ifndef _SYS_ATOMIC_COMMON_H_ | ||||
#define _SYS_ATOMIC_COMMON_H_ | #define _SYS_ATOMIC_COMMON_H_ | ||||
#ifndef _MACHINE_ATOMIC_H_ | #ifndef _MACHINE_ATOMIC_H_ | ||||
#error do not include this header, use machine/atomic.h | #error do not include this header, use machine/atomic.h | ||||
#endif | #endif | ||||
#define atomic_load_char(p) (*(volatile u_char *)(p)) | #include <sys/types.h> | ||||
#define atomic_load_short(p) (*(volatile u_short *)(p)) | |||||
#define atomic_load_int(p) (*(volatile u_int *)(p)) | |||||
#define atomic_load_long(p) (*(volatile u_long *)(p)) | |||||
#define atomic_load_ptr(p) (*(volatile __typeof(*p) *)(p)) | |||||
#define atomic_load_8(p) (*(volatile uint8_t *)(p)) | |||||
#define atomic_load_16(p) (*(volatile uint16_t *)(p)) | |||||
#define atomic_load_32(p) (*(volatile uint32_t *)(p)) | |||||
#ifdef _LP64 | |||||
#define atomic_load_64(p) (*(volatile uint64_t *)(p)) | |||||
#endif | |||||
#define atomic_store_char(p, v) \ | #define ATOMIC_LOADSTORE(t, n) \ | ||||
(*(volatile u_char *)(p) = (u_char)(v)) | static inline volatile t \ | ||||
#define atomic_store_short(p, v) \ | atomic_load_ ## n (volatile t *p) \ | ||||
(*(volatile u_short *)(p) = (u_short)(v)) | { \ | ||||
#define atomic_store_int(p, v) \ | return (*p); \ | ||||
(*(volatile u_int *)(p) = (u_int)(v)) | } \ | ||||
#define atomic_store_long(p, v) \ | \ | ||||
(*(volatile u_long *)(p) = (u_long)(v)) | static inline void \ | ||||
#define atomic_store_ptr(p, v) \ | atomic_store_ ## n (volatile t *p, t v) \ | ||||
(*(volatile __typeof(*p) *)(p) = (v)) | { \ | ||||
#define atomic_store_8(p, v) \ | *p = v; \ | ||||
(*(volatile uint8_t *)(p) = (uint8_t)(v)) | } | ||||
#define atomic_store_16(p, v) \ | |||||
(*(volatile uint16_t *)(p) = (uint16_t)(v)) | ATOMIC_LOADSTORE(u_char, char); | ||||
#define atomic_store_32(p, v) \ | ATOMIC_LOADSTORE(u_short, short); | ||||
(*(volatile uint32_t *)(p) = (uint32_t)(v)) | ATOMIC_LOADSTORE(u_int, int); | ||||
ATOMIC_LOADSTORE(u_long, long); | |||||
ATOMIC_LOADSTORE(uint8_t, 8); | |||||
ATOMIC_LOADSTORE(uint16_t, 16); | |||||
ATOMIC_LOADSTORE(uint32_t, 32); | |||||
#ifdef _LP64 | #ifdef _LP64 | ||||
#define atomic_store_64(p, v) \ | ATOMIC_LOADSTORE(uint64_t, 64); | ||||
(*(volatile uint64_t *)(p) = (uint64_t)(v)) | |||||
#endif | #endif | ||||
#undef ATOMIC_LOADSTORE | |||||
#define atomic_load_ptr(p) (*(volatile __typeof(*p) *)(p)) | |||||
#define atomic_store_ptr(p, v) (*(volatile __typeof(*p) *)(p) = (v)) | |||||
/* | /* | ||||
* Currently all architectures provide acquire and release fences on their own, | * Currently all architectures provide acquire and release fences on their own, | ||||
* but they don't provide consume. Kludge below allows relevant code to stop | * but they don't provide consume. Kludge below allows relevant code to stop | ||||
* openly resorting to the stronger acquire fence, to be sorted out. | * openly resorting to the stronger acquire fence, to be sorted out. | ||||
*/ | */ | ||||
#define atomic_load_consume_ptr(p) \ | #define atomic_load_consume_ptr(p) \ | ||||
((__typeof(*p)) atomic_load_acq_ptr((uintptr_t *)p)) | ((__typeof(*p)) atomic_load_acq_ptr((uintptr_t *)p)) | ||||
#define atomic_interrupt_fence() __compiler_membar() | #define atomic_interrupt_fence() __compiler_membar() | ||||
#endif | #endif | ||||
jrtc27: Why not just do:
```
#define __atomic_load_generic(p, t, ut, n) __atomic_load_ ## n (p)
#define… | |||||
Done Inline ActionsUh #define __atomic_load_generic(p, t, ut, n) __atomic_load_ ## n (p) #define __atomic_store_generic(p, v, t, ut, n) __atomic_store_ ## n (p, v) of course... jrtc27: Uh
```
#define __atomic_load_generic(p, t, ut, n) __atomic_load_ ## n (p)
#define… | |||||
Done Inline ActionsYou've lost the LP64 guard on just this one jrtc27: You've lost the LP64 guard on just this one |
Why not just do:
in the !C11 case and avoid duplicating all the per-type defines?