You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
lavc/utils.c: use C11 atomics for entangled thread handling
Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
This commit is contained in:
@@ -56,6 +56,7 @@
|
|||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdatomic.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#if CONFIG_ICONV
|
#if CONFIG_ICONV
|
||||||
@@ -114,7 +115,7 @@ static int (*lockmgr_cb)(void **mutex, enum AVLockOp op) = NULL;
|
|||||||
|
|
||||||
|
|
||||||
volatile int ff_avcodec_locked;
|
volatile int ff_avcodec_locked;
|
||||||
static int volatile entangled_thread_counter = 0;
|
static atomic_int entangled_thread_counter = ATOMIC_VAR_INIT(0);
|
||||||
static void *codec_mutex;
|
static void *codec_mutex;
|
||||||
static void *avformat_mutex;
|
static void *avformat_mutex;
|
||||||
|
|
||||||
@@ -1944,11 +1945,11 @@ int ff_lock_avcodec(AVCodecContext *log_ctx, const AVCodec *codec)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avpriv_atomic_int_add_and_fetch(&entangled_thread_counter, 1) != 1) {
|
if (atomic_fetch_add(&entangled_thread_counter, 1)) {
|
||||||
av_log(log_ctx, AV_LOG_ERROR,
|
av_log(log_ctx, AV_LOG_ERROR,
|
||||||
"Insufficient thread locking. At least %d threads are "
|
"Insufficient thread locking. At least %d threads are "
|
||||||
"calling avcodec_open2() at the same time right now.\n",
|
"calling avcodec_open2() at the same time right now.\n",
|
||||||
entangled_thread_counter);
|
atomic_load(&entangled_thread_counter));
|
||||||
if (!lockmgr_cb)
|
if (!lockmgr_cb)
|
||||||
av_log(log_ctx, AV_LOG_ERROR, "No lock manager is set, please see av_lockmgr_register()\n");
|
av_log(log_ctx, AV_LOG_ERROR, "No lock manager is set, please see av_lockmgr_register()\n");
|
||||||
ff_avcodec_locked = 1;
|
ff_avcodec_locked = 1;
|
||||||
@@ -1967,7 +1968,7 @@ int ff_unlock_avcodec(const AVCodec *codec)
|
|||||||
|
|
||||||
av_assert0(ff_avcodec_locked);
|
av_assert0(ff_avcodec_locked);
|
||||||
ff_avcodec_locked = 0;
|
ff_avcodec_locked = 0;
|
||||||
avpriv_atomic_int_add_and_fetch(&entangled_thread_counter, -1);
|
atomic_fetch_add(&entangled_thread_counter, -1);
|
||||||
if (lockmgr_cb) {
|
if (lockmgr_cb) {
|
||||||
if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE))
|
if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE))
|
||||||
return -1;
|
return -1;
|
||||||
|
Reference in New Issue
Block a user