]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Re-Implement Workspace Shrinking when Oversized
authorW. Felix Handte <w@felixhandte.com>
Thu, 22 Aug 2019 20:09:00 +0000 (16:09 -0400)
committerW. Felix Handte <w@felixhandte.com>
Mon, 9 Sep 2019 17:34:08 +0000 (13:34 -0400)
lib/compress/zstd_compress.c
lib/compress/zstd_cwksp.c
lib/compress/zstd_cwksp.h

index f88f3b7cd20ffb96e71318b378103e82e2fe494d..8abb7a480bbef3dae4bf7c74a4a01ec577995daa 100644 (file)
@@ -1451,7 +1451,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
                                   zc->seqStore.maxNbSeq, zc->seqStore.maxNbLit,
                                   zbuff, pledgedSrcSize) ) {
             DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> consider continue mode");
-            if (ZSTD_cwksp_bump_oversized_duration(&zc->workspace) <= ZSTD_WORKSPACETOOLARGE_MAXDURATION) {
+            ZSTD_cwksp_bump_oversized_duration(&zc->workspace, 0);
+            if (!ZSTD_cwksp_check_wasteful(&zc->workspace, 0)) {
                 DEBUGLOG(4, "continue mode confirmed (wLog1=%u, blockSize1=%zu)",
                             zc->appliedParams.cParams.windowLog, zc->blockSize);
                 if (ZSTD_indexTooCloseToMax(zc->blockState.matchState.window)) {
index a117ad09dc4d8b9feff3217ab5a8349668bf151c..51df4ee3c805d92c1a2868413db7dea5f02c6799 100644 (file)
@@ -124,18 +124,6 @@ void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) {
     return start;
 }
 
-// TODO
-int ZSTD_cwksp_bump_oversized_duration(ZSTD_cwksp* ws) {
-    (void)ws;
-    // if (((BYTE*)ws->allocEnd - (BYTE*)ws->workspace) * ZSTD_WORKSPACETOOLARGE_FACTOR < (BYTE*)ws->workspaceEnd - (BYTE*)ws->workspace) {
-    //     ws->workspaceOversizedDuration++;
-    // } else {
-    //     ws->workspaceOversizedDuration = 0;
-    // }
-    // return ws->workspaceOversizedDuration;
-    return 0;
-}
-
 /**
  * Invalidates table allocations.
  * All other allocations remain valid.
@@ -150,7 +138,6 @@ void ZSTD_cwksp_clear_tables(ZSTD_cwksp* ws) {
  */
 void ZSTD_cwksp_clear(ZSTD_cwksp* ws) {
     DEBUGLOG(3, "wksp: clearing!");
-    ZSTD_cwksp_bump_oversized_duration(ws);
     ws->tableEnd = ws->objectEnd;
     ws->allocStart = ws->workspaceEnd;
     ws->allocFailed = 0;
@@ -186,24 +173,39 @@ void ZSTD_cwksp_free(ZSTD_cwksp* ws, ZSTD_customMem customMem) {
     ZSTD_cwksp_clear(ws);
 }
 
+size_t ZSTD_cwksp_sizeof(const ZSTD_cwksp* ws) {
+    return (BYTE*)ws->workspaceEnd - (BYTE*)ws->workspace;
+}
+
+int ZSTD_cwksp_reserve_failed(const ZSTD_cwksp* ws) {
+    return ws->allocFailed;
+}
+
 size_t ZSTD_cwksp_available_space(ZSTD_cwksp* ws) {
     return (size_t)((BYTE*)ws->allocStart - (BYTE*)ws->tableEnd);
 }
 
-int ZSTD_cwksp_check_available(ZSTD_cwksp* ws, size_t minFree) {
-    return ZSTD_cwksp_available_space(ws) >= minFree;
+void ZSTD_cwksp_bump_oversized_duration(
+        ZSTD_cwksp* ws, size_t additionalNeededSpace) {
+    if (ZSTD_cwksp_check_too_large(ws, additionalNeededSpace)) {
+        ws->workspaceOversizedDuration++;
+    } else {
+        ws->workspaceOversizedDuration = 0;
+    }
 }
 
-int ZSTD_cwksp_check_wasteful(ZSTD_cwksp* ws, size_t minFree) {
-    return ZSTD_cwksp_check_available(ws, minFree * ZSTD_WORKSPACETOOLARGE_FACTOR) && ws->workspaceOversizedDuration > ZSTD_WORKSPACETOOLARGE_MAXDURATION;
+int ZSTD_cwksp_check_available(ZSTD_cwksp* ws, size_t additionalNeededSpace) {
+    return ZSTD_cwksp_available_space(ws) >= additionalNeededSpace;
 }
 
-size_t ZSTD_cwksp_sizeof(const ZSTD_cwksp* ws) {
-    return (BYTE*)ws->workspaceEnd - (BYTE*)ws->workspace;
+int ZSTD_cwksp_check_too_large(ZSTD_cwksp* ws, size_t additionalNeededSpace) {
+    return ZSTD_cwksp_check_available(
+        ws, additionalNeededSpace * ZSTD_WORKSPACETOOLARGE_FACTOR);
 }
 
-int ZSTD_cwksp_reserve_failed(const ZSTD_cwksp* ws) {
-    return ws->allocFailed;
+int ZSTD_cwksp_check_wasteful(ZSTD_cwksp* ws, size_t additionalNeededSpace) {
+    return ZSTD_cwksp_check_too_large(ws, additionalNeededSpace)
+        && ws->workspaceOversizedDuration > ZSTD_WORKSPACETOOLARGE_MAXDURATION;
 }
 
 #if defined (__cplusplus)
index 965ca6b0e4c9315c6727ed599cd18a5387f8366c..5abc97be7abc2dce7f879e438a686c2e183db423 100644 (file)
@@ -159,8 +159,6 @@ void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes);
  */
 void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes);
 
-int ZSTD_cwksp_bump_oversized_duration(ZSTD_cwksp* ws);
-
 /**
  * Invalidates table allocations.
  * All other allocations remain valid.
@@ -179,15 +177,23 @@ size_t ZSTD_cwksp_create(ZSTD_cwksp* ws, size_t size, ZSTD_customMem customMem);
 
 void ZSTD_cwksp_free(ZSTD_cwksp* ws, ZSTD_customMem customMem);
 
+size_t ZSTD_cwksp_sizeof(const ZSTD_cwksp* ws);
+
+int ZSTD_cwksp_reserve_failed(const ZSTD_cwksp* ws);
+
+/*-*************************************
+*  Functions Checking Free Space
+***************************************/
+
 size_t ZSTD_cwksp_available_space(ZSTD_cwksp* ws);
 
-int ZSTD_cwksp_check_available(ZSTD_cwksp* ws, size_t minFree);
+int ZSTD_cwksp_check_available(ZSTD_cwksp* ws, size_t additionalNeededSpace);
 
-int ZSTD_cwksp_check_wasteful(ZSTD_cwksp* ws, size_t minFree);
+int ZSTD_cwksp_check_too_large(ZSTD_cwksp* ws, size_t additionalNeededSpace);
 
-size_t ZSTD_cwksp_sizeof(const ZSTD_cwksp* ws);
+int ZSTD_cwksp_check_wasteful(ZSTD_cwksp* ws, size_t additionalNeededSpace);
 
-int ZSTD_cwksp_reserve_failed(const ZSTD_cwksp* ws);
+void ZSTD_cwksp_bump_oversized_duration(ZSTD_cwksp* ws, size_t additionalNeededSpace);
 
 #if defined (__cplusplus)
 }