Esempio n. 1
0
        public void ReportThreadStatus(bool isProcessingUserCallback)
        {
            CountsOfThreadsProcessingUserCallbacks counts = _countsOfThreadsProcessingUserCallbacks;

            while (true)
            {
                CountsOfThreadsProcessingUserCallbacks newCounts = counts;
                if (isProcessingUserCallback)
                {
                    newCounts.IncrementCurrent();
                }
                else
                {
                    newCounts.DecrementCurrent();
                }

                CountsOfThreadsProcessingUserCallbacks countsBeforeUpdate =
                    _countsOfThreadsProcessingUserCallbacks.InterlockedCompareExchange(newCounts, counts);
                if (countsBeforeUpdate == counts)
                {
                    break;
                }

                counts = countsBeforeUpdate;
            }
        }
Esempio n. 2
0
 public CountsOfThreadsProcessingUserCallbacks InterlockedCompareExchange(
     CountsOfThreadsProcessingUserCallbacks newCounts,
     CountsOfThreadsProcessingUserCallbacks oldCounts)
 {
     return
         (new CountsOfThreadsProcessingUserCallbacks(
              Interlocked.CompareExchange(ref _data, newCounts._data, oldCounts._data)));
 }
Esempio n. 3
0
        private short GetAndResetHighWatermarkCountOfThreadsProcessingUserCallbacks()
        {
            CountsOfThreadsProcessingUserCallbacks counts = _countsOfThreadsProcessingUserCallbacks;

            while (true)
            {
                CountsOfThreadsProcessingUserCallbacks newCounts = counts;
                newCounts.ResetHighWatermark();

                CountsOfThreadsProcessingUserCallbacks countsBeforeUpdate =
                    _countsOfThreadsProcessingUserCallbacks.InterlockedCompareExchange(newCounts, counts);
                if (countsBeforeUpdate == counts || countsBeforeUpdate.HighWatermark == countsBeforeUpdate.Current)
                {
                    return(countsBeforeUpdate.HighWatermark);
                }

                counts = countsBeforeUpdate;
            }
        }
 public bool Equals(CountsOfThreadsProcessingUserCallbacks other) => _data == other._data;