]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Merge remote-tracking branch 'upstream/dev' into single-file-lib
authorCarl Woffenden <cwoffenden@gmail.com>
Tue, 7 Apr 2020 09:13:02 +0000 (11:13 +0200)
committerCarl Woffenden <cwoffenden@gmail.com>
Tue, 7 Apr 2020 09:13:02 +0000 (11:13 +0200)
1  2 
lib/common/zstd_internal.h
lib/decompress/zstd_decompress.c

index 899883bc3af1edd6901ee2a2d27c0ac2724d8fa7,099a98e7744fb7277db42e06c0d2228b79c4cfc5..2103ef8594e41bb435d299db04dfcfc81ad27a49
@@@ -248,15 -248,17 +248,26 @@@ void ZSTD_wildcopy(void* dst, const voi
      }
  }
  
 +MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
 +{
 +    size_t const length = MIN(dstCapacity, srcSize);
 +    if (length > 0) {
 +        memcpy(dst, src, length);
 +    }
 +    return length;
 +}
 +
+ /* define "workspace is too large" as this number of times larger than needed */
+ #define ZSTD_WORKSPACETOOLARGE_FACTOR 3
+ /* when workspace is continuously too large
+  * during at least this number of times,
+  * context's memory usage is considered wasteful,
+  * because it's sized to handle a worst case scenario which rarely happens.
+  * In which case, resize it down to free some memory */
+ #define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128
  /*-*******************************************
  *  Private declarations
  *********************************************/
index ac93ed0bf3a461d49cfbbb89d8b6783d940b80ad,7547230428c3ff948eeb54bfa5e90da1b5871013..a7fcd57fea5a041b3e3e0ca7195592a160f4ea4b
@@@ -1498,6 -1499,33 +1499,25 @@@ size_t ZSTD_estimateDStreamSize_fromFra
  
  /* *****   Decompression   ***** */
  
 -MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
 -{
 -    size_t const length = MIN(dstCapacity, srcSize);
 -    if (length > 0) {
 -        memcpy(dst, src, length);
 -    }
 -    return length;
 -}
+ static int ZSTD_DCtx_isOverflow(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize)
+ {
+     return (zds->inBuffSize + zds->outBuffSize) >= (neededInBuffSize + neededOutBuffSize) * ZSTD_WORKSPACETOOLARGE_FACTOR;
+ }
+ static void ZSTD_DCtx_updateOversizedDuration(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize)
+ {
+     if (ZSTD_DCtx_isOverflow(zds, neededInBuffSize, neededOutBuffSize))
+         zds->oversizedDuration++;
+     else 
+         zds->oversizedDuration = 0;
+ }
+ static int ZSTD_DCtx_isOversizedTooLong(ZSTD_DStream* zds)
+ {
+     return zds->oversizedDuration >= ZSTD_WORKSPACETOOLARGE_MAXDURATION;
+ }
  size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
  {
      const char* const src = (const char*)input->src;