17e509d50SXin LI /* 27e509d50SXin LI * Copyright (c) Meta Platforms, Inc. and affiliates. 37e509d50SXin LI * All rights reserved. 47e509d50SXin LI * 57e509d50SXin LI * This source code is licensed under both the BSD-style license (found in the 67e509d50SXin LI * LICENSE file in the root directory of this source tree) and the GPLv2 (found 77e509d50SXin LI * in the COPYING file in the root directory of this source tree). 87e509d50SXin LI * You may select, at your option, one of the above-listed licenses. 97e509d50SXin LI */ 107e509d50SXin LI 117e509d50SXin LI #ifndef ZSTD_FILEIO_COMMON_H 127e509d50SXin LI #define ZSTD_FILEIO_COMMON_H 137e509d50SXin LI 147e509d50SXin LI #include "../lib/common/mem.h" /* U32, U64 */ 157e509d50SXin LI #include "fileio_types.h" 167e509d50SXin LI #include "platform.h" 177e509d50SXin LI #include "timefn.h" /* UTIL_getTime, UTIL_clockSpanMicro */ 187e509d50SXin LI 197e509d50SXin LI /*-************************************* 207e509d50SXin LI * Macros 217e509d50SXin LI ***************************************/ 227e509d50SXin LI #define KB *(1 <<10) 237e509d50SXin LI #define MB *(1 <<20) 247e509d50SXin LI #define GB *(1U<<30) 257e509d50SXin LI #undef MAX 267e509d50SXin LI #define MAX(a,b) ((a)>(b) ? (a) : (b)) 277e509d50SXin LI #undef MIN /* in case it would be already defined */ 287e509d50SXin LI #define MIN(a,b) ((a) < (b) ? (a) : (b)) 297e509d50SXin LI 307e509d50SXin LI extern FIO_display_prefs_t g_display_prefs; 317e509d50SXin LI 327e509d50SXin LI #define DISPLAY_F(f, ...) fprintf((f), __VA_ARGS__) 337e509d50SXin LI #define DISPLAYOUT(...) DISPLAY_F(stdout, __VA_ARGS__) 347e509d50SXin LI #define DISPLAY(...) DISPLAY_F(stderr, __VA_ARGS__) 357e509d50SXin LI #define DISPLAYLEVEL(l, ...) { if (g_display_prefs.displayLevel>=l) { DISPLAY(__VA_ARGS__); } } 367e509d50SXin LI 377e509d50SXin LI extern UTIL_time_t g_displayClock; 387e509d50SXin LI 397e509d50SXin LI #define REFRESH_RATE ((U64)(SEC_TO_MICRO / 6)) 407e509d50SXin LI #define READY_FOR_UPDATE() (UTIL_clockSpanMicro(g_displayClock) > REFRESH_RATE || g_display_prefs.displayLevel >= 4) 417e509d50SXin LI #define DELAY_NEXT_UPDATE() { g_displayClock = UTIL_getTime(); } 427e509d50SXin LI #define DISPLAYUPDATE(l, ...) { \ 437e509d50SXin LI if (g_display_prefs.displayLevel>=l && (g_display_prefs.progressSetting != FIO_ps_never)) { \ 447e509d50SXin LI if (READY_FOR_UPDATE()) { \ 457e509d50SXin LI DELAY_NEXT_UPDATE(); \ 467e509d50SXin LI DISPLAY(__VA_ARGS__); \ 477e509d50SXin LI if (g_display_prefs.displayLevel>=4) fflush(stderr); \ 487e509d50SXin LI } } } 497e509d50SXin LI 507e509d50SXin LI #define SHOULD_DISPLAY_SUMMARY() \ 517e509d50SXin LI (g_display_prefs.displayLevel >= 2 || g_display_prefs.progressSetting == FIO_ps_always) 527e509d50SXin LI #define SHOULD_DISPLAY_PROGRESS() \ 537e509d50SXin LI (g_display_prefs.progressSetting != FIO_ps_never && SHOULD_DISPLAY_SUMMARY()) 547e509d50SXin LI #define DISPLAY_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYLEVEL(1, __VA_ARGS__); }} 557e509d50SXin LI #define DISPLAYUPDATE_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYUPDATE(1, __VA_ARGS__); }} 567e509d50SXin LI #define DISPLAY_SUMMARY(...) { if (SHOULD_DISPLAY_SUMMARY()) { DISPLAYLEVEL(1, __VA_ARGS__); } } 577e509d50SXin LI 587e509d50SXin LI #define EXM_THROW(error, ...) \ 597e509d50SXin LI { \ 607e509d50SXin LI DISPLAYLEVEL(1, "zstd: "); \ 617e509d50SXin LI DISPLAYLEVEL(5, "Error defined at %s, line %i : \n", __FILE__, __LINE__); \ 627e509d50SXin LI DISPLAYLEVEL(1, "error %i : ", error); \ 637e509d50SXin LI DISPLAYLEVEL(1, __VA_ARGS__); \ 647e509d50SXin LI DISPLAYLEVEL(1, " \n"); \ 657e509d50SXin LI exit(error); \ 667e509d50SXin LI } 677e509d50SXin LI 687e509d50SXin LI #define CHECK_V(v, f) \ 697e509d50SXin LI v = f; \ 707e509d50SXin LI if (ZSTD_isError(v)) { \ 717e509d50SXin LI DISPLAYLEVEL(5, "%s \n", #f); \ 727e509d50SXin LI EXM_THROW(11, "%s", ZSTD_getErrorName(v)); \ 737e509d50SXin LI } 747e509d50SXin LI #define CHECK(f) { size_t err; CHECK_V(err, f); } 757e509d50SXin LI 767e509d50SXin LI 777e509d50SXin LI /* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW */ 787e509d50SXin LI #if defined(LIBC_NO_FSEEKO) 797e509d50SXin LI /* Some older libc implementations don't include these functions (e.g. Bionic < 24) */ 807e509d50SXin LI # define LONG_SEEK fseek 817e509d50SXin LI # define LONG_TELL ftell 827e509d50SXin LI #elif defined(_MSC_VER) && _MSC_VER >= 1400 837e509d50SXin LI # define LONG_SEEK _fseeki64 847e509d50SXin LI # define LONG_TELL _ftelli64 857e509d50SXin LI #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ 867e509d50SXin LI # define LONG_SEEK fseeko 877e509d50SXin LI # define LONG_TELL ftello 887e509d50SXin LI #elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) 897e509d50SXin LI # define LONG_SEEK fseeko64 907e509d50SXin LI # define LONG_TELL ftello64 917e509d50SXin LI #elif defined(_WIN32) && !defined(__DJGPP__) 927e509d50SXin LI # include <windows.h> LONG_SEEK(FILE * file,__int64 offset,int origin)937e509d50SXin LI static int LONG_SEEK(FILE* file, __int64 offset, int origin) { 947e509d50SXin LI LARGE_INTEGER off; 957e509d50SXin LI DWORD method; 967e509d50SXin LI off.QuadPart = offset; 977e509d50SXin LI if (origin == SEEK_END) 987e509d50SXin LI method = FILE_END; 997e509d50SXin LI else if (origin == SEEK_CUR) 1007e509d50SXin LI method = FILE_CURRENT; 1017e509d50SXin LI else 1027e509d50SXin LI method = FILE_BEGIN; 1037e509d50SXin LI 1047e509d50SXin LI if (SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, NULL, method)) 1057e509d50SXin LI return 0; 1067e509d50SXin LI else 1077e509d50SXin LI return -1; 1087e509d50SXin LI } LONG_TELL(FILE * file)1097e509d50SXin LI static __int64 LONG_TELL(FILE* file) { 1107e509d50SXin LI LARGE_INTEGER off, newOff; 1117e509d50SXin LI off.QuadPart = 0; 1127e509d50SXin LI newOff.QuadPart = 0; 1137e509d50SXin LI SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, &newOff, FILE_CURRENT); 1147e509d50SXin LI return newOff.QuadPart; 1157e509d50SXin LI } 1167e509d50SXin LI #else 1177e509d50SXin LI # define LONG_SEEK fseek 1187e509d50SXin LI # define LONG_TELL ftell 1197e509d50SXin LI #endif 1207e509d50SXin LI 1217e509d50SXin LI #endif /* ZSTD_FILEIO_COMMON_H */ 122