public void Remove(ObjectMonitor monitor)
 {
     lock (m_sync)
     {
         if (Object.ReferenceEquals(m_first, monitor))
         {
             if (Object.ReferenceEquals(m_last, monitor))
             {
                 m_first = null;
                 m_last  = null;
             }
             else
             {
                 m_first = m_first.m_next;
             }
         }
         else if (Object.ReferenceEquals(m_first, monitor))
         {
             m_last = m_last.m_previous;
         }
         monitor.Dispose();
         m_listLength--;
         m_listChangeIndex++;
     }
 }
 internal void Setup(ObjectMonitor previous, object target)
 {
     if (previous != null)
     {
         previous.m_next = this;
     }
     m_previous  = previous;
     m_reference = new WeakReference(target);
     if (target is IAvailability)
     {
         (target as IAvailability).Disposing += ObjectMonitor_Disposing;
         (target as IAvailability).Disposed  += ObjectMonitor_Disposed;
     }
 }
        internal void Dispose()
        {
            this.OnMonitorDispose();
            m_state     = State.MonitorDisposed;
            m_reference = null;
            if (m_previous != null)
            {
                m_previous.m_next = m_next;
            }
            if (m_next != null)
            {
                m_next.m_previous = m_previous;
            }
            m_previous = null;
            m_next     = null;

            this.StateChanged?.Invoke(this, EventArgs.Empty);
        }
 public ObjectMonitor[] CreateSnapshotListIfChanged(ref long lastKnownChangeIndex)
 {
     lock (m_sync)
     {
         if (m_listChangeIndex != lastKnownChangeIndex)
         {
             lastKnownChangeIndex = m_listChangeIndex;
             var array = new ObjectMonitor[m_listLength];
             var next  = m_first;
             for (int i = 0; i < m_listLength; i++)
             {
                 array[i] = next;
                 next     = next.m_next;
             }
             return(array);
         }
         else
         {
             return(null);
         }
     }
 }
 public ObjectMonitor CreateObjectMonitor(object target)
 {
     if (target == null)
     {
         throw new ArgumentNullException("target");
     }
     lock (m_sync)
     {
         if (m_first == null)
         {
             m_first = new ObjectMonitor(null, target);
             m_last  = m_first;
         }
         else
         {
             m_last = new ObjectMonitor(m_last, target);
         }
         m_last.PostCreate(target);
         m_listLength++;
         m_listChangeIndex++;
         return(m_last);
     }
 }
 protected ObjectMonitor()
 {
     m_previous  = null;
     m_reference = null;
 }
 internal ObjectMonitor(ObjectMonitor previous, object target)
 {
     this.Setup(previous, target);
 }