Просмотр исходного кода

obs-scripting: Fix script state variable being reset by tick callback

When loading a new Python script, the GIL might be released while
importing the module, allowing the tick to run and change and reset the
cur_python_script state variable. Use the busy_script variable to save
and restore the value if not null.
PatTheMav 3 лет назад
Родитель
Сommit
0af8bdb350
1 измененных файлов с 13 добавлено и 0 удалено
  1. 13 0
      deps/obs-scripting/obs-scripting-python.c

+ 13 - 0
deps/obs-scripting/obs-scripting-python.c

@@ -1514,6 +1514,11 @@ void obs_python_script_save(obs_script_t *s)
 static void python_tick(void *param, float seconds)
 {
 	struct obs_python_script *data;
+	/* When loading a new Python script, the GIL might be released while importing the module,
+     allowing the tick to run and change and reset the cur_python_script state variable. Use the
+     busy_script variable to save and restore the value if not null.
+     */
+	struct obs_python_script *busy_script;
 	bool valid;
 	uint64_t ts = obs_get_video_frame_time();
 
@@ -1531,6 +1536,10 @@ static void python_tick(void *param, float seconds)
 
 		pthread_mutex_lock(&tick_mutex);
 		data = first_tick_script;
+
+		if (cur_python_script)
+			busy_script = cur_python_script;
+
 		while (data) {
 			cur_python_script = data;
 
@@ -1543,6 +1552,10 @@ static void python_tick(void *param, float seconds)
 		}
 
 		cur_python_script = NULL;
+		if (busy_script) {
+			cur_python_script = busy_script;
+			busy_script = NULL;
+		}
 
 		pthread_mutex_unlock(&tick_mutex);