summaryrefslogtreecommitdiff
path: root/libavcodec/beosthread.c
diff options
context:
space:
mode:
authorFrançois Revol <revol@free.fr>2005-01-29 20:09:33 +0000
committerFrançois Revol <revol@free.fr>2005-01-29 20:09:33 +0000
commitf4ff1b92cc062ea465ac280c03d93491a70507b9 (patch)
tree9b66333f398e6b14b8ae2d22ceb9abee86855c3a /libavcodec/beosthread.c
parenta603bf8d68b8700faa0008af09ccb653082f89de (diff)
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.c47
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);
+}
+
+
+