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.
This commit is contained in:
Richard Stanway 2022-01-16 19:08:41 +01:00 committed by Jim
parent fa35fd0f55
commit 82b5a39ea4
2 changed files with 5 additions and 4 deletions

View file

@ -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;

View file

@ -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;