/// <summary> /// Decrements the refcount for the given item. Releases the item if its refcount reaches zero. /// </summary> /// <remarks>This method is thread-safe.</remarks> /// <param name="item">The item to release.</param> public void Release([CanBeNull] TItem item) { if (ReferenceEquals(item, null)) { return; } ItemRefCount itemRef; if (_refs.TryGetValue(item, out itemRef)) { lock (itemRef) { if (itemRef.Count > 0) { itemRef.Dec(); Decremented.Call(item); ItemRefCount removedRef; if (itemRef.IsZero() && _refs.TryRemove(item, out removedRef)) { Released.Call(item); } } } } }
public void MergeFrom(CounterEvent other) { if (other == null) { return; } if (other.Id.Length != 0) { Id = other.Id; } if (other.Version != 0UL) { Version = other.Version; } switch (other.EventCase) { case EventOneofCase.Added: if (Added == null) { Added = new global::CounterAdded(); } Added.MergeFrom(other.Added); break; case EventOneofCase.Decremented: if (Decremented == null) { Decremented = new global::CounterDecremented(); } Decremented.MergeFrom(other.Decremented); break; case EventOneofCase.Incremented: if (Incremented == null) { Incremented = new global::CounterIncremented(); } Incremented.MergeFrom(other.Incremented); break; case EventOneofCase.NameChanged: if (NameChanged == null) { NameChanged = new global::CounterNameChanged(); } NameChanged.MergeFrom(other.NameChanged); break; case EventOneofCase.Removed: if (Removed == null) { Removed = new global::CounterRemoved(); } Removed.MergeFrom(other.Removed); break; } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); }
/// <summary> Sets refcount to zero for all retained items and releases them. </summary> /// <remarks>This method is thread-safe.</remarks> public void Clear() { foreach (var refKvp in _refs) { ItemRefCount itemRef; if (_refs.TryRemove(refKvp.Key, out itemRef)) { itemRef.SetToZero(); Decremented.Call(refKvp.Key); Released.Call(refKvp.Key); } } }
public override int GetHashCode() { int hash = 1; if (Id.Length != 0) { hash ^= Id.GetHashCode(); } if (Version != 0UL) { hash ^= Version.GetHashCode(); } if (eventCase_ == EventOneofCase.Added) { hash ^= Added.GetHashCode(); } if (eventCase_ == EventOneofCase.Decremented) { hash ^= Decremented.GetHashCode(); } if (eventCase_ == EventOneofCase.Incremented) { hash ^= Incremented.GetHashCode(); } if (eventCase_ == EventOneofCase.NameChanged) { hash ^= NameChanged.GetHashCode(); } if (eventCase_ == EventOneofCase.Removed) { hash ^= Removed.GetHashCode(); } hash ^= (int)eventCase_; if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } return(hash); }