Skip to content

Commit 728be93

Browse files
committed
fix for #414 making numa node count atomic
1 parent a83bca7 commit 728be93

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

include/mimalloc-internal.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -667,13 +667,14 @@ static inline uintptr_t _mi_random_shuffle(uintptr_t x) {
667667
int _mi_os_numa_node_get(mi_os_tld_t* tld);
668668
size_t _mi_os_numa_node_count_get(void);
669669

670-
extern size_t _mi_numa_node_count;
670+
extern _Atomic(size_t) _mi_numa_node_count;
671671
static inline int _mi_os_numa_node(mi_os_tld_t* tld) {
672-
if (mi_likely(_mi_numa_node_count == 1)) return 0;
672+
if (mi_likely(mi_atomic_load_relaxed(&_mi_numa_node_count) == 1)) return 0;
673673
else return _mi_os_numa_node_get(tld);
674674
}
675675
static inline size_t _mi_os_numa_node_count(void) {
676-
if (mi_likely(_mi_numa_node_count>0)) return _mi_numa_node_count;
676+
const size_t count = mi_atomic_load_relaxed(&_mi_numa_node_count);
677+
if (mi_likely(count>0)) return count;
677678
else return _mi_os_numa_node_count_get();
678679
}
679680

src/os.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,17 +1202,23 @@ static size_t mi_os_numa_node_countx(void) {
12021202
}
12031203
#endif
12041204

1205-
size_t _mi_numa_node_count = 0; // cache the node count
1205+
_Atomic(size_t) _mi_numa_node_count; // = 0 // cache the node count
12061206

12071207
size_t _mi_os_numa_node_count_get(void) {
1208-
if (mi_unlikely(_mi_numa_node_count <= 0)) {
1208+
size_t count = mi_atomic_load_acquire(&_mi_numa_node_count);
1209+
if (count <= 0) {
12091210
long ncount = mi_option_get(mi_option_use_numa_nodes); // given explicitly?
1210-
if (ncount <= 0) ncount = (long)mi_os_numa_node_countx(); // or detect dynamically
1211-
_mi_numa_node_count = (size_t)(ncount <= 0 ? 1 : ncount);
1212-
_mi_verbose_message("using %zd numa regions\n", _mi_numa_node_count);
1211+
if (ncount > 0) {
1212+
count = (size_t)ncount;
1213+
}
1214+
else {
1215+
count = mi_os_numa_node_countx(); // or detect dynamically
1216+
if (count == 0) count = 1;
1217+
}
1218+
mi_atomic_store_release(&_mi_numa_node_count, count); // save it
1219+
_mi_verbose_message("using %zd numa regions\n", count);
12131220
}
1214-
mi_assert_internal(_mi_numa_node_count >= 1);
1215-
return _mi_numa_node_count;
1221+
return count;
12161222
}
12171223

12181224
int _mi_os_numa_node_get(mi_os_tld_t* tld) {

0 commit comments

Comments
 (0)