vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Mon Sep 10 18:28:20 2012 +0300| [debc9d470c2eeb1025c751348bc684655a2b2872] | committer: Rémi Denis-Courmont
rwlock: cancellation safety > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=debc9d470c2eeb1025c751348bc684655a2b2872 --- src/misc/rwlock.h | 6 ++++++ src/posix/thread.c | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/misc/rwlock.h b/src/misc/rwlock.h index d4857ad..bb1c27b 100644 --- a/src/misc/rwlock.h +++ b/src/misc/rwlock.h @@ -60,7 +60,9 @@ void vlc_rwlock_rdlock (vlc_rwlock_t *lock) while (lock->state < 0) { assert (lock->state == WRITER_BIT); + mutex_cleanup_push (&lock->mutex); vlc_cond_wait (&lock->wait, &lock->mutex); + vlc_cleanup_pop (); } if (unlikely(lock->state >= READER_MASK)) abort (); /* An overflow is certainly a recursion bug. */ @@ -73,7 +75,11 @@ void vlc_rwlock_wrlock (vlc_rwlock_t *lock) vlc_mutex_lock (&lock->mutex); /* Wait until nobody owns the lock in any way. */ while (lock->state != 0) + { + mutex_cleanup_push (&lock->mutex); vlc_cond_wait (&lock->wait, &lock->mutex); + vlc_cleanup_pop (); + } lock->state = WRITER_BIT; vlc_mutex_unlock (&lock->mutex); } diff --git a/src/posix/thread.c b/src/posix/thread.c index d5e3263..1fc2b67 100644 --- a/src/posix/thread.c +++ b/src/posix/thread.c @@ -558,6 +558,7 @@ void vlc_rwlock_destroy (vlc_rwlock_t *lock) /** * Acquires a read/write lock for reading. Recursion is allowed. + * @note This function may be a point of cancellation. */ void vlc_rwlock_rdlock (vlc_rwlock_t *lock) { @@ -567,6 +568,7 @@ void vlc_rwlock_rdlock (vlc_rwlock_t *lock) /** * Acquires a read/write lock for writing. Recursion is not allowed. + * @note This function may be a point of cancellation. */ void vlc_rwlock_wrlock (vlc_rwlock_t *lock) { _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
