Răsfoiți Sursa

libobs/media-io: Fix recursive lock in video

In certain cases the video thread could end up trying to lock itself
recursively.  This just allows the mutexes to safely be locked
recursively.
jp9000 11 ani în urmă
părinte
comite
c52406c178
1 a modificat fișierele cu 7 adăugiri și 2 ștergeri
  1. 7 2
      libobs/media-io/video-io.c

+ 7 - 2
libobs/media-io/video-io.c

@@ -192,6 +192,7 @@ static inline bool valid_video_params(const struct video_output_info *info)
 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;
@@ -205,9 +206,13 @@ int video_output_open(video_t **video, struct video_output_info *info)
 		(double)info->fps_num);
 	out->initialized = false;
 
-	if (pthread_mutex_init(&out->data_mutex, NULL) != 0)
+	if (pthread_mutexattr_init(&attr) != 0)
 		goto fail;
-	if (pthread_mutex_init(&out->input_mutex, NULL) != 0)
+	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 (os_event_init(&out->stop_event, OS_EVENT_TYPE_MANUAL) != 0)
 		goto fail;