diff options
author | dotnet-bot <dotnet-bot@microsoft.com> | 2015-01-30 14:14:42 -0800 |
---|---|---|
committer | dotnet-bot <dotnet-bot@microsoft.com> | 2015-01-30 14:14:42 -0800 |
commit | ef1e2ab328087c61a6878c1e84f4fc5d710aebce (patch) | |
tree | dee1bbb89e9d722e16b0d1485e3cdd1b6c8e2cfa /src/vm/comdependenthandle.h | |
download | coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.tar.gz coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.tar.bz2 coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.zip |
Initial commit to populate CoreCLR repo
[tfs-changeset: 1407945]
Diffstat (limited to 'src/vm/comdependenthandle.h')
-rw-r--r-- | src/vm/comdependenthandle.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/vm/comdependenthandle.h b/src/vm/comdependenthandle.h new file mode 100644 index 0000000000..1d3251bab4 --- /dev/null +++ b/src/vm/comdependenthandle.h @@ -0,0 +1,52 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// +// +// File: COMDependentHandle.h +// + +// +// FCall's for the DependentHandle class +// + + +#ifndef __COMDEPENDENTHANDLE_H__ +#define __COMDEPENDENTHANDLE_H__ + +#include "fcall.h" + +// A dependent handle is conceputally a tuple containing two object reference +// +// * A Primary object (think key) +// * A Secondary Object (think value) +// +// The reference to both the primary object is (long) weak (will not keep the object alive). However the +// reference to the secondary object is (long) weak if the primary object is dead, and strong if the primary +// object is alive. (Hence it is a 'Dependent' handle since the strength of the secondary reference depends +// on the primary). +// +// The effect of this semantics is that it seems that while the DependentHandle exists, the system behaves as +// if there was a normal strong reference from the primary object to the secondary one. +// +// The usefulness of a DependentHandle is to allow other objects to be 'attached' to a given object. By +// having a hash table where the entries are dependent handles you can attach arbitrary objects to another +// object. +// +// If you attmpted to do this with an ordinary table if the value would have to be a strong reference, which +// if it points back to the key, will form a loop that the GC will not be able to break DependentHandle is +// effecively a way of informing the GC about the dedendent relationsship between the key and the value so +// such cycles can be broken. +// +// Almost all the interesting for DependentHandle is in code:Ref_ScanDependentHandles +class DependentHandle +{ +public: + static FCDECL3(VOID, nInitialize, Object *primary, Object *secondary, OBJECTHANDLE *outHandle); + static FCDECL2(VOID, nGetPrimary, OBJECTHANDLE handle, Object **outPrimary); + static FCDECL3(VOID, nGetPrimaryAndSecondary, OBJECTHANDLE handle, Object **outPrimary, Object **outSecondary); + static FCDECL1(VOID, nFree, OBJECTHANDLE handle); +}; + +#endif + |