gcc/ck_pr: GCC-backed primitives should serve as compiler barriers.

Olivier pointed out that he was seeing some load / store operations
get optimized away and / or re-ordered otherwise.
ck_pring
Samy Al Bahra 10 years ago
parent 8ee26212f9
commit 63d6c00c3d

@ -60,28 +60,39 @@ ck_pr_barrier(void)
ck_pr_md_load_##S(const M *target) \ ck_pr_md_load_##S(const M *target) \
{ \ { \
T r; \ T r; \
ck_pr_barrier(); \
r = CK_PR_ACCESS(*(T *)target); \ r = CK_PR_ACCESS(*(T *)target); \
ck_pr_barrier(); \
return (r); \ return (r); \
} \ } \
CK_CC_INLINE static void \ CK_CC_INLINE static void \
ck_pr_md_store_##S(M *target, T v) \ ck_pr_md_store_##S(M *target, T v) \
{ \ { \
ck_pr_barrier(); \
CK_PR_ACCESS(*(T *)target) = v; \ CK_PR_ACCESS(*(T *)target) = v; \
ck_pr_barrier(); \
return; \ return; \
} }
CK_CC_INLINE static void * CK_CC_INLINE static void *
ck_pr_md_load_ptr(const void *target) ck_pr_md_load_ptr(const void *target)
{ {
void *r;
return CK_PR_ACCESS(*(void **)target); ck_pr_barrier();
r = CK_PR_ACCESS(*(void **)target);
ck_pr_barrier();
return r;
} }
CK_CC_INLINE static void CK_CC_INLINE static void
ck_pr_md_store_ptr(void *target, const void *v) ck_pr_md_store_ptr(void *target, const void *v)
{ {
ck_pr_barrier();
CK_PR_ACCESS(*(void **)target) = (void *)v; CK_PR_ACCESS(*(void **)target) = (void *)v;
ck_pr_barrier();
return; return;
} }

Loading…
Cancel
Save