Improve buffering algorithm in pool_write().
authorYoshiyuki Asaba <y-asaba at pgfoundry.org>
Wed, 5 Dec 2007 08:10:31 +0000 (08:10 +0000)
committerYoshiyuki Asaba <y-asaba at pgfoundry.org>
Wed, 5 Dec 2007 08:10:31 +0000 (08:10 +0000)
pool_stream.c

index 04f3d1185c107724a55650195e2db35ef21d8f7e..0ac1057e630eaf6fb7bb0586f998c1a8acb0b2b4 100644 (file)
@@ -324,8 +324,6 @@ char *pool_read2(POOL_CONNECTION *cp, int len)
 */
 int pool_write(POOL_CONNECTION *cp, void *buf, int len)
 {
-       int reqlen;
-
        if (len < 0)
        {
                pool_error("pool_write: invalid request size: %d", len);
@@ -335,26 +333,31 @@ int pool_write(POOL_CONNECTION *cp, void *buf, int len)
        if (cp->no_forward)
                return 0;
 
-       /* check buffer size */
-       reqlen = cp->wbufpo + len;
-
-       if (reqlen > cp->wbufsz)
+       while (len > 0)
        {
-               char *p;
+               int remainder = cp->wbufsz - cp->wbufpo;
 
-               reqlen = (reqlen/WRITEBUFSZ+1)*WRITEBUFSZ;
-               p = realloc(cp->wbuf, reqlen);
-               if (p == NULL)
+               if (remainder <= 0)
                {
-                       pool_error("pool_write: realloc failed");
-                       return -1;
+                       /*
+                        * Write buffer is full. so flush buffer.
+                        * wbufpo is reset in pool_flush_it().
+                        */
+                       pool_flush_it(cp);
+                       remainder = WRITEBUFSZ;
                }
-               cp->wbuf = p;
-               cp->wbufsz = reqlen;
-       }
 
-       memcpy(cp->wbuf+cp->wbufpo, buf, len);
-       cp->wbufpo += len;
+               /* check buffer size */
+               if (remainder >= len)
+               {
+                       /* OK, buffer size is enough. */
+                       remainder = len;
+               }
+               memcpy(cp->wbuf+cp->wbufpo, buf, remainder);
+               cp->wbufpo += remainder;
+               buf += remainder;
+               len -= remainder;
+       }
 
        return 0;
 }