浏览代码

deps/obs-scripting: Fix pthread mutex leaks

jpark37 4 年之前
父节点
当前提交
bc7ecd4527

+ 1 - 5
deps/obs-scripting/obs-scripting-lua-source.c

@@ -641,11 +641,7 @@ static int obs_lua_register_source(lua_State *script)
 	if (!existing) {
 		ls.data = current_lua_script;
 
-		pthread_mutexattr_t mutexattr;
-		pthread_mutexattr_init(&mutexattr);
-		pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
-		pthread_mutex_init(&ls.definition_mutex, &mutexattr);
-		pthread_mutexattr_destroy(&mutexattr);
+		pthread_mutex_init_recursive(&ls.definition_mutex);
 
 		info.type_data = bmemdup(&ls, sizeof(ls));
 		info.free_type_data = obs_lua_source_free_type_data;

+ 5 - 12
deps/obs-scripting/obs-scripting-lua.c

@@ -55,10 +55,10 @@ package.path = package.path .. \";\" .. script_path() .. \"/?.lua\"\n";
 
 static char *startup_script = NULL;
 
-static pthread_mutex_t tick_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t tick_mutex;
 static struct obs_lua_script *first_tick_script = NULL;
 
-pthread_mutex_t lua_source_def_mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t lua_source_def_mutex;
 
 #define ls_get_libobs_obj(type, lua_index, obs_obj)                      \
 	ls_get_libobs_obj_(script, #type " *", lua_index, obs_obj, NULL, \
@@ -242,7 +242,7 @@ struct lua_obs_timer {
 	uint64_t interval;
 };
 
-static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t timer_mutex;
 static struct lua_obs_timer *first_timer = NULL;
 
 static inline void lua_obs_timer_init(struct lua_obs_timer *timer)
@@ -1119,12 +1119,9 @@ obs_script_t *obs_lua_script_create(const char *path, obs_data_t *settings)
 	data->base.type = OBS_SCRIPT_LANG_LUA;
 	data->tick = LUA_REFNIL;
 
-	pthread_mutexattr_t attr;
-	pthread_mutexattr_init(&attr);
 	pthread_mutex_init_value(&data->mutex);
-	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
 
-	if (pthread_mutex_init(&data->mutex, &attr) != 0) {
+	if (pthread_mutex_init_recursive(&data->mutex) != 0) {
 		bfree(data);
 		return NULL;
 	}
@@ -1300,12 +1297,8 @@ void obs_lua_load(void)
 	struct dstr dep_paths = {0};
 	struct dstr tmp = {0};
 
-	pthread_mutexattr_t attr;
-	pthread_mutexattr_init(&attr);
-	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
-
 	pthread_mutex_init(&tick_mutex, NULL);
-	pthread_mutex_init(&timer_mutex, &attr);
+	pthread_mutex_init_recursive(&timer_mutex);
 	pthread_mutex_init(&lua_source_def_mutex, NULL);
 
 	/* ---------------------------------------------- */

+ 11 - 9
deps/obs-scripting/obs-scripting-python.c

@@ -53,8 +53,9 @@ static wchar_t home_path[1024] = {0};
 
 DARRAY(char *) python_paths;
 static bool python_loaded = false;
+static bool mutexes_loaded = false;
 
-static pthread_mutex_t tick_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t tick_mutex;
 static struct obs_python_script *first_tick_script = NULL;
 
 static PyObject *py_obspython = NULL;
@@ -378,7 +379,7 @@ struct python_obs_timer {
 	uint64_t interval;
 };
 
-static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t timer_mutex;
 static struct python_obs_timer *first_timer = NULL;
 
 static inline void python_obs_timer_init(struct python_obs_timer *timer)
@@ -1570,12 +1571,10 @@ void obs_python_load(void)
 {
 	da_init(python_paths);
 
-	pthread_mutexattr_t attr;
-	pthread_mutexattr_init(&attr);
-	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
-
 	pthread_mutex_init(&tick_mutex, NULL);
-	pthread_mutex_init(&timer_mutex, &attr);
+	pthread_mutex_init_recursive(&timer_mutex);
+
+	mutexes_loaded = true;
 }
 
 extern void add_python_frontend_funcs(PyObject *module);
@@ -1702,6 +1701,11 @@ out:
 
 void obs_python_unload(void)
 {
+	if (mutexes_loaded) {
+		pthread_mutex_destroy(&tick_mutex);
+		pthread_mutex_destroy(&timer_mutex);
+	}
+
 	if (!python_loaded_at_all)
 		return;
 
@@ -1720,8 +1724,6 @@ void obs_python_unload(void)
 		bfree(python_paths.array[i]);
 	da_free(python_paths);
 
-	pthread_mutex_destroy(&tick_mutex);
-	pthread_mutex_destroy(&timer_mutex);
 	dstr_free(&cur_py_log_chunk);
 
 	python_loaded_at_all = false;