libobs: Fix deadlock on executing tasks

This commit is contained in:
Exeldro
2026-09-01 13:27:28 -04:00
committed by Ryan Foster
parent 291298ed08
commit 4315559a09
2 changed files with 14 additions and 20 deletions
+7 -10
View File
@@ -493,18 +493,15 @@ static inline void release_audio_sources(struct obs_core_audio *audio)
static inline void execute_audio_tasks(void)
{
struct obs_core_audio *audio = &obs->audio;
bool tasks_remaining = true;
while (tasks_remaining) {
pthread_mutex_lock(&audio->task_mutex);
if (audio->tasks.size) {
struct obs_task_info info;
deque_pop_front(&audio->tasks, &info, sizeof(info));
info.task(info.param);
}
tasks_remaining = !!audio->tasks.size;
pthread_mutex_lock(&audio->task_mutex);
while (audio->tasks.size) {
struct obs_task_info info;
deque_pop_front(&audio->tasks, &info, sizeof(info));
pthread_mutex_unlock(&audio->task_mutex);
info.task(info.param);
pthread_mutex_lock(&audio->task_mutex);
}
pthread_mutex_unlock(&audio->task_mutex);
}
/* In case monitoring and an 'Audio Output Capture' source have the same device, one silences all the monitored
+7 -10
View File
@@ -957,18 +957,15 @@ extern THREAD_LOCAL bool is_graphics_thread;
static void execute_graphics_tasks(void)
{
struct obs_core_video *video = &obs->video;
bool tasks_remaining = true;
while (tasks_remaining) {
pthread_mutex_lock(&video->task_mutex);
if (video->tasks.size) {
struct obs_task_info info;
deque_pop_front(&video->tasks, &info, sizeof(info));
info.task(info.param);
}
tasks_remaining = !!video->tasks.size;
pthread_mutex_lock(&video->task_mutex);
while (video->tasks.size) {
struct obs_task_info info;
deque_pop_front(&video->tasks, &info, sizeof(info));
pthread_mutex_unlock(&video->task_mutex);
info.task(info.param);
pthread_mutex_lock(&video->task_mutex);
}
pthread_mutex_unlock(&video->task_mutex);
}
#ifdef _WIN32