Author: gonzalo
Date: 2005-05-08 21:30:33 -0400 (Sun, 08 May 2005)
New Revision: 44233
Modified:
trunk/mcs/class/System.Web/System.Web/ChangeLog
trunk/mcs/class/System.Web/System.Web/HttpWriter.cs
trunk/mcs/class/System.Web/System.Web/ReusableMemoryStream.cs
Log:
2005-05-08 Gonzalo Paniagua Javier <[EMAIL PROTECTED]>
* ReusableMemoryStream.cs:
* HttpWriter.cs: keep a pool of buffers to avoid allocations.
Modified: trunk/mcs/class/System.Web/System.Web/ChangeLog
===================================================================
--- trunk/mcs/class/System.Web/System.Web/ChangeLog 2005-05-09 01:09:45 UTC
(rev 44232)
+++ trunk/mcs/class/System.Web/System.Web/ChangeLog 2005-05-09 01:30:33 UTC
(rev 44233)
@@ -1,3 +1,8 @@
+2005-05-08 Gonzalo Paniagua Javier <[EMAIL PROTECTED]>
+
+ * ReusableMemoryStream.cs:
+ * HttpWriter.cs: keep a pool of buffers to avoid allocations.
+
2005-05-07 Gonzalo Paniagua Javier <[EMAIL PROTECTED]>
* HttpResponse.cs: no need to save/restore the thread culture when
Modified: trunk/mcs/class/System.Web/System.Web/HttpWriter.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web/HttpWriter.cs 2005-05-09 01:09:45 UTC
(rev 44232)
+++ trunk/mcs/class/System.Web/System.Web/HttpWriter.cs 2005-05-09 01:30:33 UTC
(rev 44233)
@@ -3,7 +3,9 @@
//
// Author:
// Patrik Torstensson ([EMAIL PROTECTED])
+// Gonzalo Paniagua Javier ([EMAIL PROTECTED])
//
+//
//
// Permission is hereby granted, free of charge, to any person obtaining
@@ -26,6 +28,7 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
+using System.Collections;
using System.IO;
using System.Text;
using System.Web.Util;
@@ -47,21 +50,54 @@
Stream _OutputFilter;
HttpResponseStreamProxy _OutputProxy;
+ static Stack buffer_stack = new Stack ();
+
+ static ReusableMemoryStream AllocateStream ()
+ {
+ lock (buffer_stack) {
+ if (buffer_stack.Count != 0) {
+ byte [] b = (byte []) buffer_stack.Pop
();
+ return new ReusableMemoryStream (b);
+ }
+ }
+ return new ReusableMemoryStream (MaxBufferSize);
+ }
+
+ static void FreeStream (ReusableMemoryStream st)
+ {
+ lock (buffer_stack) {
+ buffer_stack.Push (st.GetInternalBuffer ());
+ }
+ }
+
+ static void FreeBuffer (byte [] buffer)
+ {
+ lock (buffer_stack) {
+ buffer_stack.Push (buffer);
+ }
+ }
+
internal HttpWriter (HttpResponse Response)
{
_Response = Response;
_Encoding = _Response.ContentEncoding;
- _OutputStream = new ReusableMemoryStream
(MaxBufferSize);
+ _OutputStream = AllocateStream ();
_OutputHelper = new StreamWriter (_OutputStream,
_Response.ContentEncoding);
_ResponseStream = new HttpResponseStream (this);
}
internal void Dispose ()
{
- _OutputHelper.Close ();
- _OutputStream.Close ();
- _OutputFilter.Close ();
+ if (_OutputHelper != null)
+ _OutputHelper.Close ();
+ if (_OutputStream != null) {
+ _OutputStream.Close ();
+ FreeStream (_OutputStream);
+ }
+
+ if (_OutputFilter != null)
+ _OutputFilter.Close ();
}
internal Stream GetActiveFilter ()
@@ -111,13 +147,14 @@
_OutputFilter.Close ();
} finally {
_OutputProxy.Active = false;
+ FreeBuffer (arrData);
}
}
internal void Clear ()
{
_OutputHelper.Close ();
- _OutputStream = new ReusableMemoryStream
(_OutputStream.GetBuffer ());
+ _OutputStream = new ReusableMemoryStream
(_OutputStream.GetInternalBuffer ());
_OutputHelper = new StreamWriter (_OutputStream,
_Response.ContentEncoding);
}
@@ -127,7 +164,7 @@
int l = (int)_OutputStream.Length;
if (l > 0) {
- byte [] arrContent = _OutputStream.GetBuffer ();
+ byte [] arrContent =
_OutputStream.GetInternalBuffer ();
Handler.SendResponseFromMemory (arrContent, l);
}
}
Modified: trunk/mcs/class/System.Web/System.Web/ReusableMemoryStream.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web/ReusableMemoryStream.cs
2005-05-09 01:09:45 UTC (rev 44232)
+++ trunk/mcs/class/System.Web/System.Web/ReusableMemoryStream.cs
2005-05-09 01:30:33 UTC (rev 44233)
@@ -146,11 +146,18 @@
{
}
- public byte [] GetBuffer ()
+ public byte [] GetInternalBuffer ()
{
return internalBuffer;
}
+ public byte [] GetBuffer ()
+ {
+ byte [] b = new byte [length];
+ Buffer.BlockCopy (internalBuffer, 0, b, 0, length);
+ return b;
+ }
+
public override int Read ([In,Out] byte [] buffer, int offset,
int count)
{
CheckIfClosedThrowDisposed ();
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches