/src/LinFu.AOP.Interfaces/MultithreadedCallCounter.cs

http://github.com/philiplaureano/LinFu · C# · 46 lines · 38 code · 8 blank · 0 comment · 3 complexity · d42adc4fd411a08a571706f1f1d6cc70 MD5 · raw file

  1. using System.Collections.Generic;
  2. using System.Threading;
  3. namespace LinFu.AOP.Interfaces
  4. {
  5. internal class MultiThreadedCallCounter : ICallCounter
  6. {
  7. private readonly Dictionary<int, SingleThreadedCallCounter> _counts =
  8. new Dictionary<int, SingleThreadedCallCounter>();
  9. public void Increment(IInvocationInfo context)
  10. {
  11. var threadId = Thread.CurrentThread.ManagedThreadId;
  12. lock (_counts)
  13. {
  14. if (!_counts.ContainsKey(threadId))
  15. _counts[threadId] = new SingleThreadedCallCounter();
  16. _counts[threadId].Increment(context);
  17. }
  18. }
  19. public void Decrement(IInvocationInfo context)
  20. {
  21. var threadId = Thread.CurrentThread.ManagedThreadId;
  22. if (!_counts.ContainsKey(threadId))
  23. return;
  24. lock (_counts)
  25. {
  26. var counter = _counts[threadId];
  27. counter.Decrement(context);
  28. }
  29. }
  30. public int GetPendingCalls(IInvocationInfo context)
  31. {
  32. var threadId = Thread.CurrentThread.ManagedThreadId;
  33. if (!_counts.ContainsKey(threadId))
  34. return 0;
  35. return _counts[threadId].GetPendingCalls(context);
  36. }
  37. }
  38. }