aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-08-27 11:18:38 +0100
committergingerBill <bill@gingerbill.org>2021-08-27 11:18:38 +0100
commit582559f7ac54b62cbdccf6f396f072b15a950664 (patch)
tree987c4d69ebf5aa2e8d5be414f49666fbbfa42daa /src
parent53556d9bd261272137256af9a5716dc26453337b (diff)
Correct did you mean logic and make thread-safe-er
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp5
-rw-r--r--src/check_expr.cpp8
-rw-r--r--src/checker.cpp19
-rw-r--r--src/common_memory.cpp19
-rw-r--r--src/main.cpp8
5 files changed, 38 insertions, 21 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index f3cc45ae8..5d93ab1ca 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -476,7 +476,7 @@ String odin_root_dir(void) {
return global_module_path;
}
- gbAllocator a = heap_allocator();
+ gbAllocator a = permanent_allocator();
char const *found = gb_get_env("ODIN_ROOT", a);
if (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);
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);
if (len != 0) {
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index f77f375b0..32bde44c8 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -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) {
+ mutex_lock(&did_you_mean_mutex);
+ defer (mutex_unlock(&did_you_mean_mutex));
+
DidYouMeanAnswers d = did_you_mean_make(heap_allocator(), fields.count, name);
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) {
+ 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);
defer (did_you_mean_destroy(&d));
diff --git a/src/checker.cpp b/src/checker.cpp
index e3af570f8..5544ef58e 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -656,7 +656,16 @@ AstPackage *get_core_package(CheckerInfo *info, String name) {
String path = get_fullpath_core(a, name);
defer (gb_free(a, path.text));
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;
}
@@ -4578,9 +4587,11 @@ bool check_proc_info(Checker *c, ProcInfo *pi, UntypedExprInfoMap *untyped, Proc
ctx.decl = pi->decl;
ctx.procs_to_check_queue = procs_to_check_queue;
GB_ASSERT(procs_to_check_queue != nullptr);
-
+
+ GB_ASSERT(pi->type->kind == Type_Proc);
TypeProc *pt = &pi->type->Proc;
String name = pi->token.string;
+
if (pt->is_polymorphic && !pt->is_poly_specialized) {
Token token = pi->token;
if (pi->poly_def_node != nullptr) {
@@ -4658,7 +4669,8 @@ void check_unchecked_bodies(Checker *c) {
if (pi->body == nullptr) {
continue;
}
-
+
+ debugf("unchecked: %.*s\n", LIT(e->token.string));
mpmc_enqueue(&c->procs_to_check_queue, pi);
}
}
@@ -4762,6 +4774,7 @@ void check_procedure_bodies(Checker *c) {
if (!build_context.threaded_checker) {
worker_count = 0;
}
+ worker_count = 0;
if (worker_count == 0) {
auto *this_queue = &c->procs_to_check_queue;
diff --git a/src/common_memory.cpp b/src/common_memory.cpp
index dfc86b5f3..8d1161f25 100644
--- a/src/common_memory.cpp
+++ b/src/common_memory.cpp
@@ -57,8 +57,8 @@ struct MemoryBlock {
};
struct Arena {
- MemoryBlock * curr_block;
- isize minimum_block_size;
+ MemoryBlock *curr_block;
+ isize minimum_block_size;
bool use_local_mutex;
BlockingMutex local_mutex;
};
@@ -69,8 +69,14 @@ gb_global isize DEFAULT_PAGE_SIZE = 4096;
MemoryBlock *virtual_memory_alloc(isize size);
void virtual_memory_dealloc(MemoryBlock *block);
+void *arena_alloc(Arena *arena, isize min_size, isize alignment);
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 alignment_offset = 0;
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;
}
-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) {
GB_ASSERT(gb_is_power_of_two(alignment));
-
BlockingMutex *mutex = &global_memory_allocator_mutex;
if (arena->use_local_mutex) {
mutex = &arena->local_mutex;
@@ -289,6 +287,7 @@ GB_ALLOCATOR_PROC(arena_allocator_proc) {
}
break;
case gbAllocation_FreeAll:
+ GB_PANIC("use arena_free_all directly");
arena_free_all(arena);
break;
}
diff --git a/src/main.cpp b/src/main.cpp
index 505451141..7ef4a6bbb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2019,6 +2019,7 @@ int main(int arg_count, char const **arg_ptr) {
virtual_memory_init();
mutex_init(&fullpath_mutex);
mutex_init(&hash_exact_value_mutex);
+ mutex_init(&did_you_mean_mutex);
init_string_buffer_memory();
init_string_interner();
@@ -2199,8 +2200,6 @@ int main(int arg_count, char const **arg_ptr) {
return 1;
}
- arena_free_all(&temporary_arena);
-
TIME_SECTION("type check");
checker->parser = parser;
@@ -2212,8 +2211,6 @@ int main(int arg_count, char const **arg_ptr) {
return 1;
}
- arena_free_all(&temporary_arena);
-
if (build_context.generate_docs) {
if (global_error_collector.count != 0) {
return 1;
@@ -2249,8 +2246,6 @@ int main(int arg_count, char const **arg_ptr) {
}
lb_generate_code(gen);
- arena_free_all(&temporary_arena);
-
switch (build_context.build_mode) {
case BuildMode_Executable:
case BuildMode_DynamicLibrary:
@@ -2269,6 +2264,7 @@ int main(int arg_count, char const **arg_ptr) {
}
remove_temp_files(gen);
+ arena_free_all(&temporary_arena);
if (run_output) {
#if defined(GB_SYSTEM_WINDOWS)