Correct did you mean logic and make thread-safe-er

This commit is contained in:
gingerBill
2021-08-27 11:18:38 +01:00
parent 53556d9bd2
commit 582559f7ac
5 changed files with 38 additions and 21 deletions
+3 -2
View File
@@ -476,7 +476,7 @@ String odin_root_dir(void) {
return global_module_path; return global_module_path;
} }
gbAllocator a = heap_allocator(); gbAllocator a = permanent_allocator();
char const *found = gb_get_env("ODIN_ROOT", a); char const *found = gb_get_env("ODIN_ROOT", a);
if (found) { if (found) {
String path = path_to_full_path(a, make_string_c(found)); String path = path_to_full_path(a, make_string_c(found));
@@ -679,7 +679,8 @@ String path_to_fullpath(gbAllocator a, String s) {
mutex_lock(&fullpath_mutex); mutex_lock(&fullpath_mutex);
defer (mutex_unlock(&fullpath_mutex)); defer (mutex_unlock(&fullpath_mutex));
String16 string16 = string_to_string16(temporary_allocator(), s); String16 string16 = string_to_string16(heap_allocator(), s);
defer (gb_free(heap_allocator(), string16.text));
DWORD len = GetFullPathNameW(&string16[0], 0, nullptr, nullptr); DWORD len = GetFullPathNameW(&string16[0], 0, nullptr, nullptr);
if (len != 0) { if (len != 0) {
+8
View File
@@ -3726,7 +3726,12 @@ void check_did_you_mean_print(DidYouMeanAnswers *d) {
} }
} }
gb_global BlockingMutex did_you_mean_mutex;
void check_did_you_mean_type(String const &name, Array<Entity *> const &fields) { void check_did_you_mean_type(String const &name, Array<Entity *> const &fields) {
mutex_lock(&did_you_mean_mutex);
defer (mutex_unlock(&did_you_mean_mutex));
DidYouMeanAnswers d = did_you_mean_make(heap_allocator(), fields.count, name); DidYouMeanAnswers d = did_you_mean_make(heap_allocator(), fields.count, name);
defer (did_you_mean_destroy(&d)); defer (did_you_mean_destroy(&d));
@@ -3737,6 +3742,9 @@ void check_did_you_mean_type(String const &name, Array<Entity *> const &fields)
} }
void check_did_you_mean_scope(String const &name, Scope *scope) { void check_did_you_mean_scope(String const &name, Scope *scope) {
mutex_lock(&did_you_mean_mutex);
defer (mutex_unlock(&did_you_mean_mutex));
DidYouMeanAnswers d = did_you_mean_make(heap_allocator(), scope->elements.entries.count, name); DidYouMeanAnswers d = did_you_mean_make(heap_allocator(), scope->elements.entries.count, name);
defer (did_you_mean_destroy(&d)); defer (did_you_mean_destroy(&d));
+14 -1
View File
@@ -656,7 +656,16 @@ AstPackage *get_core_package(CheckerInfo *info, String name) {
String path = get_fullpath_core(a, name); String path = get_fullpath_core(a, name);
defer (gb_free(a, path.text)); defer (gb_free(a, path.text));
auto found = string_map_get(&info->packages, path); auto found = string_map_get(&info->packages, path);
GB_ASSERT_MSG(found != nullptr, "Missing core package %.*s", LIT(name)); if (found == nullptr) {
gb_printf_err("Name: %.*s\n", LIT(name));
gb_printf_err("Fullpath: %.*s\n", LIT(path));
for_array(i, info->packages.entries) {
auto *entry = &info->packages.entries[i];
gb_printf_err("%.*s\n", LIT(entry->key.string));
}
GB_ASSERT_MSG(found != nullptr, "Missing core package %.*s", LIT(name));
}
return *found; return *found;
} }
@@ -4579,8 +4588,10 @@ bool check_proc_info(Checker *c, ProcInfo *pi, UntypedExprInfoMap *untyped, Proc
ctx.procs_to_check_queue = procs_to_check_queue; ctx.procs_to_check_queue = procs_to_check_queue;
GB_ASSERT(procs_to_check_queue != nullptr); GB_ASSERT(procs_to_check_queue != nullptr);
GB_ASSERT(pi->type->kind == Type_Proc);
TypeProc *pt = &pi->type->Proc; TypeProc *pt = &pi->type->Proc;
String name = pi->token.string; String name = pi->token.string;
if (pt->is_polymorphic && !pt->is_poly_specialized) { if (pt->is_polymorphic && !pt->is_poly_specialized) {
Token token = pi->token; Token token = pi->token;
if (pi->poly_def_node != nullptr) { if (pi->poly_def_node != nullptr) {
@@ -4659,6 +4670,7 @@ void check_unchecked_bodies(Checker *c) {
continue; continue;
} }
debugf("unchecked: %.*s\n", LIT(e->token.string));
mpmc_enqueue(&c->procs_to_check_queue, pi); mpmc_enqueue(&c->procs_to_check_queue, pi);
} }
} }
@@ -4762,6 +4774,7 @@ void check_procedure_bodies(Checker *c) {
if (!build_context.threaded_checker) { if (!build_context.threaded_checker) {
worker_count = 0; worker_count = 0;
} }
worker_count = 0;
if (worker_count == 0) { if (worker_count == 0) {
auto *this_queue = &c->procs_to_check_queue; auto *this_queue = &c->procs_to_check_queue;
+9 -10
View File
@@ -57,8 +57,8 @@ struct MemoryBlock {
}; };
struct Arena { struct Arena {
MemoryBlock * curr_block; MemoryBlock *curr_block;
isize minimum_block_size; isize minimum_block_size;
bool use_local_mutex; bool use_local_mutex;
BlockingMutex local_mutex; BlockingMutex local_mutex;
}; };
@@ -69,8 +69,14 @@ gb_global isize DEFAULT_PAGE_SIZE = 4096;
MemoryBlock *virtual_memory_alloc(isize size); MemoryBlock *virtual_memory_alloc(isize size);
void virtual_memory_dealloc(MemoryBlock *block); void virtual_memory_dealloc(MemoryBlock *block);
void *arena_alloc(Arena *arena, isize min_size, isize alignment);
void arena_free_all(Arena *arena); void arena_free_all(Arena *arena);
void arena_init_local_mutex(Arena *arena) {
mutex_init(&arena->local_mutex);
arena->use_local_mutex = true;
}
isize arena_align_forward_offset(Arena *arena, isize alignment) { isize arena_align_forward_offset(Arena *arena, isize alignment) {
isize alignment_offset = 0; isize alignment_offset = 0;
isize ptr = cast(isize)(arena->curr_block->base + arena->curr_block->used); isize ptr = cast(isize)(arena->curr_block->base + arena->curr_block->used);
@@ -81,17 +87,9 @@ isize arena_align_forward_offset(Arena *arena, isize alignment) {
return alignment_offset; return alignment_offset;
} }
void arena_init_local_mutex(Arena *arena) {
mutex_init(&arena->local_mutex);
arena->use_local_mutex = true;
}
void *arena_alloc(Arena *arena, isize min_size, isize alignment) { void *arena_alloc(Arena *arena, isize min_size, isize alignment) {
GB_ASSERT(gb_is_power_of_two(alignment)); GB_ASSERT(gb_is_power_of_two(alignment));
BlockingMutex *mutex = &global_memory_allocator_mutex; BlockingMutex *mutex = &global_memory_allocator_mutex;
if (arena->use_local_mutex) { if (arena->use_local_mutex) {
mutex = &arena->local_mutex; mutex = &arena->local_mutex;
@@ -289,6 +287,7 @@ GB_ALLOCATOR_PROC(arena_allocator_proc) {
} }
break; break;
case gbAllocation_FreeAll: case gbAllocation_FreeAll:
GB_PANIC("use arena_free_all directly");
arena_free_all(arena); arena_free_all(arena);
break; break;
} }
+2 -6
View File
@@ -2019,6 +2019,7 @@ int main(int arg_count, char const **arg_ptr) {
virtual_memory_init(); virtual_memory_init();
mutex_init(&fullpath_mutex); mutex_init(&fullpath_mutex);
mutex_init(&hash_exact_value_mutex); mutex_init(&hash_exact_value_mutex);
mutex_init(&did_you_mean_mutex);
init_string_buffer_memory(); init_string_buffer_memory();
init_string_interner(); init_string_interner();
@@ -2199,8 +2200,6 @@ int main(int arg_count, char const **arg_ptr) {
return 1; return 1;
} }
arena_free_all(&temporary_arena);
TIME_SECTION("type check"); TIME_SECTION("type check");
checker->parser = parser; checker->parser = parser;
@@ -2212,8 +2211,6 @@ int main(int arg_count, char const **arg_ptr) {
return 1; return 1;
} }
arena_free_all(&temporary_arena);
if (build_context.generate_docs) { if (build_context.generate_docs) {
if (global_error_collector.count != 0) { if (global_error_collector.count != 0) {
return 1; return 1;
@@ -2249,8 +2246,6 @@ int main(int arg_count, char const **arg_ptr) {
} }
lb_generate_code(gen); lb_generate_code(gen);
arena_free_all(&temporary_arena);
switch (build_context.build_mode) { switch (build_context.build_mode) {
case BuildMode_Executable: case BuildMode_Executable:
case BuildMode_DynamicLibrary: case BuildMode_DynamicLibrary:
@@ -2269,6 +2264,7 @@ int main(int arg_count, char const **arg_ptr) {
} }
remove_temp_files(gen); remove_temp_files(gen);
arena_free_all(&temporary_arena);
if (run_output) { if (run_output) {
#if defined(GB_SYSTEM_WINDOWS) #if defined(GB_SYSTEM_WINDOWS)