]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_utilities/lib/threading.h
Security-57337.50.23.tar.gz
[apple/security.git] / OSX / libsecurity_utilities / lib / threading.h
index a903dc100b96bf5ed1db9f4598f4a3ae85cd85f5..60168536e66e006ba4b877483713e11fb647216a 100644 (file)
@@ -197,7 +197,27 @@ public:
 private:
     unsigned int mCount;                               // counter level
 };
+
+//
+// A ReadWriteLock is a wrapper around a pthread_rwlock
+//
+class ReadWriteLock : public Mutex {
+public:
+    ReadWriteLock();
+    ~ReadWriteLock() { check(pthread_rwlock_destroy(&mLock)); }
+
+    // Takes the read lock
+    bool lock();
+    bool tryLock();
+    void unlock();
+
+    bool writeLock();
+    bool tryWriteLock();
+
+private:
+    pthread_rwlock_t mLock;
+};
+
 
 //
 // A guaranteed-unlocker stack-based class.
@@ -228,6 +248,31 @@ protected:
        bool mActive;
 };
 
+// Note: if you use the TryRead or TryWrite modes, you must check if you
+// actually have the lock before proceeding
+class StReadWriteLock {
+public:
+    enum Type {
+      Read,
+      TryRead,
+      Write,
+      TryWrite
+    };
+    StReadWriteLock(ReadWriteLock &lck, Type type) : mType(type), mIsLocked(false), mRWLock(lck)
+                       { lock(); }
+    ~StReadWriteLock() { if(mIsLocked) mRWLock.unlock(); }
+
+    bool lock();
+    void unlock();
+    bool isLocked();
+
+protected:
+    Type mType;
+    bool mIsLocked;
+    ReadWriteLock& mRWLock;
+};
+
+
 template <class TakeLock, class ReleaseLock,
        void (TakeLock::*_lock)() = &TakeLock::lock,
        void (TakeLock::*_unlock)() = &TakeLock::unlock,