diff --git a/modules/nativescript/nativescript.cpp b/modules/nativescript/nativescript.cpp index e7445e6da9d..49806a8e8cd 100644 --- a/modules/nativescript/nativescript.cpp +++ b/modules/nativescript/nativescript.cpp @@ -1057,9 +1057,21 @@ void NativeScriptLanguage::unregister_script(NativeScript *script) { #endif } -#ifndef NO_THREADS +void NativeScriptLanguage::call_libraries_cb(const StringName &name) { + // library_gdnatives is modified only from the main thread, so it's safe not to use mutex here + for (Map >::Element *L = library_gdnatives.front(); L; L = L->next()) { + L->get()->call_native_raw( + _noarg_call_type, + name, + NULL, + 0, + NULL, + NULL); + } +} void NativeScriptLanguage::frame() { +#ifndef NO_THREADS if (has_objects_to_register) { MutexLock lock(mutex); for (Set >::Element *L = libs_to_init.front(); L; L = L->next()) { @@ -1072,44 +1084,18 @@ void NativeScriptLanguage::frame() { scripts_to_register.clear(); has_objects_to_register = false; } +#endif + call_libraries_cb(_frame_call_name); } +#ifndef NO_THREADS + void NativeScriptLanguage::thread_enter() { - Vector > libs; - { - MutexLock lock(mutex); - for (Map >::Element *L = library_gdnatives.front(); L; L = L->next()) { - libs.push_back(L->get()); - } - } - for (int i = 0; i < libs.size(); ++i) { - libs[i]->call_native_raw( - _thread_cb_call_type, - _thread_enter_call_name, - NULL, - 0, - NULL, - NULL); - } + call_libraries_cb(_thread_enter_call_name); } void NativeScriptLanguage::thread_exit() { - Vector > libs; - { - MutexLock lock(mutex); - for (Map >::Element *L = library_gdnatives.front(); L; L = L->next()) { - libs.push_back(L->get()); - } - } - for (int i = 0; i < libs.size(); ++i) { - libs[i]->call_native_raw( - _thread_cb_call_type, - _thread_exit_call_name, - NULL, - 0, - NULL, - NULL); - } + call_libraries_cb(_thread_exit_call_name); } #endif // NO_THREADS diff --git a/modules/nativescript/nativescript.h b/modules/nativescript/nativescript.h index 95b49541719..c60effd0c1c 100644 --- a/modules/nativescript/nativescript.h +++ b/modules/nativescript/nativescript.h @@ -220,7 +220,10 @@ private: void register_script(NativeScript *script); void unregister_script(NativeScript *script); + void call_libraries_cb(const StringName &name); + public: + // These two maps must only be touched on the main thread Map > library_classes; Map > library_gdnatives; @@ -229,9 +232,14 @@ public: const StringName _init_call_type = "nativescript_init"; const StringName _init_call_name = "godot_nativescript_init"; - const StringName _thread_cb_call_type = "godot_nativescript_thread_cb"; + const StringName _noarg_call_type = "nativescript_no_arg"; + + const StringName _frame_call_name = "godot_nativescript_frame"; + +#ifndef NO_THREADS const StringName _thread_enter_call_name = "godot_nativescript_thread_enter"; const StringName _thread_exit_call_name = "godot_nativescript_thread_exit"; +#endif NativeScriptLanguage(); ~NativeScriptLanguage(); @@ -245,9 +253,9 @@ public: #ifndef NO_THREADS virtual void thread_enter(); virtual void thread_exit(); +#endif virtual void frame(); -#endif virtual String get_name() const; virtual void init(); diff --git a/modules/nativescript/register_types.cpp b/modules/nativescript/register_types.cpp index dfa16d8a2a7..c28b9828847 100644 --- a/modules/nativescript/register_types.cpp +++ b/modules/nativescript/register_types.cpp @@ -62,13 +62,11 @@ void init_call_cb(void *p_handle, godot_string *p_proc_name, void *p_data, int p fn(args[0]); } -#ifndef NO_THREADS - typedef void (*native_script_empty_callback)(); -void thread_call_cb(void *p_handle, godot_string *p_proc_name, void *p_data, int p_num_args, void **args, void *r_ret) { +void noarg_call_cb(void *p_handle, godot_string *p_proc_name, void *p_data, int p_num_args, void **args, void *r_ret) { if (p_handle == NULL) { - ERR_PRINT("No valid library handle, can't call nativescript thread enter/exit callback"); + ERR_PRINT("No valid library handle, can't call nativescript callback"); return; } @@ -87,8 +85,6 @@ void thread_call_cb(void *p_handle, godot_string *p_proc_name, void *p_data, int fn(); } -#endif // NO_THREADS - ResourceFormatLoaderNativeScript *resource_loader_gdns = NULL; ResourceFormatSaverNativeScript *resource_saver_gdns = NULL; @@ -100,9 +96,7 @@ void register_nativescript_types() { ScriptServer::register_language(native_script_language); GDNativeCallRegistry::singleton->register_native_raw_call_type(native_script_language->_init_call_type, init_call_cb); -#ifndef NO_THREADS - GDNativeCallRegistry::singleton->register_native_raw_call_type(native_script_language->_thread_cb_call_type, thread_call_cb); -#endif + GDNativeCallRegistry::singleton->register_native_raw_call_type(native_script_language->_noarg_call_type, noarg_call_cb); resource_saver_gdns = memnew(ResourceFormatSaverNativeScript); ResourceSaver::add_resource_format_saver(resource_saver_gdns);