public ThreadLocalNode(ThreadInt64PersistentCounter counter)
            {
                Debug.Assert(counter != null);

                _count   = 1;
                _counter = counter;
            }
 public ThreadLocalNode(ThreadInt64PersistentCounter counter)
 {
     Debug.Assert(counter != null);
     _counter = counter;
     _prev    = this;
     _next    = this;
 }
Beispiel #3
0
        private void NotifyWorkItemProgress(object threadLocalCompletionCountObject, int currentTimeMs)
        {
            ThreadInt64PersistentCounter.Increment(threadLocalCompletionCountObject);
            _separated.lastDequeueTime = currentTimeMs;

            if (ShouldAdjustMaxWorkersActive(currentTimeMs))
            {
                AdjustMaxWorkersActive();
            }
        }
Beispiel #4
0
        private void NotifyWorkItemProgress(object threadLocalCompletionCountObject, int currentTimeMs)
        {
            ThreadInt64PersistentCounter.Increment(threadLocalCompletionCountObject);
            Volatile.Write(ref _separated.lastDequeueTime, Environment.TickCount);

            if (ShouldAdjustMaxWorkersActive(currentTimeMs))
            {
                AdjustMaxWorkersActive();
            }
        }
Beispiel #5
0
            public void Dispose()
            {
                ThreadInt64PersistentCounter counter = _counter;

                s_lock.Acquire();
                try
                {
                    counter._overflowCount += _count;
                    counter._nodes.Remove(this);
                }
                finally
                {
                    s_lock.Release();
                }
            }
            public void Dispose()
            {
                ThreadInt64PersistentCounter counter = _counter;

                counter._lock.Acquire();
                try
                {
                    counter._overflowCount += _count;

                    _prev._next = _next;
                    _next._prev = _prev;
                }
                finally
                {
                    counter._lock.Release();
                }
            }
            private void OnIncrementOverflow()
            {
                // Accumulate the count for this increment into the overflow count and reset the thread-local count

                // The lock, in coordination with other places that read these values, ensures that both changes below become
                // visible together
                ThreadInt64PersistentCounter counter = _counter;

                s_lock.Acquire();
                try
                {
                    _count = 0;
                    counter._overflowCount += (long)uint.MaxValue + 1;
                }
                finally
                {
                    s_lock.Release();
                }
            }
Beispiel #8
0
            private void OnAddOverflow(uint count)
            {
                Debug.Assert(count != 0);

                // Accumulate the count for this add into the overflow count and reset the thread-local count

                // The lock, in coordination with other places that read these values, ensures that both changes below become
                // visible together
                ThreadInt64PersistentCounter counter = _counter;

                s_lock.Acquire();
                try
                {
                    counter._overflowCount += (long)_count + count;
                    _count = 0;
                }
                finally
                {
                    s_lock.Release();
                }
            }
Beispiel #9
0
 internal static void IncrementLockContentionCount() => ThreadInt64PersistentCounter.Increment(t_ContentionCountObject ?? CreateThreadLocalContentionCountObject());