Selaa lähdekoodia

libobs/media-io: Fix leaks and error handling

jpark37 4 vuotta sitten
vanhempi
sitoutus
0c208f1e62
2 muutettua tiedostoa jossa 29 lisäystä ja 29 poistoa
  1. 12 13
      libobs/media-io/audio-io.c
  2. 17 16
      libobs/media-io/video-io.c

+ 12 - 13
libobs/media-io/audio-io.c

@@ -354,7 +354,6 @@ static inline bool valid_audio_params(const struct audio_output_info *info)
 int audio_output_open(audio_t **audio, struct audio_output_info *info)
 {
 	struct audio_output *out;
-	pthread_mutexattr_t attr;
 	bool planar = is_audio_planar(info->format);
 
 	if (!valid_audio_params(info))
@@ -362,7 +361,7 @@ int audio_output_open(audio_t **audio, struct audio_output_info *info)
 
 	out = bzalloc(sizeof(struct audio_output));
 	if (!out)
-		goto fail;
+		goto fail0;
 
 	memcpy(&out->info, info, sizeof(struct audio_output_info));
 	out->channels = get_audio_channels(info->speakers);
@@ -372,22 +371,22 @@ int audio_output_open(audio_t **audio, struct audio_output_info *info)
 	out->block_size = (planar ? 1 : out->channels) *
 			  get_audio_bytes_per_channel(info->format);
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		goto fail;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		goto fail;
-	if (pthread_mutex_init(&out->input_mutex, &attr) != 0)
-		goto fail;
+	if (pthread_mutex_init_recursive(&out->input_mutex) != 0)
+		goto fail0;
 	if (os_event_init(&out->stop_event, OS_EVENT_TYPE_MANUAL) != 0)
-		goto fail;
+		goto fail1;
 	if (pthread_create(&out->thread, NULL, audio_thread, out) != 0)
-		goto fail;
+		goto fail2;
 
 	out->initialized = true;
 	*audio = out;
 	return AUDIO_OUTPUT_SUCCESS;
 
-fail:
+fail2:
+	os_event_destroy(out->stop_event);
+fail1:
+	pthread_mutex_destroy(&out->input_mutex);
+fail0:
 	audio_output_close(out);
 	return AUDIO_OUTPUT_FAIL;
 }
@@ -402,6 +401,8 @@ void audio_output_close(audio_t *audio)
 	if (audio->initialized) {
 		os_event_signal(audio->stop_event);
 		pthread_join(audio->thread, &thread_ret);
+		os_event_destroy(audio->stop_event);
+		pthread_mutex_destroy(&audio->input_mutex);
 	}
 
 	for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
@@ -412,8 +413,6 @@ void audio_output_close(audio_t *audio)
 
 		da_free(mix->inputs);
 	}
-
-	os_event_destroy(audio->stop_event);
 	bfree(audio);
 }
 

+ 17 - 16
libobs/media-io/video-io.c

@@ -225,32 +225,27 @@ static inline void init_cache(struct video_output *video)
 int video_output_open(video_t **video, struct video_output_info *info)
 {
 	struct video_output *out;
-	pthread_mutexattr_t attr;
 
 	if (!valid_video_params(info))
 		return VIDEO_OUTPUT_INVALIDPARAM;
 
 	out = bzalloc(sizeof(struct video_output));
 	if (!out)
-		goto fail;
+		goto fail0;
 
 	memcpy(&out->info, info, sizeof(struct video_output_info));
 	out->frame_time =
 		util_mul_div64(1000000000ULL, info->fps_den, info->fps_num);
 	out->initialized = false;
 
-	if (pthread_mutexattr_init(&attr) != 0)
-		goto fail;
-	if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
-		goto fail;
-	if (pthread_mutex_init(&out->data_mutex, &attr) != 0)
-		goto fail;
-	if (pthread_mutex_init(&out->input_mutex, &attr) != 0)
-		goto fail;
+	if (pthread_mutex_init_recursive(&out->data_mutex) != 0)
+		goto fail0;
+	if (pthread_mutex_init_recursive(&out->input_mutex) != 0)
+		goto fail1;
 	if (os_sem_init(&out->update_semaphore, 0) != 0)
-		goto fail;
+		goto fail2;
 	if (pthread_create(&out->thread, NULL, video_thread, out) != 0)
-		goto fail;
+		goto fail3;
 
 	init_cache(out);
 
@@ -258,7 +253,13 @@ int video_output_open(video_t **video, struct video_output_info *info)
 	*video = out;
 	return VIDEO_OUTPUT_SUCCESS;
 
-fail:
+fail3:
+	os_sem_destroy(out->update_semaphore);
+fail2:
+	pthread_mutex_destroy(&out->input_mutex);
+fail1:
+	pthread_mutex_destroy(&out->data_mutex);
+fail0:
 	video_output_close(out);
 	return VIDEO_OUTPUT_FAIL;
 }
@@ -277,9 +278,6 @@ void video_output_close(video_t *video)
 	for (size_t i = 0; i < video->info.cache_size; i++)
 		video_frame_free((struct video_frame *)&video->cache[i]);
 
-	os_sem_destroy(video->update_semaphore);
-	pthread_mutex_destroy(&video->data_mutex);
-	pthread_mutex_destroy(&video->input_mutex);
 	bfree(video);
 }
 
@@ -510,6 +508,9 @@ void video_output_stop(video_t *video)
 		video->stop = true;
 		os_sem_post(video->update_semaphore);
 		pthread_join(video->thread, &thread_ret);
+		os_sem_destroy(video->update_semaphore);
+		pthread_mutex_destroy(&video->data_mutex);
+		pthread_mutex_destroy(&video->input_mutex);
 	}
 }