瀏覽代碼

libobs: Mark raw_active and gpu_encoder_active as volatile

These were operated on by atomic functions but were not marked as
volatile or loaded with os_atomic_load_long, potentially introducing
subtle race conditions. Detected by ThreadSanitizer.
Richard Stanway 3 年之前
父節點
當前提交
82b5a39ea4
共有 2 個文件被更改,包括 5 次插入4 次删除
  1. 2 2
      libobs/obs-internal.h
  2. 3 2
      libobs/obs-video.c

+ 2 - 2
libobs/obs-internal.h

@@ -270,8 +270,8 @@ struct obs_core_video {
 	gs_samplerstate_t *point_sampler;
 	gs_stagesurf_t *mapped_surfaces[NUM_CHANNELS];
 	int cur_texture;
-	long raw_active;
-	long gpu_encoder_active;
+	volatile long raw_active;
+	volatile long gpu_encoder_active;
 	pthread_mutex_t gpu_encoder_mutex;
 	struct circlebuf gpu_encoder_queue;
 	struct circlebuf gpu_encoder_avail_queue;

+ 3 - 2
libobs/obs-video.c

@@ -931,9 +931,10 @@ bool obs_graphics_thread_loop(struct obs_graphics_context *context)
 
 	uint64_t frame_start = os_gettime_ns();
 	uint64_t frame_time_ns;
-	bool raw_active = obs->video.raw_active > 0;
+	bool raw_active = os_atomic_load_long(&obs->video.raw_active) > 0;
 #ifdef _WIN32
-	const bool gpu_active = obs->video.gpu_encoder_active > 0;
+	const bool gpu_active =
+		os_atomic_load_long(&obs->video.gpu_encoder_active) > 0;
 	const bool active = raw_active || gpu_active;
 #else
 	const bool gpu_active = 0;