]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_cdsa_client/lib/cssmclient.h
Security-59306.61.1.tar.gz
[apple/security.git] / OSX / libsecurity_cdsa_client / lib / cssmclient.h
index 53719b82d385c0261e555c01a1d40a7f3e7c572f..a7bc57ea6989021becd05a1a75d48bcf98afe0c1 100644 (file)
@@ -65,7 +65,7 @@ private:
 //
 class Error : public CssmError {
 public:
 //
 class Error : public CssmError {
 public:
-       Error(CSSM_RETURN err) : CssmError(err) { }
+       Error(CSSM_RETURN err) : CssmError(err, false) { }
        virtual const char *what () const throw();
        
        enum {
        virtual const char *what () const throw();
        
        enum {
@@ -103,6 +103,7 @@ protected:
        bool mActive;                                   // loaded, attached, etc.
     RecursiveMutex mActivateMutex;
        mutable Allocator *mAllocator; // allocator hierarchy (NULL => TBD)
        bool mActive;                                   // loaded, attached, etc.
     RecursiveMutex mActivateMutex;
        mutable Allocator *mAllocator; // allocator hierarchy (NULL => TBD)
+    mutable RecursiveMutex mAllocatorMutex; // protects allocator creation
        
        template <class Obj> Obj parent() const
        { assert(mParent); return Obj(static_cast<typename Obj::Impl *>(&(*mParent))); }
        
        template <class Obj> Obj parent() const
        { assert(mParent); return Obj(static_cast<typename Obj::Impl *>(&(*mParent))); }
@@ -350,10 +351,12 @@ private:
         ~StandardCssm();
         void setCssm(CssmImpl *cssm);
         void unsetCssm(CssmImpl *cssm);
         ~StandardCssm();
         void setCssm(CssmImpl *cssm);
         void unsetCssm(CssmImpl *cssm);
-        CssmImpl *get();
+        Cssm get();
         
     private:
         
     private:
-        CssmImpl *mCssm;
+        RefPointer<CssmImpl> mCssm; // 'Leaks' this object (in that it won't ever be deleted after creation), but
+                                    // there's no safe way to vend and re-create this object in a multi-threaded environment
+                                    // without an implementation of WeakRefPointer<>.
     };
     static ModuleNexus<StandardCssm> mStandard;
 };
     };
     static ModuleNexus<StandardCssm> mStandard;
 };