rename tls -> thread_local

This commit is contained in:
jacob 2024-04-07 00:10:29 -05:00
parent 99f0414261
commit d11d2d8309
5 changed files with 24 additions and 24 deletions

View File

@ -3,7 +3,7 @@
#include "arena.h" #include "arena.h"
#include "sys.h" #include "sys.h"
#include "tls.h" #include "thread_local.h"
#define SCRATCH_ARENAS_PER_THREAD 2 #define SCRATCH_ARENAS_PER_THREAD 2
#define SCRATCH_ARENA_RESERVE (GIGABYTE(64)) #define SCRATCH_ARENA_RESERVE (GIGABYTE(64))

View File

@ -9,7 +9,7 @@
#include "log.h" #include "log.h"
#include "math.h" #include "math.h"
#include "util.h" #include "util.h"
#include "tls.h" #include "thread_local.h"
#include "utf.h" #include "utf.h"
#define UNICODE #define UNICODE

View File

@ -1,4 +1,4 @@
#include "tls.h" #include "thread_local.h"
#include "sys.h" #include "sys.h"
#include "arena.h" #include "arena.h"
#include "atomic.h" #include "atomic.h"
@ -10,22 +10,22 @@
#define MAX_THREAD_LOCAL_VARS 64 #define MAX_THREAD_LOCAL_VARS 64
GLOBAL struct { GLOBAL struct {
struct atomic_i64 tls_metas_lock_flag; struct atomic_i64 metas_lock_flag;
u64 tls_metas_count; u64 metas_count;
struct thread_local_var_meta tls_metas[MAX_THREAD_LOCAL_VARS]; struct thread_local_var_meta metas[MAX_THREAD_LOCAL_VARS];
} L = { 0 }, DEBUG_LVAR(L_tls); } L = { 0 }, DEBUG_LVAR(L_thread_local);
INTERNAL void tls_metas_lock(void) INTERNAL void metas_lock(void)
{ {
while (atomic_i64_eval_compare_exchange(&L.tls_metas_lock_flag, 0, 1) == 0) { while (atomic_i64_eval_compare_exchange(&L.metas_lock_flag, 0, 1) == 0) {
/* Spinlock */ /* Spinlock */
ix_pause(); ix_pause();
} }
} }
INTERNAL void tls_metas_unlock(void) INTERNAL void metas_unlock(void)
{ {
atomic_i64_eval_exchange(&L.tls_metas_lock_flag, 0); atomic_i64_eval_exchange(&L.metas_lock_flag, 0);
} }
struct thread_local_store thread_local_store_alloc(void) struct thread_local_store thread_local_store_alloc(void)
@ -41,19 +41,19 @@ struct thread_local_store thread_local_store_alloc(void)
void thread_local_store_release(struct thread_local_store *t) void thread_local_store_release(struct thread_local_store *t)
{ {
__prof; __prof;
/* Release allocated tls data in reverse order */ /* Release allocated vars in reverse order */
tls_metas_lock(); metas_lock();
{ {
for (u64 i = t->allocation_order_count; i-- > 0;) { for (u64 i = t->allocation_order_count; i-- > 0;) {
u64 id = t->allocation_order[i]; u64 id = t->allocation_order[i];
void *data = t->lookup[id]; void *data = t->lookup[id];
struct thread_local_var_meta *meta = &L.tls_metas[id]; struct thread_local_var_meta *meta = &L.metas[id];
if (meta->release) { if (meta->release) {
meta->release(data); meta->release(data);
} }
} }
} }
tls_metas_unlock(); metas_unlock();
arena_release(&t->arena); arena_release(&t->arena);
} }
@ -66,21 +66,21 @@ void *_thread_local_eval(struct thread_local_var_meta *meta)
u64 id_plus_one = atomic_u64_eval(&meta->id_plus_one); u64 id_plus_one = atomic_u64_eval(&meta->id_plus_one);
if (id_plus_one == 0) { if (id_plus_one == 0) {
__profscope(_thread_local_eval__REGISTER); __profscope(_thread_local_eval__REGISTER);
tls_metas_lock(); metas_lock();
{ {
id_plus_one = atomic_u64_eval(&meta->id_plus_one); /* Re-check now that locked */ id_plus_one = atomic_u64_eval(&meta->id_plus_one); /* Re-check now that locked */
if (id_plus_one == 0) { if (id_plus_one == 0) {
id = L.tls_metas_count++; id = L.metas_count++;
if (id >= MAX_THREAD_LOCAL_VARS) { if (id >= MAX_THREAD_LOCAL_VARS) {
sys_panic_raw("Maximum number of thread local variables reached"); sys_panic_raw("Maximum number of thread local variables reached");
} }
atomic_u64_eval_exchange(&meta->id_plus_one, id + 1); atomic_u64_eval_exchange(&meta->id_plus_one, id + 1);
L.tls_metas[id] = *meta; L.metas[id] = *meta;
} else { } else {
id = id_plus_one - 1; id = id_plus_one - 1;
} }
} }
tls_metas_unlock(); metas_unlock();
} else { } else {
id = id_plus_one - 1; id = id_plus_one - 1;
} }

View File

@ -1,5 +1,5 @@
#ifndef TLS_H #ifndef THREAD_LOCAL
#define TLS_H #define THREAD_LOCAL
/* ========================== * /* ========================== *
* Thread local store * Thread local store
@ -20,10 +20,10 @@ void thread_local_store_release(struct thread_local_store *t);
* ========================== */ * ========================== */
#define THREAD_LOCAL_VAR_ALLOC_FUNC_DEF(name, arg_name) void name(void *arg_name) #define THREAD_LOCAL_VAR_ALLOC_FUNC_DEF(name, arg_name) void name(void *arg_name)
typedef THREAD_LOCAL_VAR_ALLOC_FUNC_DEF(thread_local_var_alloc_func, tls_struct); typedef THREAD_LOCAL_VAR_ALLOC_FUNC_DEF(thread_local_var_alloc_func, ptr);
#define THREAD_LOCAL_VAR_RELEASE_FUNC_DEF(name, arg_name) void name(void *arg_name) #define THREAD_LOCAL_VAR_RELEASE_FUNC_DEF(name, arg_name) void name(void *arg_name)
typedef THREAD_LOCAL_VAR_RELEASE_FUNC_DEF(thread_local_var_release_func, tls_struct); typedef THREAD_LOCAL_VAR_RELEASE_FUNC_DEF(thread_local_var_release_func, ptr);
struct thread_local_var_meta { struct thread_local_var_meta {
struct atomic_u64 id_plus_one; struct atomic_u64 id_plus_one;

View File

@ -6,7 +6,7 @@
#include "memory.h" #include "memory.h"
#include "string.h" #include "string.h"
#include "log.h" #include "log.h"
#include "tls.h" #include "thread_local.h"
/* Terminology: /* Terminology:
* *