Clarify ThreadPool interface; Move import_mutex guarding to just the string set

This commit is contained in:
gingerBill
2022-12-20 12:46:33 +00:00
parent a13e2f4578
commit 0edda2bea7
2 changed files with 18 additions and 8 deletions
+6 -8
View File
@@ -4966,14 +4966,12 @@ gb_internal void parser_add_foreign_file_to_process(Parser *p, AstPackage *pkg,
gb_internal AstPackage *try_add_import_path(Parser *p, String const &path, String const &rel_path, TokenPos pos, PackageKind kind = Package_Normal) { gb_internal AstPackage *try_add_import_path(Parser *p, String const &path, String const &rel_path, TokenPos pos, PackageKind kind = Package_Normal) {
String const FILE_EXT = str_lit(".odin"); String const FILE_EXT = str_lit(".odin");
mutex_lock(&p->import_mutex); MUTEX_GUARD_BLOCK(&p->import_mutex) {
defer (mutex_unlock(&p->import_mutex)); if (string_set_exists(&p->imported_files, path)) {
return nullptr;
if (string_set_exists(&p->imported_files, path)) { }
return nullptr; string_set_add(&p->imported_files, path);
} }
string_set_add(&p->imported_files, path);
AstPackage *pkg = gb_alloc_item(permanent_allocator(), AstPackage); AstPackage *pkg = gb_alloc_item(permanent_allocator(), AstPackage);
pkg->kind = kind; pkg->kind = kind;
@@ -4991,8 +4989,8 @@ gb_internal AstPackage *try_add_import_path(Parser *p, String const &path, Strin
fi.is_dir = false; fi.is_dir = false;
pkg->is_single_file = true; pkg->is_single_file = true;
parser_add_file_to_process(p, pkg, fi, pos);
parser_add_package(p, pkg); parser_add_package(p, pkg);
parser_add_file_to_process(p, pkg, fi, pos);
return pkg; return pkg;
} }
+12
View File
@@ -1,14 +1,25 @@
// thread_pool.cpp // thread_pool.cpp
struct WorkerTask;
struct ThreadPool;
#define WORKER_TASK_PROC(name) isize name(void *data) #define WORKER_TASK_PROC(name) isize name(void *data)
typedef WORKER_TASK_PROC(WorkerTaskProc); typedef WORKER_TASK_PROC(WorkerTaskProc);
gb_internal void thread_pool_init(ThreadPool *pool, gbAllocator const &a, isize thread_count, char const *worker_name);
gb_internal void thread_pool_destroy(ThreadPool *pool);
gb_internal bool thread_pool_add_task(ThreadPool *pool, WorkerTaskProc *proc, void *data);
gb_internal void thread_pool_wait(ThreadPool *pool);
struct WorkerTask { struct WorkerTask {
WorkerTask * next; WorkerTask * next;
WorkerTaskProc *do_work; WorkerTaskProc *do_work;
void * data; void * data;
ThreadPool * pool;
}; };
struct ThreadPool { struct ThreadPool {
gbAllocator allocator; gbAllocator allocator;
BlockingMutex mutex; BlockingMutex mutex;
@@ -89,6 +100,7 @@ gb_internal bool thread_pool_add_task(ThreadPool *pool, WorkerTaskProc *proc, vo
GB_PANIC("Out of memory"); GB_PANIC("Out of memory");
return false; return false;
} }
task->pool = pool;
task->do_work = proc; task->do_work = proc;
task->data = data; task->data = data;