summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/abort.c5
-rw-r--r--lib/libc/stdlib/free.c34
-rw-r--r--lib/libc/stdlib/getenv.c6
-rw-r--r--lib/libc/stdlib/malloc.c75
-rw-r--r--lib/libc/stdlib/realloc.c9
-rw-r--r--lib/libc/stdlib/setenv.c18
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;
}