// -------------------------------------------------------------------------------------------------------------------- /// <summary> /// Converts the strong reference tag into a weak one and also returns it (to prevent garbage collection, the returned reference must be used/stored). /// This method is called within '_ObjectInfo' to make the original structure a weak reference to allow garbage collection when the other handle copies are no longer in use. /// <para>If called more than once, the subsequent calls will return null, which means the reference tag was already made weak.</para> /// </summary> internal _ReferenceTag _MakeWeak() { if (!(_RefTag is _WeakReferenceTag)) { var currentTag = _RefTag; _RefTag = new _WeakReferenceTag(_RefTag); return(currentTag); } return(null); }
// -------------------------------------------------------------------------------------------------------------------- /// <summary> /// Creates a copy of this handle with a strong reference tag to keep track of it. /// </summary> internal _Handle Clone() { _ReferenceTag refTag = null; if (_RefTag is _WeakReferenceTag) { ((_WeakReferenceTag)_RefTag).WeakRefTag.TryGetTarget(out refTag); } else { refTag = _RefTag; } return(new _Handle(_HandleProxy, refTag)); }
// -------------------------------------------------------------------------------------------------------------------- public _Handle(HandleProxy *handleProxy, _ReferenceTag refTag = null) { _HandleProxy = handleProxy; _RefTag = refTag ?? new _ReferenceTag(); }
public _WeakReferenceTag(_ReferenceTag refTag) { WeakRefTag = new WeakReference <_ReferenceTag>(refTag); }