diff options
author | François Revol <revol@free.fr> | 2005-01-29 20:09:33 +0000 |
---|---|---|
committer | François Revol <revol@free.fr> | 2005-01-29 20:09:33 +0000 |
commit | f4ff1b92cc062ea465ac280c03d93491a70507b9 (patch) | |
tree | 9b66333f398e6b14b8ae2d22ceb9abee86855c3a /libavcodec/beosthread.c | |
parent | a603bf8d68b8700faa0008af09ccb653082f89de (diff) | |
download | ffmpeg-f4ff1b92cc062ea465ac280c03d93491a70507b9.tar.gz |
added a lock/unlock_lib pair to allow extern progs to serialize access to lavc.
Originally committed as revision 3899 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/beosthread.c')
-rw-r--r-- | libavcodec/beosthread.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libavcodec/beosthread.c b/libavcodec/beosthread.c index 90ff1f452d..d79f04f297 100644 --- a/libavcodec/beosthread.c +++ b/libavcodec/beosthread.c @@ -33,6 +33,25 @@ typedef struct ThreadContext{ int ret; }ThreadContext; +// it's odd Be never patented that :D +struct benaphore { + vint32 atom; + sem_id sem; +}; +static inline int lock_ben(struct benaphore *ben) +{ + if (atomic_add(&ben->atom, 1) > 0) + return acquire_sem(ben->sem); + return B_OK; +} +static inline int unlock_ben(struct benaphore *ben) +{ + if (atomic_add(&ben->atom, -1) > 1) + return release_sem(ben->sem); + return B_OK; +} + +static struct benaphore av_thread_lib_ben; static int32 ff_thread_func(void *v){ ThreadContext *c= v; @@ -131,3 +150,31 @@ fail: avcodec_thread_free(s); return -1; } + +/* provide a mean to serialize calls to avcodec_*() for thread safety. */ + +int avcodec_thread_lock_lib(void) +{ + return lock_ben(&av_thread_lib_ben); +} + +int avcodec_thread_unlock_lib(void) +{ + return unlock_ben(&av_thread_lib_ben); +} + +/* our versions of _init and _fini (which are called by those actually from crt.o) */ + +void initialize_after(void) +{ + av_thread_lib_ben.atom = 0; + av_thread_lib_ben.sem = create_sem(0, "libavcodec benaphore"); +} + +void uninitialize_before(void) +{ + delete_sem(av_thread_lib_ben.sem); +} + + + |