X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/5c19dc3ae3bd8e40a9c028b0deddd50ff337692c..641423b6670d8656d5daeaf988e7d307fb6c1ebc:/OSX/libsecurity_utilities/lib/threading.cpp diff --git a/OSX/libsecurity_utilities/lib/threading.cpp b/OSX/libsecurity_utilities/lib/threading.cpp index 9e0bed64..bfe6427c 100644 --- a/OSX/libsecurity_utilities/lib/threading.cpp +++ b/OSX/libsecurity_utilities/lib/threading.cpp @@ -194,6 +194,57 @@ void CountingMutex::finishExit() unlock(); } +// +// ReadWriteLock implementation +// +ReadWriteLock::ReadWriteLock() { + check(pthread_rwlock_init(&mLock, NULL)); +} + +bool ReadWriteLock::lock() { + check(pthread_rwlock_rdlock(&mLock)); + return true; +} + +bool ReadWriteLock::tryLock() { + return (pthread_rwlock_tryrdlock(&mLock) == 0); +} + +bool ReadWriteLock::writeLock() { + check(pthread_rwlock_wrlock(&mLock)); + return true; +} + +bool ReadWriteLock::tryWriteLock() { + return (pthread_rwlock_trywrlock(&mLock) == 0); +} + +void ReadWriteLock::unlock() { + check(pthread_rwlock_unlock(&mLock)); +} + +// +// StReadWriteLock implementation +// +bool StReadWriteLock::lock() { + switch(mType) { + case Read: mIsLocked = mRWLock.lock(); break; + case TryRead: mIsLocked = mRWLock.tryLock(); break; + case Write: mIsLocked = mRWLock.writeLock(); break; + case TryWrite: mIsLocked = mRWLock.tryWriteLock(); break; + } + return mIsLocked; +} + +void StReadWriteLock::unlock() { + mRWLock.unlock(); + mIsLocked = false; +} + +bool StReadWriteLock::isLocked() { + return mIsLocked; +} + //