X-Git-Url: https://git.saurik.com/apple/securityd.git/blobdiff_plain/eeadf2e6470f45ea0275a6019635573f2a7b5a2c..24a291535d44686bc7959c7e398fab040e3e08a7:/src/structure.cpp diff --git a/src/structure.cpp b/src/structure.cpp index 4d6dd36..0f1c8e7 100644 --- a/src/structure.cpp +++ b/src/structure.cpp @@ -3,8 +3,6 @@ * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -43,6 +41,56 @@ NodeCore::~NodeCore() } +// +// Basic object mesh maintainance +// +void NodeCore::parent(NodeCore &p) +{ + StLock _(*this); + mParent = &p; +} + +void NodeCore::referent(NodeCore &r) +{ + StLock _(*this); + assert(!mReferent); + mReferent = &r; +} + +void NodeCore::clearReferent() +{ + StLock _(*this); + if (mReferent) + assert(!mReferent->hasReference(*this)); + mReferent = NULL; +} + + +void NodeCore::addReference(NodeCore &p) +{ + StLock _(*this); + assert(p.mReferent == this); + mReferences.insert(&p); +} + +void NodeCore::removeReference(NodeCore &p) +{ + StLock _(*this); + assert(hasReference(p)); + mReferences.erase(&p); +} + +#if !defined(NDEBUG) + +bool NodeCore::hasReference(NodeCore &p) +{ + assert(p.refCountForDebuggingOnly() > 0); + return mReferences.find(&p) != mReferences.end(); +} + +#endif //NDEBUG + + // // ClearReferences clears the reference set but does not propagate // anything; it is NOT recursive. @@ -72,6 +120,15 @@ void NodeCore::kill() } +void NodeCore::kill(NodeCore &ref) +{ + StLock _(*this); + assert(hasReference(ref)); + ref.kill(); + removeReference(ref); +} + + // // NodeCore-level support for state dumping. // Call NodeCore::dumpAll() to debug-dump all nodes. @@ -110,8 +167,11 @@ void NodeCore::dump() dumpNode(); if (!mReferences.empty()) { Debug::dump(" {"); - for (ReferenceSet::const_iterator it = mReferences.begin(); it != mReferences.end(); it++) + for (ReferenceSet::const_iterator it = mReferences.begin(); it != mReferences.end(); it++) { Debug::dump(" %p", it->get()); + if ((*it)->mReferent != this) + Debug::dump("!*INVALID*"); + } Debug::dump(" }"); } Debug::dump("\n");