mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
Fix mmap MT bug on Windows
This commit is contained in:
parent
9add248c9b
commit
913b573661
2 changed files with 9 additions and 11 deletions
|
@ -32,7 +32,7 @@ struct Maps {
|
||||||
_Atomic(uintptr_t) freed;
|
_Atomic(uintptr_t) freed;
|
||||||
size_t count;
|
size_t count;
|
||||||
size_t pages;
|
size_t pages;
|
||||||
_Atomic(char *) pick;
|
char *pick;
|
||||||
struct Map stack;
|
struct Map stack;
|
||||||
struct Map guard;
|
struct Map guard;
|
||||||
};
|
};
|
||||||
|
@ -49,7 +49,6 @@ bool __maps_lock(void);
|
||||||
void __maps_check(void);
|
void __maps_check(void);
|
||||||
void __maps_unlock(void);
|
void __maps_unlock(void);
|
||||||
void *__maps_randaddr(void);
|
void *__maps_randaddr(void);
|
||||||
void *__maps_pickaddr(size_t);
|
|
||||||
void __maps_add(struct Map *);
|
void __maps_add(struct Map *);
|
||||||
void __maps_free(struct Map *);
|
void __maps_free(struct Map *);
|
||||||
void __maps_insert(struct Map *);
|
void __maps_insert(struct Map *);
|
||||||
|
|
|
@ -411,22 +411,21 @@ void *__maps_randaddr(void) {
|
||||||
return (void *)addr;
|
return (void *)addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *__maps_pickaddr(size_t size) {
|
static void *__maps_pickaddr(size_t size) {
|
||||||
char *addr;
|
char *addr;
|
||||||
|
__maps_lock();
|
||||||
for (int try = 0; try < MAX_TRIES; ++try) {
|
for (int try = 0; try < MAX_TRIES; ++try) {
|
||||||
addr = atomic_exchange_explicit(&__maps.pick, 0, memory_order_acq_rel);
|
addr = __maps.pick;
|
||||||
|
__maps.pick = 0;
|
||||||
if (!addr)
|
if (!addr)
|
||||||
addr = __maps_randaddr();
|
addr = __maps_randaddr();
|
||||||
__maps_lock();
|
if (!__maps_overlaps(addr, size, __pagesize)) {
|
||||||
bool overlaps = __maps_overlaps(addr, size, __pagesize);
|
__maps.pick = addr + ((size + __gransize - 1) & __gransize);
|
||||||
__maps_unlock();
|
__maps_unlock();
|
||||||
if (!overlaps) {
|
|
||||||
atomic_store_explicit(&__maps.pick,
|
|
||||||
addr + ((size + __gransize - 1) & __gransize),
|
|
||||||
memory_order_release);
|
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
__maps_unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue