[FFmpeg-devel] [PATCH 1/3] avcodec: add ff_lock/unlock_avcodec functions.
Michael Niedermayer
michaelni at gmx.at
Thu Dec 6 00:59:01 CET 2012
On Tue, Nov 27, 2012 at 09:59:30PM +0100, Reimar Döffinger wrote:
> Will be used in future patches, together with the
> variable that allows checking whether the lock is held.
>
> Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
> ---
> libavcodec/internal.h | 4 +++
> libavcodec/utils.c | 96 +++++++++++++++++++++----------------------------
> 2 files changed, 44 insertions(+), 56 deletions(-)
>
> diff --git a/libavcodec/internal.h b/libavcodec/internal.h
> index 17ca8bb..f25215c 100644
> --- a/libavcodec/internal.h
> +++ b/libavcodec/internal.h
> @@ -126,6 +126,10 @@ void ff_init_buffer_info(AVCodecContext *s, AVFrame *frame);
> */
> void ff_packet_free_side_data(AVPacket *pkt);
>
> +extern volatile int ff_avcodec_locked;
> +int ff_lock_avcodec(AVCodecContext *log_ctx);
> +int ff_unlock_avcodec(void);
> +
> int avpriv_lock_avformat(void);
> int avpriv_unlock_avformat(void);
>
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 32bda51..f7405de 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -47,6 +47,7 @@
> #include <limits.h>
> #include <float.h>
>
> +volatile int ff_avcodec_locked;
> static int volatile entangled_thread_counter = 0;
> static int (*ff_lockmgr_cb)(void **mutex, enum AVLockOp op);
> static void *codec_mutex;
> @@ -810,20 +811,11 @@ int attribute_align_arg ff_codec_open2_recursive(AVCodecContext *avctx, const AV
> {
> int ret = 0;
>
> - entangled_thread_counter--;
> - /* Release any user-supplied mutex. */
> - if (ff_lockmgr_cb) {
> - (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
> - }
> + ff_unlock_avcodec();
>
> ret = avcodec_open2(avctx, codec, options);
>
> - /* If there is a user-supplied mutex locking routine, call it. */
> - if (ff_lockmgr_cb) {
> - if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
> - return -1;
> - }
> - entangled_thread_counter++;
> + ff_lock_avcodec(avctx);
> return ret;
> }
no more return code checking
>
> @@ -853,18 +845,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
> if (options)
> av_dict_copy(&tmp, *options, 0);
>
> - /* If there is a user-supplied mutex locking routine, call it. */
> - if (ff_lockmgr_cb) {
> - if ((ret = (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN)) < 0)
> - return ret;
> - }
> -
> - entangled_thread_counter++;
> - if (entangled_thread_counter != 1) {
> - av_log(avctx, AV_LOG_ERROR, "Insufficient thread locking around avcodec_open/close()\n");
> - ret = AVERROR(EINVAL);
> + ret = ff_lock_avcodec(avctx);
> + if (ret < 0)
> goto end;
> - }
crashes due to attempted unlocking later of a lock that wasnt obtained
>
> avctx->internal = av_mallocz(sizeof(AVCodecInternal));
> if (!avctx->internal) {
> @@ -1103,12 +1086,7 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
> }
> }
> end:
> - entangled_thread_counter--;
> -
> - /* Release any user-supplied mutex. */
> - if (ff_lockmgr_cb) {
> - (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
> - }
> + ff_unlock_avcodec();
> if (options) {
> av_dict_free(options);
> *options = tmp;
> @@ -1921,37 +1899,19 @@ av_cold int ff_codec_close_recursive(AVCodecContext *avctx)
> {
> int ret = 0;
>
> - entangled_thread_counter--;
> - /* Release any user-supplied mutex. */
> - if (ff_lockmgr_cb) {
> - (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
> - }
> + ff_unlock_avcodec();
>
> ret = avcodec_close(avctx);
>
> - /* If there is a user-supplied mutex locking routine, call it. */
> - if (ff_lockmgr_cb) {
> - if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
> - return -1;
> - }
> - entangled_thread_counter++;
> + ff_lock_avcodec(NULL);
> return ret;
> }
>
> av_cold int avcodec_close(AVCodecContext *avctx)
> {
> - /* If there is a user-supplied mutex locking routine, call it. */
> - if (ff_lockmgr_cb) {
> - if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
> - return -1;
> - }
> -
> - entangled_thread_counter++;
> - if (entangled_thread_counter != 1) {
> - av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
> - entangled_thread_counter--;
> - return -1;
> - }
> + int ret = ff_lock_avcodec(avctx);
> + if (ret < 0)
> + return ret;
>
> if (avcodec_is_open(avctx)) {
> if (HAVE_THREADS && avctx->internal->frame_thread_encoder && avctx->thread_count > 1) {
> @@ -1979,12 +1939,8 @@ av_cold int avcodec_close(AVCodecContext *avctx)
> av_freep(&avctx->extradata);
> avctx->codec = NULL;
> avctx->active_thread_type = 0;
> - entangled_thread_counter--;
>
> - /* Release any user-supplied mutex. */
> - if (ff_lockmgr_cb) {
> - (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
> - }
> + ff_unlock_avcodec();
> return 0;
> }
>
> @@ -2640,6 +2596,34 @@ int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op))
> return 0;
> }
>
> +int ff_lock_avcodec(AVCodecContext *log_ctx)
> +{
> + if (ff_lockmgr_cb) {
> + if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
> + return -1;
> + }
> + entangled_thread_counter++;
> + if (entangled_thread_counter != 1) {
> + av_log(log_ctx, AV_LOG_ERROR, "Insufficient thread locking around avcodec_open/close()\n");
> + return AVERROR(EINVAL);
> + }
this fails to update entangled_thread_counter on the error path
> + av_assert0(!ff_avcodec_locked);
> + ff_avcodec_locked = 1;
> + return 0;
> +}
> +
> +int ff_unlock_avcodec(void)
> +{
> + av_assert0(ff_avcodec_locked);
these asserts fail alot
iam trying to fix these things ATM
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
He who knows, does not speak. He who speaks, does not know. -- Lao Tsu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121206/541382c0/attachment.asc>
More information about the ffmpeg-devel
mailing list