Browse Source

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
tags/v0.5
François Revol 21 years ago
parent
commit
f4ff1b92cc
1 changed files with 47 additions and 0 deletions
  1. +47
    -0
      libavcodec/beosthread.c

+ 47
- 0
libavcodec/beosthread.c View File

@@ -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);
}




Loading…
Cancel
Save