Bläddra i källkod

libobs: Fix pthread mutex leaks

jpark37 4 år sedan
förälder
incheckning
353868e87c
4 ändrade filer med 14 tillägg och 55 borttagningar
  1. 2 8
      libobs/obs-encoder.c
  2. 2 8
      libobs/obs-scene.c
  3. 1 7
      libobs/obs-source.c
  4. 9 32
      libobs/obs.c

+ 2 - 8
libobs/obs-encoder.c

@@ -44,23 +44,17 @@ const char *obs_encoder_get_display_name(const char *id)
 static bool init_encoder(struct obs_encoder *encoder, const char *name,
 static bool init_encoder(struct obs_encoder *encoder, const char *name,
 			 obs_data_t *settings, obs_data_t *hotkey_data)
 			 obs_data_t *settings, obs_data_t *hotkey_data)
 {
 {
-	pthread_mutexattr_t attr;
-
 	pthread_mutex_init_value(&encoder->init_mutex);
 	pthread_mutex_init_value(&encoder->init_mutex);
 	pthread_mutex_init_value(&encoder->callbacks_mutex);
 	pthread_mutex_init_value(&encoder->callbacks_mutex);
 	pthread_mutex_init_value(&encoder->outputs_mutex);
 	pthread_mutex_init_value(&encoder->outputs_mutex);
 	pthread_mutex_init_value(&encoder->pause.mutex);
 	pthread_mutex_init_value(&encoder->pause.mutex);
 
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		return false;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		return false;
 	if (!obs_context_data_init(&encoder->context, OBS_OBJ_TYPE_ENCODER,
 	if (!obs_context_data_init(&encoder->context, OBS_OBJ_TYPE_ENCODER,
 				   settings, name, hotkey_data, false))
 				   settings, name, hotkey_data, false))
 		return false;
 		return false;
-	if (pthread_mutex_init(&encoder->init_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&encoder->init_mutex) != 0)
 		return false;
 		return false;
-	if (pthread_mutex_init(&encoder->callbacks_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&encoder->callbacks_mutex) != 0)
 		return false;
 		return false;
 	if (pthread_mutex_init(&encoder->outputs_mutex, NULL) != 0)
 	if (pthread_mutex_init(&encoder->outputs_mutex, NULL) != 0)
 		return false;
 		return false;

+ 2 - 8
libobs/obs-scene.c

@@ -84,7 +84,6 @@ static const char *group_getname(void *unused)
 
 
 static void *scene_create(obs_data_t *settings, struct obs_source *source)
 static void *scene_create(obs_data_t *settings, struct obs_source *source)
 {
 {
-	pthread_mutexattr_t attr;
 	struct obs_scene *scene = bzalloc(sizeof(struct obs_scene));
 	struct obs_scene *scene = bzalloc(sizeof(struct obs_scene));
 	scene->source = source;
 	scene->source = source;
 
 
@@ -98,16 +97,12 @@ static void *scene_create(obs_data_t *settings, struct obs_source *source)
 	signal_handler_add_array(obs_source_get_signal_handler(source),
 	signal_handler_add_array(obs_source_get_signal_handler(source),
 				 obs_scene_signals);
 				 obs_scene_signals);
 
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		goto fail;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		goto fail;
-	if (pthread_mutex_init(&scene->audio_mutex, &attr) != 0) {
+	if (pthread_mutex_init_recursive(&scene->audio_mutex) != 0) {
 		blog(LOG_ERROR, "scene_create: Couldn't initialize audio "
 		blog(LOG_ERROR, "scene_create: Couldn't initialize audio "
 				"mutex");
 				"mutex");
 		goto fail;
 		goto fail;
 	}
 	}
-	if (pthread_mutex_init(&scene->video_mutex, &attr) != 0) {
+	if (pthread_mutex_init_recursive(&scene->video_mutex) != 0) {
 		blog(LOG_ERROR, "scene_create: Couldn't initialize video "
 		blog(LOG_ERROR, "scene_create: Couldn't initialize video "
 				"mutex");
 				"mutex");
 		goto fail;
 		goto fail;
@@ -117,7 +112,6 @@ static void *scene_create(obs_data_t *settings, struct obs_source *source)
 	return scene;
 	return scene;
 
 
 fail:
 fail:
-	pthread_mutexattr_destroy(&attr);
 	bfree(scene);
 	bfree(scene);
 	return NULL;
 	return NULL;
 }
 }

+ 1 - 7
libobs/obs-source.c

@@ -172,8 +172,6 @@ extern char *find_libobs_data_file(const char *file);
 /* internal initialization */
 /* internal initialization */
 static bool obs_source_init(struct obs_source *source)
 static bool obs_source_init(struct obs_source *source)
 {
 {
-	pthread_mutexattr_t attr;
-
 	source->user_volume = 1.0f;
 	source->user_volume = 1.0f;
 	source->volume = 1.0f;
 	source->volume = 1.0f;
 	source->sync_offset = 0;
 	source->sync_offset = 0;
@@ -186,11 +184,7 @@ static bool obs_source_init(struct obs_source *source)
 	pthread_mutex_init_value(&source->audio_cb_mutex);
 	pthread_mutex_init_value(&source->audio_cb_mutex);
 	pthread_mutex_init_value(&source->caption_cb_mutex);
 	pthread_mutex_init_value(&source->caption_cb_mutex);
 
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		return false;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		return false;
-	if (pthread_mutex_init(&source->filter_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&source->filter_mutex) != 0)
 		return false;
 		return false;
 	if (pthread_mutex_init(&source->audio_buf_mutex, NULL) != 0)
 	if (pthread_mutex_init(&source->audio_buf_mutex, NULL) != 0)
 		return false;
 		return false;

+ 9 - 32
libobs/obs.c

@@ -386,7 +386,6 @@ static int obs_init_video(struct obs_video_info *ovi)
 {
 {
 	struct obs_core_video *video = &obs->video;
 	struct obs_core_video *video = &obs->video;
 	struct video_output_info vi;
 	struct video_output_info vi;
-	pthread_mutexattr_t attr;
 	int errorcode;
 	int errorcode;
 
 
 	make_video_info(&vi, ovi);
 	make_video_info(&vi, ovi);
@@ -420,10 +419,6 @@ static int obs_init_video(struct obs_video_info *ovi)
 
 
 	gs_leave_context();
 	gs_leave_context();
 
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		return OBS_VIDEO_FAIL;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		return OBS_VIDEO_FAIL;
 	if (pthread_mutex_init(&video->gpu_encoder_mutex, NULL) < 0)
 	if (pthread_mutex_init(&video->gpu_encoder_mutex, NULL) < 0)
 		return OBS_VIDEO_FAIL;
 		return OBS_VIDEO_FAIL;
 	if (pthread_mutex_init(&video->task_mutex, NULL) < 0)
 	if (pthread_mutex_init(&video->task_mutex, NULL) < 0)
@@ -570,15 +565,9 @@ static bool obs_init_audio(struct audio_output_info *ai)
 	struct obs_core_audio *audio = &obs->audio;
 	struct obs_core_audio *audio = &obs->audio;
 	int errorcode;
 	int errorcode;
 
 
-	pthread_mutexattr_t attr;
-
 	pthread_mutex_init_value(&audio->monitoring_mutex);
 	pthread_mutex_init_value(&audio->monitoring_mutex);
 
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		return false;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		return false;
-	if (pthread_mutex_init(&audio->monitoring_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&audio->monitoring_mutex) != 0)
 		return false;
 		return false;
 
 
 	audio->user_volume = 1.0f;
 	audio->user_volume = 1.0f;
@@ -628,30 +617,25 @@ static void obs_free_audio(void)
 static bool obs_init_data(void)
 static bool obs_init_data(void)
 {
 {
 	struct obs_core_data *data = &obs->data;
 	struct obs_core_data *data = &obs->data;
-	pthread_mutexattr_t attr;
 
 
 	assert(data != NULL);
 	assert(data != NULL);
 
 
 	pthread_mutex_init_value(&obs->data.displays_mutex);
 	pthread_mutex_init_value(&obs->data.displays_mutex);
 	pthread_mutex_init_value(&obs->data.draw_callbacks_mutex);
 	pthread_mutex_init_value(&obs->data.draw_callbacks_mutex);
 
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		return false;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		goto fail;
-	if (pthread_mutex_init(&data->sources_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&data->sources_mutex) != 0)
 		goto fail;
 		goto fail;
-	if (pthread_mutex_init(&data->audio_sources_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&data->audio_sources_mutex) != 0)
 		goto fail;
 		goto fail;
-	if (pthread_mutex_init(&data->displays_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&data->displays_mutex) != 0)
 		goto fail;
 		goto fail;
-	if (pthread_mutex_init(&data->outputs_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&data->outputs_mutex) != 0)
 		goto fail;
 		goto fail;
-	if (pthread_mutex_init(&data->encoders_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&data->encoders_mutex) != 0)
 		goto fail;
 		goto fail;
-	if (pthread_mutex_init(&data->services_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&data->services_mutex) != 0)
 		goto fail;
 		goto fail;
-	if (pthread_mutex_init(&obs->data.draw_callbacks_mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&obs->data.draw_callbacks_mutex) != 0)
 		goto fail;
 		goto fail;
 	if (!obs_view_init(&data->main_view))
 	if (!obs_view_init(&data->main_view))
 		goto fail;
 		goto fail;
@@ -660,7 +644,6 @@ static bool obs_init_data(void)
 	data->valid = true;
 	data->valid = true;
 
 
 fail:
 fail:
-	pthread_mutexattr_destroy(&attr);
 	return data->valid;
 	return data->valid;
 }
 }
 
 
@@ -764,7 +747,6 @@ static pthread_once_t obs_pthread_once_init_token = PTHREAD_ONCE_INIT;
 static inline bool obs_init_hotkeys(void)
 static inline bool obs_init_hotkeys(void)
 {
 {
 	struct obs_core_hotkeys *hotkeys = &obs->hotkeys;
 	struct obs_core_hotkeys *hotkeys = &obs->hotkeys;
-	pthread_mutexattr_t attr;
 	bool success = false;
 	bool success = false;
 
 
 	assert(hotkeys != NULL);
 	assert(hotkeys != NULL);
@@ -782,11 +764,7 @@ static inline bool obs_init_hotkeys(void)
 	if (!obs_hotkeys_platform_init(hotkeys))
 	if (!obs_hotkeys_platform_init(hotkeys))
 		return false;
 		return false;
 
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		return false;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		goto fail;
-	if (pthread_mutex_init(&hotkeys->mutex, &attr) != 0)
+	if (pthread_mutex_init_recursive(&hotkeys->mutex) != 0)
 		goto fail;
 		goto fail;
 
 
 	if (os_event_init(&hotkeys->stop_event, OS_EVENT_TYPE_MANUAL) != 0)
 	if (os_event_init(&hotkeys->stop_event, OS_EVENT_TYPE_MANUAL) != 0)
@@ -800,7 +778,6 @@ static inline bool obs_init_hotkeys(void)
 	success = true;
 	success = true;
 
 
 fail:
 fail:
-	pthread_mutexattr_destroy(&attr);
 	return success;
 	return success;
 }
 }