[FFmpeg-devel] [PATCH] avutil/log: make av_log/av_vlog() thread safe
Michael Niedermayer
michaelni at gmx.at
Thu Oct 17 01:04:41 CEST 2013
On Thu, Oct 17, 2013 at 12:04:11AM +0200, wm4 wrote:
> On Wed, 16 Oct 2013 23:43:28 +0200
> Michael Niedermayer <michaelni at gmx.at> wrote:
>
> > This uses a spinlock
> >
> > Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> > ---
> > libavutil/log.c | 6 ++++++
> > 1 file changed, 6 insertions(+)
> >
> > diff --git a/libavutil/log.c b/libavutil/log.c
> > index 53be3ea..b871c8f 100644
> > --- a/libavutil/log.c
> > +++ b/libavutil/log.c
> > @@ -34,6 +34,7 @@
> > #endif
> > #include <stdarg.h>
> > #include <stdlib.h>
> > +#include "atomic.h"
> > #include "avutil.h"
> > #include "bprint.h"
> > #include "common.h"
> > @@ -268,8 +269,13 @@ void av_log(void* avcl, int level, const char *fmt, ...)
> >
> > void av_vlog(void* avcl, int level, const char *fmt, va_list vl)
> > {
> > + static void * volatile state;
> > + while (avpriv_atomic_ptr_cas(&state, NULL, (void*)fmt))
> > + ;
> > if(av_log_callback)
> > av_log_callback(avcl, level, fmt, vl);
> > + if (!fmt || avpriv_atomic_ptr_cas(&state, (void*)fmt, NULL) != (void*)fmt)
> > + abort(); //cant use av_assert*() here due to that using av_log
> > }
> >
> > int av_log_get_level(void)
>
> What problem is that trying to solve?
av_log() gets called from multiple decoders or threads within a
decoder. The results are sometimes intermixed log messages, above
patch fixes that. Yes ive confirmed the bug as well as that this
fixes it.
> There could be a race condition
> between checking and using av_log_callback,
uhm, right, fixed, that was independant of this patch though
> but av_log_callback itself
> is user-provided. So, as far as I can see it, it doesn't sound like a
> good idea to call a user-provided callback under a spinlock. Instead,
> you should document that the user-provided callback is expected to be
> thread-safe.
If thats preferred, i can move the lock to our default callback
but all applications need
a lock or thread safe callback if they provide a callback then, even
ones that have a single thread and process only. This doesnt sound
very nice for apps that use no locking primitives anywhere else
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
What does censorship reveal? It reveals fear. -- Julian Assange
-------------- 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/20131017/ef9b6a5b/attachment.asc>
More information about the ffmpeg-devel
mailing list