cab_F_01.diff

Gregory M. Turner gmturner007 at ameritech.net
Tue Jul 29 18:20:15 CDT 2003


OK, I couldn't resist.  Performance enhancement patch.
This one allows cabinet to remember its place, avoiding
(sometimes) lots and lots of unnecessary processing.

License: LGPL

ChangeLog:

* dlls/cabinet: fdi.c:
  Greg Turner <gmturner007 at ameritech.net>
- remember decompression state during extraction, so as to
  avoid unnecessary work.

--
diff -ur --minimal --exclude-from=/home/greg/bin/winetreediff_excl ../wine.test/dlls/cabinet/fdi.c ./dlls/cabinet/fdi.c
--- ../wine.test/dlls/cabinet/fdi.c	2003-07-29 17:14:35.000000000 -0500
+++ ./dlls/cabinet/fdi.c	2003-07-29 17:31:48.000000000 -0500
@@ -2216,6 +2216,7 @@
     if (filehf) {
       cab_UWORD comptype = fol->comp_type;
       int ct1 = comptype & cffoldCOMPTYPE_MASK;
+      int ct2 = CAB(current) ? (CAB(current)->comp_type & cffoldCOMPTYPE_MASK) : 0;
       int err = 0;
 
       TRACE("Extracting file %s as requested by callee.\n", debugstr_a(file->filename));
@@ -2224,11 +2225,35 @@
       CAB(hfdi) = hfdi;
       CAB(filehf) = filehf;
       CAB(cabhf) = cabhf;
-      CAB(current) = fol;
-      CAB(decomp_cab) = NULL;
 
-      /* set up the appropriate decompressor */
-      switch (ct1) {
+      /* Was there a change of folder?  Compression type?  Did we somehow go backwards? */
+      if ((ct1 != ct2) || (CAB(current) != fol) || (file->offset < CAB(offset))) {
+
+        TRACE("Resetting folder for file %s.\n", debugstr_a(file->filename));
+
+        /* free stuff for the old decompressor */
+        switch (ct2) {
+        case cffoldCOMPTYPE_LZX:
+          if (LZX(window)) {
+            PFDI_FREE(hfdi, LZX(window));
+            LZX(window) = NULL;
+          }
+          break;
+        case cffoldCOMPTYPE_QUANTUM:
+          if (QTM(window)) {
+            PFDI_FREE(hfdi, QTM(window));
+            QTM(window) = NULL;
+          }
+          break;
+        }
+
+        CAB(decomp_cab) = NULL;
+        PFDI_SEEK(CAB(hfdi), CAB(cabhf), fol->offset, SEEK_SET);
+        CAB(offset) = 0;
+        CAB(outlen) = 0;
+
+        /* initialize the new decompressor */
+        switch (ct1) {
         case cffoldCOMPTYPE_NONE:
           CAB(decompress) = NONEfdi_decomp;
           break;
@@ -2245,8 +2270,11 @@
           break;
         default:
           err = DECR_DATAFORMAT;
+        }
       }
 
+      CAB(current) = fol;
+
       switch (err) {
         case DECR_OK:
           break;
@@ -2263,10 +2291,6 @@
           goto bail_and_fail;
       }
 
-      PFDI_SEEK(CAB(hfdi), CAB(cabhf), fol->offset, SEEK_SET);
-      CAB(offset) = 0;
-      CAB(outlen) = 0;
-
       if (file->offset > CAB(offset)) {
         /* decode bytes and send them to /dev/null */
         switch ((err = fdi_decomp(file, 0, decomp_state, pszCabPath, pfnfdin, pvUser))) {
@@ -2317,24 +2341,6 @@
           goto bail_and_fail;
       }
 
-      /* free decompression temps */
-      switch (ct1) {
-        case cffoldCOMPTYPE_LZX:
-          if (LZX(window)) {
-            PFDI_FREE(hfdi, LZX(window));
-            LZX(window) = NULL;
-          }
-          break;
-        case cffoldCOMPTYPE_QUANTUM:
-          if (QTM(window)) {
-            PFDI_FREE(hfdi, QTM(window));
-            QTM(window) = NULL;
-          }
-          break;
-        default:
-          break;
-      }
-
       /* fdintCLOSE_FILE_INFO notification */
       ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
       fdin.pv = pvUser;
@@ -2359,6 +2365,16 @@
     }
   }
 
+  /* free decompression temps */
+  if (LZX(window)) {
+    PFDI_FREE(hfdi, LZX(window));
+    LZX(window) = NULL;
+  }
+  if (QTM(window)) {
+    PFDI_FREE(hfdi, QTM(window));
+    QTM(window) = NULL;
+  }
+
   while (decomp_state) {
     fdi_decomp_state *prev_fds;
 
@@ -2391,6 +2407,16 @@
 
   bail_and_fail: /* here we free ram before error returns */
 
+  /* free decompression temps */
+  if (LZX(window)) {
+    PFDI_FREE(hfdi, LZX(window));
+    LZX(window) = NULL;
+  }
+  if (QTM(window)) {
+    PFDI_FREE(hfdi, QTM(window));
+    QTM(window) = NULL;
+  }
+
   while (decomp_state) {
     fdi_decomp_state *prev_fds;
 
-- 
gmt

"Deorum injuriae Diis curae" 
(trans: "Leave offenses against the gods to the care of the gods")
- Tacitus




More information about the wine-patches mailing list