summaryrefslogtreecommitdiffstats
path: root/core/object/script_language.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-09-11 12:35:07 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-09-11 12:35:07 +0200
commit658b8a8704cba0b9119f63e26250095206e56b43 (patch)
treeb081144c02bd117512a98a41ee5f8ee3c80af1e4 /core/object/script_language.cpp
parent63021b0d91584f71be40e27c5defb53aabe7815a (diff)
parentc8acf561ef0c66c03d9e15e46e753c98ab485050 (diff)
downloadredot-engine-658b8a8704cba0b9119f63e26250095206e56b43.tar.gz
Merge pull request #96760 from RandomShaper/wtp_langs_exit_thread
Make use of languages' thread enter/exit more correct
Diffstat (limited to 'core/object/script_language.cpp')
-rw-r--r--core/object/script_language.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp
index 57e5195137..d5b7bc768d 100644
--- a/core/object/script_language.cpp
+++ b/core/object/script_language.cpp
@@ -41,6 +41,7 @@ ScriptLanguage *ScriptServer::_languages[MAX_LANGUAGES];
int ScriptServer::_language_count = 0;
bool ScriptServer::languages_ready = false;
Mutex ScriptServer::languages_mutex;
+thread_local bool ScriptServer::thread_entered = false;
bool ScriptServer::scripting_enabled = true;
bool ScriptServer::reload_scripts_on_save = false;
@@ -326,6 +327,10 @@ bool ScriptServer::are_languages_initialized() {
return languages_ready;
}
+bool ScriptServer::thread_is_entered() {
+ return thread_entered;
+}
+
void ScriptServer::set_reload_scripts_on_save(bool p_enable) {
reload_scripts_on_save = p_enable;
}
@@ -335,6 +340,10 @@ bool ScriptServer::is_reload_scripts_on_save_enabled() {
}
void ScriptServer::thread_enter() {
+ if (thread_entered) {
+ return;
+ }
+
MutexLock lock(languages_mutex);
if (!languages_ready) {
return;
@@ -342,9 +351,15 @@ void ScriptServer::thread_enter() {
for (int i = 0; i < _language_count; i++) {
_languages[i]->thread_enter();
}
+
+ thread_entered = true;
}
void ScriptServer::thread_exit() {
+ if (!thread_entered) {
+ return;
+ }
+
MutexLock lock(languages_mutex);
if (!languages_ready) {
return;
@@ -352,6 +367,8 @@ void ScriptServer::thread_exit() {
for (int i = 0; i < _language_count; i++) {
_languages[i]->thread_exit();
}
+
+ thread_entered = false;
}
HashMap<StringName, ScriptServer::GlobalScriptClass> ScriptServer::global_classes;