xref: /src/sys/contrib/zstd/programs/fileio_common.h (revision c0d9a07101a1e72769ee0619a583f63a078fb391)
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