BufferManager.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Channels
  5. {
  6. using System;
  7. using System.Runtime;
  8. using System.ServiceModel;
  9. public abstract class BufferManager
  10. {
  11. public abstract byte[] TakeBuffer(int bufferSize);
  12. public abstract void ReturnBuffer(byte[] buffer);
  13. public abstract void Clear();
  14. public static BufferManager CreateBufferManager(long maxBufferPoolSize, int maxBufferSize)
  15. {
  16. if (maxBufferPoolSize < 0)
  17. {
  18. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("maxBufferPoolSize",
  19. maxBufferPoolSize, SR.GetString(SR.ValueMustBeNonNegative)));
  20. }
  21. if (maxBufferSize < 0)
  22. {
  23. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("maxBufferSize",
  24. maxBufferSize, SR.GetString(SR.ValueMustBeNonNegative)));
  25. }
  26. return new WrappingBufferManager(InternalBufferManager.Create(maxBufferPoolSize, maxBufferSize));
  27. }
  28. internal static InternalBufferManager GetInternalBufferManager(BufferManager bufferManager)
  29. {
  30. if (bufferManager is WrappingBufferManager)
  31. {
  32. return ((WrappingBufferManager)bufferManager).InternalBufferManager;
  33. }
  34. else
  35. {
  36. return new WrappingInternalBufferManager(bufferManager);
  37. }
  38. }
  39. class WrappingBufferManager : BufferManager
  40. {
  41. InternalBufferManager innerBufferManager;
  42. public WrappingBufferManager(InternalBufferManager innerBufferManager)
  43. {
  44. this.innerBufferManager = innerBufferManager;
  45. }
  46. public InternalBufferManager InternalBufferManager
  47. {
  48. get { return this.innerBufferManager; }
  49. }
  50. public override byte[] TakeBuffer(int bufferSize)
  51. {
  52. if (bufferSize < 0)
  53. {
  54. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("bufferSize", bufferSize,
  55. SR.GetString(SR.ValueMustBeNonNegative)));
  56. }
  57. return this.innerBufferManager.TakeBuffer(bufferSize);
  58. }
  59. public override void ReturnBuffer(byte[] buffer)
  60. {
  61. if (buffer == null)
  62. {
  63. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("buffer");
  64. }
  65. this.innerBufferManager.ReturnBuffer(buffer);
  66. }
  67. public override void Clear()
  68. {
  69. this.innerBufferManager.Clear();
  70. }
  71. }
  72. class WrappingInternalBufferManager : InternalBufferManager
  73. {
  74. BufferManager innerBufferManager;
  75. public WrappingInternalBufferManager(BufferManager innerBufferManager)
  76. {
  77. this.innerBufferManager = innerBufferManager;
  78. }
  79. public override void Clear()
  80. {
  81. this.innerBufferManager.Clear();
  82. }
  83. public override void ReturnBuffer(byte[] buffer)
  84. {
  85. this.innerBufferManager.ReturnBuffer(buffer);
  86. }
  87. public override byte[] TakeBuffer(int bufferSize)
  88. {
  89. return this.innerBufferManager.TakeBuffer(bufferSize);
  90. }
  91. }
  92. }
  93. }