Make counters use dedicated thread instead of timer (#25864) (#25978)
authorSung Yoon Whang <suwhang@microsoft.com>
Wed, 7 Aug 2019 16:14:38 +0000 (09:14 -0700)
committerWilliam Godbe <wigodbe@microsoft.com>
Wed, 7 Aug 2019 16:14:38 +0000 (09:14 -0700)
commitfe139940e7211be4f631a3a35ede45e350a1d7b9
treed7e4e216f20a313ffd75860768b9375dec46a39f
parent7259ed2b3676930cbe6c274fd71af9701ca69fe3
Make counters use dedicated thread instead of timer (#25864) (#25978)

* Make a dedicated polling thread for EventCounters

* Cleanup

* remove debug prints

* nit

* Fix comment

* addressing issues from code review

* Fix an assertion from getting fired when we have multiple listeners

* Fix a test issue

* code review feedback

* Fix a potential deadlock

* Fix another deadlock

* Allow s_sleepDurationInMilliseconds to be reset to a larger value

* More issues fix

* Let thread wake up from sleep if needed

* Some suggestions for the counters fix.

The resulting behavior should be the same as what is there now (assuming I didn't mess anything up), these are all just code simplifications that hopefully make it easier to review and maintain going forward. In total I think this reduces the change size in CounterGroup.cs by ~30%.
- With the addition of the AutoResetEvent the ManualResetEvent is no longer needed, removed it.
- Removed the various if foo != null checks for the shared state, it is all initialized once when then thread is created and then assumed to be non-null elsewhere.
- Removed a 2nd lock acquisition inside OnTimer
- Replaced an if with Math.Min in PollForValues

* fix test
src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/CounterGroup.cs
src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/EventCounter.cs
tests/src/tracing/eventcounter/eventcounter.cs