Skip to content

Commit 2f51fbc

Browse files
committed
assert 64bit atomic args alignment
1 parent c93cba5 commit 2f51fbc

File tree

4 files changed

+52
-23
lines changed

4 files changed

+52
-23
lines changed

src/pool/pool_disjoint.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "provider/provider_tracking.h"
2121
#include "uthash/utlist.h"
2222
#include "utils_common.h"
23+
#include "utils_concurrency.h"
2324
#include "utils_log.h"
2425
#include "utils_math.h"
2526

@@ -895,7 +896,8 @@ umf_memory_pool_ops_t *umfDisjointPoolOps(void) {
895896

896897
umf_disjoint_pool_shared_limits_t *
897898
umfDisjointPoolSharedLimitsCreate(size_t max_size) {
898-
umf_disjoint_pool_shared_limits_t *ptr = umf_ba_global_alloc(sizeof(*ptr));
899+
umf_disjoint_pool_shared_limits_t *ptr =
900+
umf_ba_global_aligned_alloc(sizeof(*ptr), 64);
899901
if (ptr == NULL) {
900902
LOG_ERR("cannot allocate memory for disjoint pool shared limits");
901903
return NULL;

src/pool/pool_disjoint_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ typedef struct slab_t {
101101
} slab_t;
102102

103103
typedef struct umf_disjoint_pool_shared_limits_t {
104+
CACHE_ALIGNED size_t total_size; // requires atomic access
104105
size_t max_size;
105-
size_t total_size; // requires atomic access
106106
} umf_disjoint_pool_shared_limits_t;
107107

108108
typedef struct umf_disjoint_pool_params_t {

src/utils/utils_concurrency.h

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@
3737
extern "C" {
3838
#endif
3939

40+
#ifdef _WIN32
41+
#define CACHE_ALIGNED __declspec(align(64))
42+
#else
43+
#define CACHE_ALIGNED __attribute__((aligned(64)))
44+
#endif
45+
4046
typedef struct utils_mutex_t {
4147
#ifdef _WIN32
4248
CRITICAL_SECTION lock;
@@ -91,28 +97,13 @@ static __inline unsigned char utils_mssb_index(long long value) {
9197
return (unsigned char)ret;
9298
}
9399

94-
// There is no good way to do atomic_load on windows...
95-
#define utils_atomic_load_acquire(object, dest) \
96-
do { \
97-
*(LONG64 *)dest = \
98-
InterlockedOr64Acquire((LONG64 volatile *)object, 0); \
99-
} while (0)
100-
101-
#define utils_atomic_store_release(object, desired) \
102-
InterlockedExchange64((LONG64 volatile *)object, (LONG64)desired)
103-
104-
#define utils_atomic_increment(object) \
105-
InterlockedIncrement64((LONG64 volatile *)object)
106-
107-
#define utils_atomic_decrement(object) \
108-
InterlockedDecrement64((LONG64 volatile *)object)
109-
110-
#define utils_fetch_and_add64(ptr, value) \
111-
InterlockedExchangeAdd64((LONG64 *)(ptr), value)
112-
100+
void utils_atomic_load_acquire(void *ptr, void *dest);
101+
void utils_atomic_store_release(void *ptr, long long desired);
102+
void utils_atomic_increment(void *ptr);
103+
void utils_atomic_decrement(void *ptr);
104+
void utils_fetch_and_add64(void *ptr, long long value);
113105
// NOTE: windows version have different order of args
114-
#define utils_compare_exchange(object, desired, expected) \
115-
InterlockedCompareExchange64((LONG64 volatile *)object, *expected, *desired)
106+
void utils_compare_exchange(void *ptr, void *desired, void *expected)
116107

117108
#else // !defined(_WIN32)
118109

src/utils/utils_windows_concurrency.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*
88
*/
99

10+
#include "utils_common.h"
1011
#include "utils_concurrency.h"
1112

1213
size_t utils_mutex_get_size(void) { return sizeof(utils_mutex_t); }
@@ -66,6 +67,41 @@ int utils_write_unlock(utils_rwlock_t *rwlock) {
6667
return 0; // never fails
6768
}
6869

70+
// There is no good way to do atomic_load on windows...
71+
void utils_atomic_load_acquire(void *ptr, void *dest) {
72+
ASSERT_IS_ALIGNED((uintptr_t)ptr, 64);
73+
*(long long *)dest = InterlockedOr64Acquire((long long volatile *)ptr, 0);
74+
}
75+
76+
void utils_atomic_store_release(void *ptr, long long desired) {
77+
ASSERT_IS_ALIGNED((uintptr_t)ptr, 64);
78+
InterlockedExchange64((long long volatile *)ptr, desired);
79+
}
80+
81+
void utils_atomic_increment(void *ptr) {
82+
ASSERT_IS_ALIGNED((uintptr_t)ptr, 64);
83+
InterlockedIncrement64((long long volatile *)ptr)
84+
}
85+
86+
void utils_atomic_decrement(void *ptr) {
87+
ASSERT_IS_ALIGNED((uintptr_t)ptr, 64);
88+
InterlockedDecrement64((long long volatile *)ptr)
89+
}
90+
91+
void utils_fetch_and_add64(void *ptr, long long value) {
92+
ASSERT_IS_ALIGNED((uintptr_t)ptr, 64);
93+
InterlockedExchangeAdd64((long long volatile *)(ptr), value);
94+
}
95+
96+
// NOTE: windows version have different order of args
97+
void utils_compare_exchange(void *ptr, void *desired, void *expected) {
98+
ASSERT_IS_ALIGNED((uintptr_t)ptr, 64);
99+
ASSERT_IS_ALIGNED((uintptr_t)desired, 64);
100+
ASSERT_IS_ALIGNED((uintptr_t)expected, 64);
101+
InterlockedCompareExchange64((long long volatile *)ptr, *expected,
102+
*desired);
103+
}
104+
69105
static BOOL CALLBACK initOnceCb(PINIT_ONCE InitOnce, PVOID Parameter,
70106
PVOID *lpContext) {
71107
(void)InitOnce; // unused

0 commit comments

Comments
 (0)