diff options
author | Pedro J. Estébanez <pedrojrulez@gmail.com> | 2024-09-10 11:08:51 +0200 |
---|---|---|
committer | Pedro J. Estébanez <pedrojrulez@gmail.com> | 2024-09-10 11:08:51 +0200 |
commit | 2d1dd41ef5dcb51ddb607ba572e63b605b9191be (patch) | |
tree | 345b1d6ca7786cb36a72badfcdfd50e4afc11bcb /core | |
parent | d0dc3896ad6fe039e4ad0607d901c81197cb3a3b (diff) | |
download | redot-engine-2d1dd41ef5dcb51ddb607ba572e63b605b9191be.tar.gz |
WorkerThreadPool: Enhance lifetime for more flexibility
Diffstat (limited to 'core')
-rw-r--r-- | core/object/worker_thread_pool.cpp | 5 | ||||
-rw-r--r-- | core/register_core_types.cpp | 8 |
2 files changed, 5 insertions, 8 deletions
diff --git a/core/object/worker_thread_pool.cpp b/core/object/worker_thread_pool.cpp index fe7bbd474c..da503966b1 100644 --- a/core/object/worker_thread_pool.cpp +++ b/core/object/worker_thread_pool.cpp @@ -326,6 +326,8 @@ WorkerThreadPool::TaskID WorkerThreadPool::add_native_task(void (*p_func)(void * } WorkerThreadPool::TaskID WorkerThreadPool::_add_task(const Callable &p_callable, void (*p_func)(void *), void *p_userdata, BaseTemplateUserdata *p_template_userdata, bool p_high_priority, const String &p_description) { + ERR_FAIL_COND_V_MSG(threads.is_empty(), INVALID_TASK_ID, "Can't add a task because the WorkerThreadPool is either not initialized yet or already terminated."); + task_mutex.lock(); // Get a free task Task *task = task_allocator.alloc(); @@ -538,6 +540,7 @@ void WorkerThreadPool::notify_yield_over(TaskID p_task_id) { } WorkerThreadPool::GroupID WorkerThreadPool::_add_group_task(const Callable &p_callable, void (*p_func)(void *, uint32_t), void *p_userdata, BaseTemplateUserdata *p_template_userdata, int p_elements, int p_tasks, bool p_high_priority, const String &p_description) { + ERR_FAIL_COND_V_MSG(threads.is_empty(), INVALID_TASK_ID, "Can't add a group task because the WorkerThreadPool is either not initialized yet or already terminated."); ERR_FAIL_COND_V(p_elements < 0, INVALID_TASK_ID); if (p_tasks < 0) { p_tasks = MAX(1u, threads.size()); @@ -749,5 +752,5 @@ WorkerThreadPool::WorkerThreadPool() { } WorkerThreadPool::~WorkerThreadPool() { - finish(); + DEV_ASSERT(threads.size() == 0 && "finish() hasn't been called!"); } diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index c866ff0415..220ed9da31 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -107,8 +107,6 @@ static Time *_time = nullptr; static core_bind::Geometry2D *_geometry_2d = nullptr; static core_bind::Geometry3D *_geometry_3d = nullptr; -static WorkerThreadPool *worker_thread_pool = nullptr; - extern Mutex _global_mutex; static GDExtensionManager *gdextension_manager = nullptr; @@ -297,8 +295,6 @@ void register_core_types() { GDREGISTER_NATIVE_STRUCT(AudioFrame, "float left;float right"); GDREGISTER_NATIVE_STRUCT(ScriptLanguageExtensionProfilingInfo, "StringName signature;uint64_t call_count;uint64_t total_time;uint64_t self_time"); - worker_thread_pool = memnew(WorkerThreadPool); - OS::get_singleton()->benchmark_end_measure("Core", "Register Types"); } @@ -349,7 +345,7 @@ void register_core_singletons() { Engine::get_singleton()->add_singleton(Engine::Singleton("Time", Time::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("GDExtensionManager", GDExtensionManager::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("ResourceUID", ResourceUID::get_singleton())); - Engine::get_singleton()->add_singleton(Engine::Singleton("WorkerThreadPool", worker_thread_pool)); + Engine::get_singleton()->add_singleton(Engine::Singleton("WorkerThreadPool", WorkerThreadPool::get_singleton())); OS::get_singleton()->benchmark_end_measure("Core", "Register Singletons"); } @@ -382,8 +378,6 @@ void unregister_core_types() { // Destroy singletons in reverse order to ensure dependencies are not broken. - memdelete(worker_thread_pool); - memdelete(_engine_debugger); memdelete(_marshalls); memdelete(_classdb); |