Esempio n. 1
0
        /// <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);
    }
Esempio n. 3
0
 /// <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);
    }