From b048af5999061a41e68d1083ef7b0ab2fe75e29d Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Fri, 14 Sep 2018 15:23:35 -0700 Subject: [PATCH 1/3] ZSTD_fast: Don't Search Dict Context When Mismatch Was Found --- lib/compress/zstd_fast.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 37a715167..7d7efb465 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -124,8 +124,7 @@ size_t ZSTD_compressBlock_fast_generic( mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; ip++; ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH); - } else if ( (matchIndex <= prefixStartIndex) - || (MEM_read32(match) != MEM_read32(ip)) ) { + } else if ( (matchIndex <= prefixStartIndex) ) { if (dictMode == ZSTD_dictMatchState) { U32 const dictMatchIndex = dictHashTable[h]; const BYTE* dictMatch = dictBase + dictMatchIndex; @@ -151,6 +150,11 @@ size_t ZSTD_compressBlock_fast_generic( ip += ((ip-anchor) >> kSearchStrength) + stepSize; continue; } + } else if (MEM_read32(match) != MEM_read32(ip)) { + /* it's not a match, and we're not going to check the dictionary */ + assert(stepSize >= 1); + ip += ((ip-anchor) >> kSearchStrength) + stepSize; + continue; } else { /* found a regular match */ U32 const offset = (U32)(ip-match); From b76c88849748935bfd703a0703770d820e75c6b7 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Fri, 14 Sep 2018 15:24:25 -0700 Subject: [PATCH 2/3] ZSTD_dfast: Don't Search Dict Context When Mismatch Was Found --- lib/compress/zstd_double_fast.c | 54 ++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index 7fc11eb48..9231c8157 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -141,16 +141,16 @@ size_t ZSTD_compressBlock_doubleFast_generic( goto _match_stored; } - /* check prefix long match */ - if ( (matchIndexL > prefixLowestIndex) && (MEM_read64(matchLong) == MEM_read64(ip)) ) { - mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8; - offset = (U32)(ip-matchLong); - while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ - goto _match_found; - } - - /* check dictMatchState long match */ - if (dictMode == ZSTD_dictMatchState) { + if (matchIndexL > prefixLowestIndex) { + /* check prefix long match */ + if (MEM_read64(matchLong) == MEM_read64(ip)) { + mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8; + offset = (U32)(ip-matchLong); + while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ + goto _match_found; + } + } else if (dictMode == ZSTD_dictMatchState) { + /* check dictMatchState long match */ U32 const dictMatchIndexL = dictHashLong[h2]; const BYTE* dictMatchL = dictBase + dictMatchIndexL; assert(dictMatchL < dictEnd); @@ -163,13 +163,13 @@ size_t ZSTD_compressBlock_doubleFast_generic( } } - /* check prefix short match */ - if ( (matchIndexS > prefixLowestIndex) && (MEM_read32(match) == MEM_read32(ip)) ) { - goto _search_next_long; - } - - /* check dictMatchState short match */ - if (dictMode == ZSTD_dictMatchState) { + if (matchIndexS > prefixLowestIndex) { + /* check prefix short match */ + if (MEM_read32(match) == MEM_read32(ip)) { + goto _search_next_long; + } + } else if (dictMode == ZSTD_dictMatchState) { + /* check dictMatchState short match */ U32 const dictMatchIndexS = dictHashSmall[h]; match = dictBase + dictMatchIndexS; matchIndexS = dictMatchIndexS + dictIndexDelta; @@ -191,16 +191,16 @@ _search_next_long: hashLong[hl3] = current + 1; /* check prefix long +1 match */ - if ( (matchIndexL3 > prefixLowestIndex) && (MEM_read64(matchL3) == MEM_read64(ip+1)) ) { - mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8; - ip++; - offset = (U32)(ip-matchL3); - while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */ - goto _match_found; - } - - /* check dict long +1 match */ - if (dictMode == ZSTD_dictMatchState) { + if (matchIndexL3 > prefixLowestIndex) { + if (MEM_read64(matchL3) == MEM_read64(ip+1)) { + mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8; + ip++; + offset = (U32)(ip-matchL3); + while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */ + goto _match_found; + } + } else if (dictMode == ZSTD_dictMatchState) { + /* check dict long +1 match */ U32 const dictMatchIndexL3 = dictHashLong[hl3]; const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3; assert(dictMatchL3 < dictEnd); From 54001f3dbccce12496be78eebf3c543b8376cced Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 21 Sep 2018 14:46:09 -0700 Subject: [PATCH 3/3] fix mingw compatibility only enable backtraces for platforms we know support it aka mac OS-X and Linux. can be extended later. --- programs/fileio.c | 12 ++++++++---- programs/util.h | 6 +++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 5f6b12e51..e08920ba8 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -20,6 +20,9 @@ # define _POSIX_SOURCE 1 /* disable %llu warnings with MinGW on Windows */ #endif +#if defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) +# define BACKTRACES_ENABLE 1 +#endif /*-************************************* * Includes @@ -31,8 +34,8 @@ #include /* strcmp, strlen */ #include /* errno */ #include -#ifndef _WIN32 -#include /* backtrace, backtrace_symbols */ +#ifdef BACKTRACES_ENABLE +# include /* backtrace, backtrace_symbols */ #endif #if defined (_MSC_VER) @@ -162,9 +165,10 @@ static void clearHandler(void) /*-********************************************************* * Termination signal trapping (Print debug stack trace) ***********************************************************/ +#ifdef BACKTRACES_ENABLE + #define MAX_STACK_FRAMES 50 -#ifndef _WIN32 static void ABRThandler(int sig) { const char* name; void* addrlist[MAX_STACK_FRAMES]; @@ -202,7 +206,7 @@ static void ABRThandler(int sig) { void FIO_addAbortHandler() { -#ifndef _WIN32 +#ifdef BACKTRACES_ENABLE signal(SIGABRT, ABRThandler); signal(SIGFPE, ABRThandler); signal(SIGILL, ABRThandler); diff --git a/programs/util.h b/programs/util.h index 8993bf964..e8288b8fe 100644 --- a/programs/util.h +++ b/programs/util.h @@ -170,7 +170,11 @@ static int g_utilDisplayLevel; return ((clockEnd - clockStart) * (U64)rate.numer) / ((U64)rate.denom); } -#elif (PLATFORM_POSIX_VERSION >= 200112L) && (defined __UCLIBC__ || ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 17) || __GLIBC__ > 2)) +#elif (PLATFORM_POSIX_VERSION >= 200112L) \ + && (defined(__UCLIBC__) \ + || (defined(__GLIBC__) \ + && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 17) \ + || (__GLIBC__ > 2)))) #define UTIL_TIME_INITIALIZER { 0, 0 } typedef struct timespec UTIL_freq_t;