mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-03 22:28:46 +00:00
Multithread checker
This commit is contained in:
+5
-59
@@ -1,5 +1,3 @@
|
|||||||
#define MULTITHREAD_CHECKER 1
|
|
||||||
|
|
||||||
#include "entity.cpp"
|
#include "entity.cpp"
|
||||||
#include "types.cpp"
|
#include "types.cpp"
|
||||||
|
|
||||||
@@ -1943,7 +1941,7 @@ gb_internal void check_procedure_later(Checker *c, ProcInfo *info) {
|
|||||||
GB_ASSERT(info != nullptr);
|
GB_ASSERT(info != nullptr);
|
||||||
GB_ASSERT(info->decl != nullptr);
|
GB_ASSERT(info->decl != nullptr);
|
||||||
|
|
||||||
if (MULTITHREAD_CHECKER && global_procedure_body_in_worker_queue) {
|
if (global_procedure_body_in_worker_queue) {
|
||||||
thread_pool_add_task(check_proc_info_worker_proc, info);
|
thread_pool_add_task(check_proc_info_worker_proc, info);
|
||||||
} else {
|
} else {
|
||||||
GB_ASSERT(global_procedure_body_in_worker_queue == false);
|
GB_ASSERT(global_procedure_body_in_worker_queue == false);
|
||||||
@@ -4617,51 +4615,6 @@ gb_internal void check_create_file_scopes(Checker *c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ThreadProcCheckerSection {
|
|
||||||
Checker *checker;
|
|
||||||
isize offset;
|
|
||||||
isize count;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
gb_internal void check_with_workers(Checker *c, WorkerTaskProc *proc, isize total_count) {
|
|
||||||
isize thread_count = global_thread_pool.threads.count;
|
|
||||||
isize worker_count = thread_count-1; // NOTE(bill): The main thread will also be used for work
|
|
||||||
if (!build_context.threaded_checker) {
|
|
||||||
worker_count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
semaphore_post(&c->info.collect_semaphore, cast(i32)thread_count);
|
|
||||||
if (worker_count == 0) {
|
|
||||||
ThreadProcCheckerSection section_all = {};
|
|
||||||
section_all.checker = c;
|
|
||||||
section_all.offset = 0;
|
|
||||||
section_all.count = total_count;
|
|
||||||
proc(§ion_all);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
isize file_load_count = (total_count+thread_count-1)/thread_count;
|
|
||||||
isize remaining_count = total_count;
|
|
||||||
|
|
||||||
ThreadProcCheckerSection *thread_data = gb_alloc_array(permanent_allocator(), ThreadProcCheckerSection, thread_count);
|
|
||||||
for (isize i = 0; i < thread_count; i++) {
|
|
||||||
ThreadProcCheckerSection *data = thread_data + i;
|
|
||||||
data->checker = c;
|
|
||||||
data->offset = total_count-remaining_count;
|
|
||||||
data->count = file_load_count;
|
|
||||||
remaining_count -= file_load_count;
|
|
||||||
}
|
|
||||||
GB_ASSERT(remaining_count <= 0);
|
|
||||||
|
|
||||||
|
|
||||||
for (isize i = 0; i < thread_count; i++) {
|
|
||||||
thread_pool_add_task(proc, thread_data+i);
|
|
||||||
}
|
|
||||||
thread_pool_wait();
|
|
||||||
semaphore_wait(&c->info.collect_semaphore);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct CollectEntityWorkerData {
|
struct CollectEntityWorkerData {
|
||||||
Checker *c;
|
Checker *c;
|
||||||
CheckerContext ctx;
|
CheckerContext ctx;
|
||||||
@@ -4699,18 +4652,11 @@ gb_internal void check_collect_entities_all(Checker *c) {
|
|||||||
map_init(&wd->untyped, heap_allocator());
|
map_init(&wd->untyped, heap_allocator());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MULTITHREAD_CHECKER || build_context.threaded_checker) {
|
for (auto const &entry : c->info.files.entries) {
|
||||||
for (auto const &entry : c->info.files.entries) {
|
AstFile *f = entry.value;
|
||||||
AstFile *f = entry.value;
|
thread_pool_add_task(check_collect_entities_all_worker_proc, f);
|
||||||
thread_pool_add_task(check_collect_entities_all_worker_proc, f);
|
|
||||||
}
|
|
||||||
thread_pool_wait();
|
|
||||||
} else {
|
|
||||||
for (auto const &entry : c->info.files.entries) {
|
|
||||||
AstFile *f = entry.value;
|
|
||||||
check_collect_entities_all_worker_proc(f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
thread_pool_wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
gb_internal void check_export_entities_in_pkg(CheckerContext *ctx, AstPackage *pkg, UntypedExprInfoMap *untyped) {
|
gb_internal void check_export_entities_in_pkg(CheckerContext *ctx, AstPackage *pkg, UntypedExprInfoMap *untyped) {
|
||||||
|
|||||||
Reference in New Issue
Block a user