1*01826a49SYabin Cui /* 2*01826a49SYabin Cui * Copyright (c) Meta Platforms, Inc. and affiliates. 3*01826a49SYabin Cui * All rights reserved. 4*01826a49SYabin Cui * 5*01826a49SYabin Cui * This source code is licensed under both the BSD-style license (found in the 6*01826a49SYabin Cui * LICENSE file in the root directory of this source tree) and the GPLv2 (found 7*01826a49SYabin Cui * in the COPYING file in the root directory of this source tree). 8*01826a49SYabin Cui * You may select, at your option, one of the above-listed licenses. 9*01826a49SYabin Cui */ 10*01826a49SYabin Cui 11*01826a49SYabin Cui #ifndef ZSTD_FILEIO_COMMON_H 12*01826a49SYabin Cui #define ZSTD_FILEIO_COMMON_H 13*01826a49SYabin Cui 14*01826a49SYabin Cui #if defined (__cplusplus) 15*01826a49SYabin Cui extern "C" { 16*01826a49SYabin Cui #endif 17*01826a49SYabin Cui 18*01826a49SYabin Cui #include "../lib/common/mem.h" /* U32, U64 */ 19*01826a49SYabin Cui #include "fileio_types.h" 20*01826a49SYabin Cui #include "platform.h" 21*01826a49SYabin Cui #include "timefn.h" /* UTIL_getTime, UTIL_clockSpanMicro */ 22*01826a49SYabin Cui 23*01826a49SYabin Cui /*-************************************* 24*01826a49SYabin Cui * Macros 25*01826a49SYabin Cui ***************************************/ 26*01826a49SYabin Cui #define KB *(1 <<10) 27*01826a49SYabin Cui #define MB *(1 <<20) 28*01826a49SYabin Cui #define GB *(1U<<30) 29*01826a49SYabin Cui #undef MAX 30*01826a49SYabin Cui #define MAX(a,b) ((a)>(b) ? (a) : (b)) 31*01826a49SYabin Cui 32*01826a49SYabin Cui extern FIO_display_prefs_t g_display_prefs; 33*01826a49SYabin Cui 34*01826a49SYabin Cui #define DISPLAY(...) fprintf(stderr, __VA_ARGS__) 35*01826a49SYabin Cui #define DISPLAYOUT(...) fprintf(stdout, __VA_ARGS__) 36*01826a49SYabin Cui #define DISPLAYLEVEL(l, ...) { if (g_display_prefs.displayLevel>=l) { DISPLAY(__VA_ARGS__); } } 37*01826a49SYabin Cui 38*01826a49SYabin Cui extern UTIL_time_t g_displayClock; 39*01826a49SYabin Cui 40*01826a49SYabin Cui #define REFRESH_RATE ((U64)(SEC_TO_MICRO / 6)) 41*01826a49SYabin Cui #define READY_FOR_UPDATE() (UTIL_clockSpanMicro(g_displayClock) > REFRESH_RATE || g_display_prefs.displayLevel >= 4) 42*01826a49SYabin Cui #define DELAY_NEXT_UPDATE() { g_displayClock = UTIL_getTime(); } 43*01826a49SYabin Cui #define DISPLAYUPDATE(l, ...) { \ 44*01826a49SYabin Cui if (g_display_prefs.displayLevel>=l && (g_display_prefs.progressSetting != FIO_ps_never)) { \ 45*01826a49SYabin Cui if (READY_FOR_UPDATE()) { \ 46*01826a49SYabin Cui DELAY_NEXT_UPDATE(); \ 47*01826a49SYabin Cui DISPLAY(__VA_ARGS__); \ 48*01826a49SYabin Cui if (g_display_prefs.displayLevel>=4) fflush(stderr); \ 49*01826a49SYabin Cui } } } 50*01826a49SYabin Cui 51*01826a49SYabin Cui #define SHOULD_DISPLAY_SUMMARY() \ 52*01826a49SYabin Cui (g_display_prefs.displayLevel >= 2 || g_display_prefs.progressSetting == FIO_ps_always) 53*01826a49SYabin Cui #define SHOULD_DISPLAY_PROGRESS() \ 54*01826a49SYabin Cui (g_display_prefs.progressSetting != FIO_ps_never && SHOULD_DISPLAY_SUMMARY()) 55*01826a49SYabin Cui #define DISPLAY_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYLEVEL(1, __VA_ARGS__); }} 56*01826a49SYabin Cui #define DISPLAYUPDATE_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYUPDATE(1, __VA_ARGS__); }} 57*01826a49SYabin Cui #define DISPLAY_SUMMARY(...) { if (SHOULD_DISPLAY_SUMMARY()) { DISPLAYLEVEL(1, __VA_ARGS__); } } 58*01826a49SYabin Cui 59*01826a49SYabin Cui #undef MIN /* in case it would be already defined */ 60*01826a49SYabin Cui #define MIN(a,b) ((a) < (b) ? (a) : (b)) 61*01826a49SYabin Cui 62*01826a49SYabin Cui 63*01826a49SYabin Cui #define EXM_THROW(error, ...) \ 64*01826a49SYabin Cui { \ 65*01826a49SYabin Cui DISPLAYLEVEL(1, "zstd: "); \ 66*01826a49SYabin Cui DISPLAYLEVEL(5, "Error defined at %s, line %i : \n", __FILE__, __LINE__); \ 67*01826a49SYabin Cui DISPLAYLEVEL(1, "error %i : ", error); \ 68*01826a49SYabin Cui DISPLAYLEVEL(1, __VA_ARGS__); \ 69*01826a49SYabin Cui DISPLAYLEVEL(1, " \n"); \ 70*01826a49SYabin Cui exit(error); \ 71*01826a49SYabin Cui } 72*01826a49SYabin Cui 73*01826a49SYabin Cui #define CHECK_V(v, f) \ 74*01826a49SYabin Cui v = f; \ 75*01826a49SYabin Cui if (ZSTD_isError(v)) { \ 76*01826a49SYabin Cui DISPLAYLEVEL(5, "%s \n", #f); \ 77*01826a49SYabin Cui EXM_THROW(11, "%s", ZSTD_getErrorName(v)); \ 78*01826a49SYabin Cui } 79*01826a49SYabin Cui #define CHECK(f) { size_t err; CHECK_V(err, f); } 80*01826a49SYabin Cui 81*01826a49SYabin Cui 82*01826a49SYabin Cui /* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW */ 83*01826a49SYabin Cui #if defined(_MSC_VER) && _MSC_VER >= 1400 84*01826a49SYabin Cui # define LONG_SEEK _fseeki64 85*01826a49SYabin Cui # define LONG_TELL _ftelli64 86*01826a49SYabin Cui #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ 87*01826a49SYabin Cui # define LONG_SEEK fseeko 88*01826a49SYabin Cui # define LONG_TELL ftello 89*01826a49SYabin Cui #elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) 90*01826a49SYabin Cui # define LONG_SEEK fseeko64 91*01826a49SYabin Cui # define LONG_TELL ftello64 92*01826a49SYabin Cui #elif defined(_WIN32) && !defined(__DJGPP__) 93*01826a49SYabin Cui # include <windows.h> LONG_SEEK(FILE * file,__int64 offset,int origin)94*01826a49SYabin Cui static int LONG_SEEK(FILE* file, __int64 offset, int origin) { 95*01826a49SYabin Cui LARGE_INTEGER off; 96*01826a49SYabin Cui DWORD method; 97*01826a49SYabin Cui off.QuadPart = offset; 98*01826a49SYabin Cui if (origin == SEEK_END) 99*01826a49SYabin Cui method = FILE_END; 100*01826a49SYabin Cui else if (origin == SEEK_CUR) 101*01826a49SYabin Cui method = FILE_CURRENT; 102*01826a49SYabin Cui else 103*01826a49SYabin Cui method = FILE_BEGIN; 104*01826a49SYabin Cui 105*01826a49SYabin Cui if (SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, NULL, method)) 106*01826a49SYabin Cui return 0; 107*01826a49SYabin Cui else 108*01826a49SYabin Cui return -1; 109*01826a49SYabin Cui } LONG_TELL(FILE * file)110*01826a49SYabin Cui static __int64 LONG_TELL(FILE* file) { 111*01826a49SYabin Cui LARGE_INTEGER off, newOff; 112*01826a49SYabin Cui off.QuadPart = 0; 113*01826a49SYabin Cui newOff.QuadPart = 0; 114*01826a49SYabin Cui SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, &newOff, FILE_CURRENT); 115*01826a49SYabin Cui return newOff.QuadPart; 116*01826a49SYabin Cui } 117*01826a49SYabin Cui #else 118*01826a49SYabin Cui # define LONG_SEEK fseek 119*01826a49SYabin Cui # define LONG_TELL ftell 120*01826a49SYabin Cui #endif 121*01826a49SYabin Cui 122*01826a49SYabin Cui #if defined (__cplusplus) 123*01826a49SYabin Cui } 124*01826a49SYabin Cui #endif 125*01826a49SYabin Cui #endif /* ZSTD_FILEIO_COMMON_H */ 126