X-Git-Url: https://git.saurik.com/apple/securityd.git/blobdiff_plain/eeadf2e6470f45ea0275a6019635573f2a7b5a2c..4cd1cad0dea00daa03e1b54fdf2797a02373ad5b:/src/structure.cpp diff --git a/src/structure.cpp b/src/structure.cpp index 4d6dd36..effd439 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. @@ -96,7 +153,7 @@ NodeCore::NodeCore() // override this to add text to your Node type's state dump output void NodeCore::dumpNode() { - Debug::dump("%s@%p rc=%u", Debug::typeName(*this).c_str(), this, unsigned(refCountForDebuggingOnly())); + Debug::dump("%s@%p rc=%u", Debug::typeName(*this).c_str(), this, unsigned(refCountForDebuggingOnly())); if (mParent) Debug::dump(" parent=%p", mParent.get()); if (mReferent) @@ -107,11 +164,14 @@ void NodeCore::dumpNode() // override this to completely re-implement the dump format for your Node type void NodeCore::dump() { - dumpNode(); + 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"); @@ -120,7 +180,7 @@ void NodeCore::dump() // dump all known nodes void NodeCore::dumpAll() { - StLock _(mCoreLock); + StLock _(mCoreLock); time_t now; time(&now); Debug::dump("\nNODE DUMP (%24.24s)\n", ctime(&now)); for (set::const_iterator it = mCoreNodes.begin(); it != mCoreNodes.end(); it++)