X-Git-Url: http://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;p=vlc.git;a=blobdiff_plain;f=src%2Fmisc%2Fpthread.c;h=137916362b3fdeeb3ce0e3afcdc1e7cdcc4d1165;hp=41c09d8e2fb112b30d5c06879a3e48bf067af7cb;hb=16f5c8b85a53a250b6f7f397175243a86d868078;hpb=745bd15ffe52fff777d201248b7cbe6b7e92ceca diff --git a/src/misc/pthread.c b/src/misc/pthread.c index 41c09d8e2f..137916362b 100644 --- a/src/misc/pthread.c +++ b/src/misc/pthread.c @@ -89,6 +89,7 @@ static void vlc_thread_fatal (const char *action, int error, const char *function, const char *file, unsigned line) { + int canc = vlc_savecancel (); fprintf (stderr, "LibVLC fatal error %s (%d) in thread %lu ", action, error, vlc_threadid ()); vlc_trace (function, file, line); @@ -119,6 +120,7 @@ vlc_thread_fatal (const char *action, int error, #endif fflush (stderr); + vlc_restorecancel (canc); abort (); } @@ -378,6 +380,48 @@ int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex, return val; } +/** + * Initializes a semaphore. + */ +void vlc_sem_init (vlc_sem_t *sem, unsigned value) +{ + if (sem_init (sem, 0, value)) + abort (); +} + +/** + * Destroys a semaphore. + */ +void vlc_sem_destroy (vlc_sem_t *sem) +{ + int val = sem_destroy (sem); + VLC_THREAD_ASSERT ("destroying semaphore"); +} + +/** + * Increments the value of a semaphore. + */ +int vlc_sem_post (vlc_sem_t *sem) +{ + int val = sem_post (sem); + if (val != EOVERFLOW) + VLC_THREAD_ASSERT ("unlocking semaphore"); + return val; +} + +/** + * Atomically wait for the semaphore to become non-zero (if needed), + * then decrements it. + */ +void vlc_sem_wait (vlc_sem_t *sem) +{ + int val; + do + val = sem_wait (sem); + while (val == EINTR); + VLC_THREAD_ASSERT ("locking semaphore"); +} + /** * Initializes a read/write lock. */