mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-17 08:00:32 +00:00
Release Cosmopolitan v3.6.0
This release is an atomic upgrade to GCC 14.1.0 with C23 and C++23
This commit is contained in:
parent
62ace3623a
commit
5660ec4741
1585 changed files with 117353 additions and 271644 deletions
|
@ -20,14 +20,14 @@ struct Map {
|
|||
intptr_t hand; /* windows nt only */
|
||||
union {
|
||||
struct Tree tree;
|
||||
struct Map *free;
|
||||
struct Map *freed;
|
||||
};
|
||||
};
|
||||
|
||||
struct Maps {
|
||||
atomic_int lock;
|
||||
struct Tree *maps;
|
||||
_Atomic(struct Map *) free;
|
||||
_Atomic(struct Map *) freed;
|
||||
size_t count;
|
||||
size_t pages;
|
||||
_Atomic(char *) pick;
|
||||
|
|
|
@ -131,7 +131,7 @@ static int __muntrack(char *addr, size_t size, int pagesz,
|
|||
if (addr <= map_addr && addr + PGUP(size) >= map_addr + PGUP(map_size)) {
|
||||
// remove mapping completely
|
||||
tree_remove(&__maps.maps, &map->tree);
|
||||
map->free = *deleted;
|
||||
map->freed = *deleted;
|
||||
*deleted = map;
|
||||
__maps.pages -= (map_size + pagesz - 1) / pagesz;
|
||||
__maps.count -= 1;
|
||||
|
@ -155,7 +155,7 @@ static int __muntrack(char *addr, size_t size, int pagesz,
|
|||
__maps.pages -= (left + pagesz - 1) / pagesz;
|
||||
leftmap->addr = map_addr;
|
||||
leftmap->size = left;
|
||||
leftmap->free = *deleted;
|
||||
leftmap->freed = *deleted;
|
||||
*deleted = leftmap;
|
||||
__maps_check();
|
||||
} else {
|
||||
|
@ -171,7 +171,7 @@ static int __muntrack(char *addr, size_t size, int pagesz,
|
|||
__maps.pages -= (right + pagesz - 1) / pagesz;
|
||||
rightmap->addr = addr;
|
||||
rightmap->size = right;
|
||||
rightmap->free = *deleted;
|
||||
rightmap->freed = *deleted;
|
||||
*deleted = rightmap;
|
||||
__maps_check();
|
||||
} else {
|
||||
|
@ -200,7 +200,7 @@ static int __muntrack(char *addr, size_t size, int pagesz,
|
|||
__maps.count += 1;
|
||||
middlemap->addr = addr;
|
||||
middlemap->size = size;
|
||||
middlemap->free = *deleted;
|
||||
middlemap->freed = *deleted;
|
||||
*deleted = middlemap;
|
||||
__maps_check();
|
||||
} else {
|
||||
|
@ -217,9 +217,9 @@ static int __muntrack(char *addr, size_t size, int pagesz,
|
|||
void __maps_free(struct Map *map) {
|
||||
map->size = 0;
|
||||
map->addr = MAP_FAILED;
|
||||
map->free = atomic_load_explicit(&__maps.free, memory_order_relaxed);
|
||||
map->freed = atomic_load_explicit(&__maps.freed, memory_order_relaxed);
|
||||
for (;;) {
|
||||
if (atomic_compare_exchange_weak_explicit(&__maps.free, &map->free, map,
|
||||
if (atomic_compare_exchange_weak_explicit(&__maps.freed, &map->freed, map,
|
||||
memory_order_release,
|
||||
memory_order_relaxed))
|
||||
break;
|
||||
|
@ -229,7 +229,7 @@ void __maps_free(struct Map *map) {
|
|||
static void __maps_free_all(struct Map *list) {
|
||||
struct Map *next;
|
||||
for (struct Map *map = list; map; map = next) {
|
||||
next = map->free;
|
||||
next = map->freed;
|
||||
__maps_free(map);
|
||||
}
|
||||
}
|
||||
|
@ -285,9 +285,9 @@ static void __maps_insert(struct Map *map) {
|
|||
|
||||
struct Map *__maps_alloc(void) {
|
||||
struct Map *map;
|
||||
map = atomic_load_explicit(&__maps.free, memory_order_relaxed);
|
||||
map = atomic_load_explicit(&__maps.freed, memory_order_relaxed);
|
||||
while (map) {
|
||||
if (atomic_compare_exchange_weak_explicit(&__maps.free, &map, map->free,
|
||||
if (atomic_compare_exchange_weak_explicit(&__maps.freed, &map, map->freed,
|
||||
memory_order_acquire,
|
||||
memory_order_relaxed))
|
||||
return map;
|
||||
|
@ -346,7 +346,7 @@ static int __munmap(char *addr, size_t size) {
|
|||
|
||||
// delete mappings
|
||||
int rc = 0;
|
||||
for (struct Map *map = deleted; map; map = map->free) {
|
||||
for (struct Map *map = deleted; map; map = map->freed) {
|
||||
if (!IsWindows()) {
|
||||
if (sys_munmap(map->addr, map->size))
|
||||
rc = -1;
|
||||
|
@ -359,7 +359,7 @@ static int __munmap(char *addr, size_t size) {
|
|||
}
|
||||
}
|
||||
|
||||
// free mappings
|
||||
// freed mappings
|
||||
__maps_free_all(deleted);
|
||||
|
||||
return rc;
|
||||
|
@ -451,7 +451,7 @@ TryAgain:
|
|||
}
|
||||
|
||||
// polyfill map fixed noreplace
|
||||
// we assume non-linux gives us addr if it's free
|
||||
// we assume non-linux gives us addr if it's freed
|
||||
// that's what linux (e.g. rhel7) did before noreplace
|
||||
if (noreplace && res.addr != addr) {
|
||||
if (!IsWindows()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue