LockHelper.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // <copyright>
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. // </copyright>
  4. namespace System.ServiceModel.Channels
  5. {
  6. using System.Runtime;
  7. using System.Threading;
  8. // IMPORTANT: Only meant to be used within a using statement.
  9. struct LockHelper : IDisposable
  10. {
  11. ReaderWriterLockSlim readerWriterLock;
  12. bool isReaderLock;
  13. bool isLockHeld;
  14. LockHelper(ReaderWriterLockSlim readerWriterLock, bool isReaderLock)
  15. {
  16. this.readerWriterLock = readerWriterLock;
  17. this.isReaderLock = isReaderLock;
  18. if (isReaderLock)
  19. {
  20. this.readerWriterLock.EnterReadLock();
  21. }
  22. else
  23. {
  24. this.readerWriterLock.EnterWriteLock();
  25. }
  26. this.isLockHeld = true;
  27. }
  28. public void Dispose()
  29. {
  30. if (this.isLockHeld)
  31. {
  32. this.isLockHeld = false;
  33. if (this.isReaderLock)
  34. {
  35. this.readerWriterLock.ExitReadLock();
  36. }
  37. else
  38. {
  39. this.readerWriterLock.ExitWriteLock();
  40. }
  41. }
  42. }
  43. internal static IDisposable TakeWriterLock(ReaderWriterLockSlim readerWriterLock)
  44. {
  45. Fx.Assert(readerWriterLock != null, "The readerWriterLock cannot be null.");
  46. return new LockHelper(readerWriterLock, false);
  47. }
  48. internal static IDisposable TakeReaderLock(ReaderWriterLockSlim readerWriterLock)
  49. {
  50. Fx.Assert(readerWriterLock != null, "The readerWriterLock cannot be null.");
  51. return new LockHelper(readerWriterLock, true);
  52. }
  53. }
  54. }