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

Reply via email to