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; } }
public CountsOfThreadsProcessingUserCallbacks InterlockedCompareExchange( CountsOfThreadsProcessingUserCallbacks newCounts, CountsOfThreadsProcessingUserCallbacks oldCounts) { return (new CountsOfThreadsProcessingUserCallbacks( Interlocked.CompareExchange(ref _data, newCounts._data, oldCounts._data))); }
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;