]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_utilities/lib/threading.h
Security-59306.61.1.tar.gz
[apple/security.git] / OSX / libsecurity_utilities / lib / threading.h
index 60168536e66e006ba4b877483713e11fb647216a..5886f0475c61567447b3fb7965689b6f0667defd 100644 (file)
@@ -152,6 +152,13 @@ public:
        ~RecursiveMutex() {}
 };
 
        ~RecursiveMutex() {}
 };
 
+class NormalMutex : public Mutex
+{
+public:
+    NormalMutex() : Mutex(normal) {}
+    ~NormalMutex() {}
+};
+
 //
 // Condition variables
 //
 //
 // Condition variables
 //
@@ -248,6 +255,33 @@ protected:
        bool mActive;
 };
 
        bool mActive;
 };
 
+//
+// This class behaves exactly as StLock above, but accepts a pointer to a mutex instead of a reference.
+// If the pointer is NULL, this class does nothing. Otherwise, it behaves as StLock.
+// Try not to use this.
+//
+template <class Lock,
+void (Lock::*_lock)() = &Lock::lock,
+void (Lock::*_unlock)() = &Lock::unlock>
+class StMaybeLock {
+public:
+    StMaybeLock(Lock *lck) : me(lck), mActive(false)
+                                            { if(me) { (me->*_lock)(); mActive = true; } }
+    StMaybeLock(Lock *lck, bool option) : me(lck), mActive(option) { }
+    ~StMaybeLock()                                                     { if (me) { if(mActive) (me->*_unlock)(); } else {mActive = false;} }
+
+    bool isActive() const                              { return mActive; }
+    void lock()                                                        { if(me) { if(!mActive) { (me->*_lock)(); mActive = true; }}}
+    void unlock()                                              { if(me) { if(mActive) { (me->*_unlock)(); mActive = false; }}}
+    void release()                                             { if(me) { assert(mActive); mActive = false; } }
+
+    operator const Lock &() const              { return me; }
+
+protected:
+    Lock *me;
+    bool mActive;
+};
+
 // Note: if you use the TryRead or TryWrite modes, you must check if you
 // actually have the lock before proceeding
 class StReadWriteLock {
 // Note: if you use the TryRead or TryWrite modes, you must check if you
 // actually have the lock before proceeding
 class StReadWriteLock {
@@ -260,7 +294,7 @@ public:
     };
     StReadWriteLock(ReadWriteLock &lck, Type type) : mType(type), mIsLocked(false), mRWLock(lck)
                        { lock(); }
     };
     StReadWriteLock(ReadWriteLock &lck, Type type) : mType(type), mIsLocked(false), mRWLock(lck)
                        { lock(); }
-    ~StReadWriteLock() { if(mIsLocked) mRWLock.unlock(); }
+    ~StReadWriteLock() { if(mIsLocked) unlock(); }
 
     bool lock();
     void unlock();
 
     bool lock();
     void unlock();
@@ -346,25 +380,6 @@ public:
 //
 class Thread {
     NOCOPY(Thread)
 //
 class Thread {
     NOCOPY(Thread)
-public:
-    class Identity {
-        friend class Thread;
-        
-        Identity(pthread_t id) : mIdent(id) { }
-    public:
-        Identity() { }
-        
-        static Identity current()      { return pthread_self(); }
-
-        bool operator == (const Identity &other) const
-        { return pthread_equal(mIdent, other.mIdent); }
-        
-        bool operator != (const Identity &other) const
-        { return !(*this == other); }
-    
-    private:
-        pthread_t mIdent;
-    };
 
 public:
     Thread() { }                               // constructor
 
 public:
     Thread() { }                               // constructor
@@ -378,8 +393,6 @@ protected:
     virtual void action() = 0;         // the action to be performed
 
 private:
     virtual void action() = 0;         // the action to be performed
 
 private:
-    Identity self;                             // my own identity (instance constant)
-
     static void *runner(void *); // argument to pthread_create
 };
 
     static void *runner(void *); // argument to pthread_create
 };