OSSP CVS Repository

ossp - Check-in [2907]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 2907
Date: 2002-Nov-27 14:18:36 (local)
2002-Nov-27 13:18:36 (UTC)
User:mlelstv
Branch:
Comment: use locally allocated buffers that can be passed to al without extra copying.

PR: Submitted by: Reviewed by: Approved by: Obtained from:

Tickets:
Inspections:
Files:
ossp-pkg/sio/sio_zlib.c      1.1 -> 1.2     25 inserted, 13 deleted

ossp-pkg/sio/sio_zlib.c 1.1 -> 1.2

--- sio_zlib.c   2002/11/27 13:00:44     1.1
+++ sio_zlib.c   2002/11/27 13:18:36     1.2
@@ -111,12 +111,7 @@
     if (arc != AL_OK)
         return -1;
 
-    dt->obuf = malloc(dt->olen);
-    if (dt->obuf == NULL) {
-        al_destroy(dt->ibuf);
-        dt->ibuf = NULL;
-        return -1;
-    }
+    dt->obuf = NULL;
 
     return 0;
 }
@@ -127,8 +122,10 @@
     al_destroy(dt->ibuf);
     dt->ibuf = NULL;
 
-    free(dt->obuf);
-    dt->obuf = NULL;
+    if (dt->obuf != NULL) {
+        free(dt->obuf);
+        dt->obuf = NULL;
+    }
 
     if (dt->lvl >= 0)
         deflateEnd(&dt->zs);
@@ -201,6 +198,12 @@
     return SIO_OK;
 }
 
+static
+void freezlibbuf(char *p, size_t n, void *u)
+{
+    free(p);
+}
+
 /*
  * buffer logic
  *
@@ -240,6 +243,12 @@
 
     do {
         if (zs->avail_out == 0) {
+            if (dt->obuf == NULL &&
+                (dt->obuf = malloc(dt->olen)) == NULL) {
+                arc = AL_ERR_INT;
+                break;
+            }
+
             zs->next_out  = dt->obuf;
             zs->avail_out = dt->olen;
             zs->total_out = 0;
@@ -253,11 +262,14 @@
             break;
         }
         if (zs->avail_out == 0 || zrc == Z_STREAM_END || flush) {
-            arc = al_append_bytes(dt->al, dt->obuf, zs->total_out,
-                                  my->data_label);
-            zs->avail_out = 0;
-            if (arc != AL_OK)
-                break;
+            if (zs->total_out > 0) {
+                arc = al_attach_buffer(dt->al, dt->obuf, zs->total_out,
+                                       my->data_label, freezlibbuf, NULL);
+                dt->obuf = NULL;
+                zs->avail_out = 0;
+                if (arc != AL_OK)
+                    break;
+            }
         }
     } while (zs->avail_in > 0 || (zrc == Z_OK && zs->avail_out == 0));
 

CVSTrac 2.0.1