diff options
Diffstat (limited to 'lib/libc/stdlib')
| -rw-r--r-- | lib/libc/stdlib/abort.c | 5 | ||||
| -rw-r--r-- | lib/libc/stdlib/free.c | 34 | ||||
| -rw-r--r-- | lib/libc/stdlib/getenv.c | 6 | ||||
| -rw-r--r-- | lib/libc/stdlib/malloc.c | 75 | ||||
| -rw-r--r-- | lib/libc/stdlib/realloc.c | 9 | ||||
| -rw-r--r-- | lib/libc/stdlib/setenv.c | 18 |
6 files changed, 57 insertions, 90 deletions
diff --git a/lib/libc/stdlib/abort.c b/lib/libc/stdlib/abort.c index 466329d1..70738ab3 100644 --- a/lib/libc/stdlib/abort.c +++ b/lib/libc/stdlib/abort.c @@ -16,12 +16,11 @@ _Noreturn void abort(void) raise(SIGABRT); - LIBC_LOCK(libc.lock.abort); + LIBC_LOCK(__libc.lock.abort); sa.sa_handler = SIG_DFL; __syscall(rt_sigaction, SIGABRT, &sa, 0, 64 / 8); - __syscall(tkill, ((struct __thread_self *)thrd_current())->tid, - SIGABRT); + __syscall(tkill, ((struct __thread_self *)thrd_current())->tid, SIGABRT); // This point should never be reached raise(SIGKILL); diff --git a/lib/libc/stdlib/free.c b/lib/libc/stdlib/free.c index ab656633..4afc800e 100644 --- a/lib/libc/stdlib/free.c +++ b/lib/libc/stdlib/free.c @@ -12,15 +12,14 @@ void free(void *ptr) return; } - LIBC_LOCK(libc.lock.malloc); + LIBC_LOCK(__libc.lock.malloc); struct page *p = __malloc_pvec; int found_in_pages = 0; while (p) { if ((uintptr_t)ptr >= (uintptr_t)p->heap && - (uintptr_t)ptr < (uintptr_t)(p->heap + (p->block.size * - p->block.count))) { + (uintptr_t)ptr < (uintptr_t)(p->heap + (p->block.size * p->block.count))) { size_t offset = (uintptr_t)ptr - (uintptr_t)p->heap; size_t index = offset / p->block.size; size_t byte_index = index / 8; @@ -42,14 +41,12 @@ void free(void *ptr) if (p == __malloc_pvec) __malloc_pvec = p->next; - munmap(p, (p->flags == PAGE_SMALL) ? - SMALL_PAGE_SIZE : - (p->flags == PAGE_MEDIUM) ? - MEDIUM_PAGE_SIZE : - LARGE_PAGE_SIZE); + munmap(p, (p->flags == PAGE_SMALL) ? SMALL_PAGE_SIZE : + (p->flags == PAGE_MEDIUM) ? MEDIUM_PAGE_SIZE : + LARGE_PAGE_SIZE); } - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); return; } p = p->next; @@ -61,11 +58,8 @@ void free(void *ptr) p = __malloc_pvec; while (p) { if ((uintptr_t)potential_orig >= (uintptr_t)p->heap && - (uintptr_t)potential_orig < - (uintptr_t)(p->heap + - (p->block.size * p->block.count))) { - size_t offset = - (uintptr_t)potential_orig - (uintptr_t)p->heap; + (uintptr_t)potential_orig < (uintptr_t)(p->heap + (p->block.size * p->block.count))) { + size_t offset = (uintptr_t)potential_orig - (uintptr_t)p->heap; size_t index = offset / p->block.size; size_t byte_index = index / 8; size_t bit_index = index % 8; @@ -85,18 +79,16 @@ void free(void *ptr) if (p == __malloc_pvec) __malloc_pvec = p->next; - munmap(p, (p->flags == PAGE_SMALL) ? - SMALL_PAGE_SIZE : - (p->flags == PAGE_MEDIUM) ? - MEDIUM_PAGE_SIZE : - LARGE_PAGE_SIZE); + munmap(p, (p->flags == PAGE_SMALL) ? SMALL_PAGE_SIZE : + (p->flags == PAGE_MEDIUM) ? MEDIUM_PAGE_SIZE : + LARGE_PAGE_SIZE); } - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); return; } p = p->next; } - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); } diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c index 41517e2f..91cdc87b 100644 --- a/lib/libc/stdlib/getenv.c +++ b/lib/libc/stdlib/getenv.c @@ -7,7 +7,7 @@ extern char **environ; char *getenv(const char *name) { - LIBC_LOCK(libc.lock.environ); + LIBC_LOCK(__libc.lock.environ); for (char **env = environ; *env; env++) { char *eq = NULL; @@ -21,12 +21,12 @@ char *getenv(const char *name) } } if (eq && name[eq - *env] == '\0') { - LIBC_UNLOCK(libc.lock.environ); + LIBC_UNLOCK(__libc.lock.environ); return eq + 1; } } - LIBC_UNLOCK(libc.lock.environ); + LIBC_UNLOCK(__libc.lock.environ); return NULL; } diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c index 556fcbd1..c696e64c 100644 --- a/lib/libc/stdlib/malloc.c +++ b/lib/libc/stdlib/malloc.c @@ -1,14 +1,12 @@ -#include "stddef.h" // for NULL - #include <atomic.h> // for LIBC_UNLOCK, LIBC_LOCK -#include <features.h> // for __weak #include <libc.h> // for libc, libc::(anonymous) #include <malloc.h> // for page, page::(anonymous), class, global_size_c... #include <stdatomic.h> // for atomic_flag_clear #include <stdint.h> // for uint32_t, uint8_t, uintptr_t #include <stdlib.h> // for malloc #include <string.h> // for memset -#include <sys/mman.h> // for size_t, mmap, munmap, MAP_ANONYMOUS, MAP_FAILED +#include <sys/cdefs.h> +#include <sys/mman.h> // for size_t, mmap, munmap, MAP_ANONYMOUS, MAP_FAILED struct page *__malloc_pvec = NULL; @@ -16,15 +14,13 @@ static __inline uint32_t get_size_class(size_t size) { uintptr_t minblock_count = (size + (16 - 1)) / 16; - if (size <= (16 * 64)) { + if (size <= (size_t)(16 * 64)) { return (uint32_t)(minblock_count ? minblock_count : 1); } - const uint32_t most_significant_bit = - (uint32_t)(63 - (int)__builtin_clzll(minblock_count)); + const uint32_t most_significant_bit = (uint32_t)(63 - (int)__builtin_clzll(minblock_count)); - const uint32_t subclass_bits = - (minblock_count >> (most_significant_bit - 2)) & 0x03; + const uint32_t subclass_bits = (minblock_count >> (most_significant_bit - 2)) & 0x03; return (uint32_t)((most_significant_bit << 2) + subclass_bits) + 41; } @@ -36,12 +32,11 @@ void *malloc(size_t size) if (size == 0) return NULL; - LIBC_LOCK(libc.lock.malloc); + LIBC_LOCK(__libc.lock.malloc); uint32_t class_index = get_size_class(size); - if (class_index >= - sizeof(global_size_class) / sizeof(global_size_class[0])) { - LIBC_UNLOCK(libc.lock.malloc); + if (class_index >= sizeof(global_size_class) / sizeof(global_size_class[0])) { + LIBC_UNLOCK(__libc.lock.malloc); return NULL; } const struct class *cls = &global_size_class[class_index]; @@ -50,70 +45,57 @@ void *malloc(size_t size) while (p) { if (p->flags == PAGE_SMALL && cls->size <= 16 * 64) { LIBC_LOCK(p->lock); - if (p->block.used < p->block.count && - p->block.size == cls->size) { + if (p->block.used < p->block.count && p->block.size == cls->size) { for (uint32_t i = 0; i < p->block.count; i++) { int byte_index = i / 8; int bit_index = i % 8; - if (!(p->bitmap[byte_index] & - (1 << bit_index))) { - p->bitmap[byte_index] |= - (1 << bit_index); + if (!(p->bitmap[byte_index] & (1 << bit_index))) { + p->bitmap[byte_index] |= (1 << bit_index); p->block.used++; LIBC_UNLOCK(p->lock); - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); if (p->heap == NULL) return NULL; - return p->heap + - (i * p->block.size); + return p->heap + (i * p->block.size); } } } LIBC_UNLOCK(p->lock); - } else if (p->flags == PAGE_MEDIUM && cls->size > 16 * 64 && - cls->size <= 16 * 8192) { + } else if (p->flags == PAGE_MEDIUM && cls->size > 16 * 64 && cls->size <= 16 * 8192) { LIBC_LOCK(p->lock); - if (p->block.used < p->block.count && - p->block.size == cls->size) { + if (p->block.used < p->block.count && p->block.size == cls->size) { for (uint32_t i = 0; i < p->block.count; i++) { int byte_index = i / 8; int bit_index = i % 8; - if (!(p->bitmap[byte_index] & - (1 << bit_index))) { + if (!(p->bitmap[byte_index] & (1 << bit_index))) { // Mark block as used - p->bitmap[byte_index] |= - (1 << bit_index); + p->bitmap[byte_index] |= (1 << bit_index); p->block.used++; LIBC_UNLOCK(p->lock); - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); if (p->heap == NULL) return NULL; - return p->heap + - (i * p->block.size); + return p->heap + (i * p->block.size); } } } LIBC_UNLOCK(p->lock); } else if (p->flags == PAGE_LARGE && cls->size > 16 * 8192) { LIBC_LOCK(p->lock); - if (p->block.used < p->block.count && - p->block.size == cls->size) { + if (p->block.used < p->block.count && p->block.size == cls->size) { // Find free block for (uint32_t i = 0; i < p->block.count; i++) { int byte_index = i / 8; int bit_index = i % 8; - if (!(p->bitmap[byte_index] & - (1 << bit_index))) { - p->bitmap[byte_index] |= - (1 << bit_index); + if (!(p->bitmap[byte_index] & (1 << bit_index))) { + p->bitmap[byte_index] |= (1 << bit_index); p->block.used++; LIBC_UNLOCK(p->lock); - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); if (p->heap == NULL) return NULL; - return p->heap + - (i * p->block.size); + return p->heap + (i * p->block.size); } } } @@ -137,11 +119,10 @@ void *malloc(size_t size) } size_t bitmap_size = (cls->count + 7) / 8; - void *mem = mmap(NULL, page_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + void *mem = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mem == MAP_FAILED) { - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); return NULL; } @@ -159,7 +140,7 @@ void *malloc(size_t size) if (new_page->heap == NULL || new_page->bitmap == NULL) { munmap(mem, page_size); - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); return NULL; } atomic_flag_clear(&new_page->lock); @@ -176,7 +157,7 @@ void *malloc(size_t size) new_page->bitmap[0] |= 1; new_page->block.used = 1; - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); return new_page->heap; } diff --git a/lib/libc/stdlib/realloc.c b/lib/libc/stdlib/realloc.c index dca8cac2..78081564 100644 --- a/lib/libc/stdlib/realloc.c +++ b/lib/libc/stdlib/realloc.c @@ -18,15 +18,14 @@ void *realloc(void *ptr, size_t size) return NULL; } - LIBC_LOCK(libc.lock.malloc); + LIBC_LOCK(__libc.lock.malloc); struct page *p = __malloc_pvec; while (p) { if ((uintptr_t)ptr >= (uintptr_t)p->heap && - (uintptr_t)ptr < (uintptr_t)(p->heap + (p->block.size * - p->block.count))) { + (uintptr_t)ptr < (uintptr_t)(p->heap + (p->block.size * p->block.count))) { size_t old_size = p->block.size; - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); if (size <= old_size) { return ptr; @@ -41,7 +40,7 @@ void *realloc(void *ptr, size_t size) p = p->next; } - LIBC_UNLOCK(libc.lock.malloc); + LIBC_UNLOCK(__libc.lock.malloc); errno = EINVAL; return NULL; diff --git a/lib/libc/stdlib/setenv.c b/lib/libc/stdlib/setenv.c index 3dfe3d22..22b7bef9 100644 --- a/lib/libc/stdlib/setenv.c +++ b/lib/libc/stdlib/setenv.c @@ -14,18 +14,15 @@ int setenv(const char *var, const char *value, int overwrite) for (; *env; env++) { char *eq = strchr(*env, '='); - if (eq && ((size_t)(eq - *env) == var_len) && - !strncmp(*env, var, var_len)) { + if (eq && ((size_t)(eq - *env) == var_len) && !strncmp(*env, var, var_len)) { if (overwrite) { size_t value_len = strlen(value); - char *new_env = - malloc(var_len + 1 + value_len + 1); + char *new_env = malloc(var_len + 1 + value_len + 1); if (!new_env) return -1; strcpy(new_env, var); new_env[var_len] = '='; - memcpy(new_env + var_len + 1, value, - value_len + 1); + memcpy(new_env + var_len + 1, value, value_len + 1); *env = new_env; } return 0; @@ -36,8 +33,7 @@ int setenv(const char *var, const char *value, int overwrite) while (environ[env_count]) env_count++; - char **new_envp = (char **)realloc((void *)environ, - (env_count + 2) * sizeof(char *)); + char **new_envp = (char **)realloc((void *)environ, (env_count + 2) * sizeof(char *)); if (!new_envp) return -1; @@ -52,10 +48,10 @@ int setenv(const char *var, const char *value, int overwrite) new_envp[env_count] = new_var; new_envp[env_count + 1] = NULL; - LIBC_LOCK(libc.lock.environ); + LIBC_LOCK(__libc.lock.environ); environ = new_envp; - LIBC_UNLOCK(libc.lock.environ); - libc.flags |= LIBC_ENVP_TOUCHED; + LIBC_UNLOCK(__libc.lock.environ); + __libc.flags |= LIBC_ENVP_TOUCHED; return 0; } |
