Skip to content

Commit 913b573

Browse files
committed
Fix mmap MT bug on Windows
1 parent 9add248 commit 913b573

File tree

2 files changed

+9
-11
lines changed

2 files changed

+9
-11
lines changed

libc/intrin/maps.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct Maps {
3232
_Atomic(uintptr_t) freed;
3333
size_t count;
3434
size_t pages;
35-
_Atomic(char *) pick;
35+
char *pick;
3636
struct Map stack;
3737
struct Map guard;
3838
};
@@ -49,7 +49,6 @@ bool __maps_lock(void);
4949
void __maps_check(void);
5050
void __maps_unlock(void);
5151
void *__maps_randaddr(void);
52-
void *__maps_pickaddr(size_t);
5352
void __maps_add(struct Map *);
5453
void __maps_free(struct Map *);
5554
void __maps_insert(struct Map *);

libc/intrin/mmap.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -411,22 +411,21 @@ void *__maps_randaddr(void) {
411411
return (void *)addr;
412412
}
413413

414-
void *__maps_pickaddr(size_t size) {
414+
static void *__maps_pickaddr(size_t size) {
415415
char *addr;
416+
__maps_lock();
416417
for (int try = 0; try < MAX_TRIES; ++try) {
417-
addr = atomic_exchange_explicit(&__maps.pick, 0, memory_order_acq_rel);
418+
addr = __maps.pick;
419+
__maps.pick = 0;
418420
if (!addr)
419421
addr = __maps_randaddr();
420-
__maps_lock();
421-
bool overlaps = __maps_overlaps(addr, size, __pagesize);
422-
__maps_unlock();
423-
if (!overlaps) {
424-
atomic_store_explicit(&__maps.pick,
425-
addr + ((size + __gransize - 1) & __gransize),
426-
memory_order_release);
422+
if (!__maps_overlaps(addr, size, __pagesize)) {
423+
__maps.pick = addr + ((size + __gransize - 1) & __gransize);
424+
__maps_unlock();
427425
return addr;
428426
}
429427
}
428+
__maps_unlock();
430429
return 0;
431430
}
432431

0 commit comments

Comments
 (0)