diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index ad0c1b0..55e9c86 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -7,5 +7,5 @@ project(TardisLang) file(GLOB SRC_FILES "${PROJECT_SOURCE_DIR}/*.c") add_executable(TardisLang ${SRC_FILES}) -set_property(TARGET TardisLang PROPERTY C_STANDARD 99) +set_property(TARGET TardisLang PROPERTY C_STANDARD 11) target_compile_options(TardisLang PRIVATE -Wall -Wextra -Wpedantic -Werror -fwrapv -fno-strict-aliasing -fsigned-char) diff --git a/lang/main.c b/lang/main.c index c63171d..1fd46c9 100644 --- a/lang/main.c +++ b/lang/main.c @@ -4,6 +4,8 @@ #include #include #include +#include +#include #define SYMBOL_LEN 32 #define SYMBOLS_MAX 32 @@ -13,29 +15,33 @@ } symbol; symbol symbols[SYMBOLS_MAX] = {0}; +mtx_t symbols_lock; int find_symbol(char *name) { - // TODO: thread safety + mtx_lock(&symbols_lock); for(int i = 0; i < SYMBOLS_MAX; ++i) { symbol *curr_sym = &symbols[i]; char *curr_name = curr_sym->name; if(curr_name[0] == 0) { strncpy(curr_name, name, SYMBOL_LEN); + mtx_unlock(&symbols_lock); return i; } else { int cmp = strncmp(curr_name, name, SYMBOL_LEN); if(cmp == 0) { + mtx_unlock(&symbols_lock); return i; } } } + mtx_unlock(&symbols_lock); printf("ERROR: ran out of symbols\n"); abort(); } typedef struct { int value; - int refcount; + atomic_int refcount; } object; object *create_object(int value) { @@ -50,11 +56,10 @@ } void drop_object(object **objptr) { - // TODO: thread safety if(*objptr) { object *obj = *objptr; - obj->refcount--; - if(obj->refcount == 0) { + atomic_int count = atomic_fetch_sub_explicit(&obj->refcount, 1, memory_order_relaxed); + if(count == 1) { printf("freeing %p\n", (void*)obj); free(obj); } @@ -84,6 +89,7 @@ } int main(void) { + mtx_init(&symbols_lock, mtx_plain); printf("Hello world!\n"); printf("symb %i\n", find_symbol("a")); printf("symb %i\n", find_symbol("b"));