| 1 | /* | 
|---|
| 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. | 
|---|
| 3 | * All rights reserved. | 
|---|
| 4 | * | 
|---|
| 5 | * This source code is licensed under both the BSD-style license (found in the | 
|---|
| 6 | * LICENSE file in the root directory of this source tree) and the GPLv2 (found | 
|---|
| 7 | * in the COPYING file in the root directory of this source tree). | 
|---|
| 8 | * You may select, at your option, one of the above-listed licenses. | 
|---|
| 9 | */ | 
|---|
| 10 |  | 
|---|
| 11 | #ifndef ZSTD_TRACE_H | 
|---|
| 12 | #define ZSTD_TRACE_H | 
|---|
| 13 |  | 
|---|
| 14 | #if defined (__cplusplus) | 
|---|
| 15 | extern "C"{ | 
|---|
| 16 | #endif | 
|---|
| 17 |  | 
|---|
| 18 | #include <stddef.h> | 
|---|
| 19 |  | 
|---|
| 20 | /* weak symbol support | 
|---|
| 21 | * For now, enable conservatively: | 
|---|
| 22 | * - Only GNUC | 
|---|
| 23 | * - Only ELF | 
|---|
| 24 | * - Only x86-64, i386 and aarch64 | 
|---|
| 25 | * Also, explicitly disable on platforms known not to work so they aren't | 
|---|
| 26 | * forgotten in the future. | 
|---|
| 27 | */ | 
|---|
| 28 | #if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \ | 
|---|
| 29 | defined(__GNUC__) && defined(__ELF__) && \ | 
|---|
| 30 | (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) || defined(__aarch64__)) && \ | 
|---|
| 31 | !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \ | 
|---|
| 32 | !defined(__CYGWIN__) && !defined(_AIX) | 
|---|
| 33 | #  define ZSTD_HAVE_WEAK_SYMBOLS 1 | 
|---|
| 34 | #else | 
|---|
| 35 | #  define ZSTD_HAVE_WEAK_SYMBOLS 0 | 
|---|
| 36 | #endif | 
|---|
| 37 | #if ZSTD_HAVE_WEAK_SYMBOLS | 
|---|
| 38 | #  define ZSTD_WEAK_ATTR __attribute__((__weak__)) | 
|---|
| 39 | #else | 
|---|
| 40 | #  define ZSTD_WEAK_ATTR | 
|---|
| 41 | #endif | 
|---|
| 42 |  | 
|---|
| 43 | /* Only enable tracing when weak symbols are available. */ | 
|---|
| 44 | #ifndef ZSTD_TRACE | 
|---|
| 45 | #  define ZSTD_TRACE ZSTD_HAVE_WEAK_SYMBOLS | 
|---|
| 46 | #endif | 
|---|
| 47 |  | 
|---|
| 48 | #if ZSTD_TRACE | 
|---|
| 49 |  | 
|---|
| 50 | struct ZSTD_CCtx_s; | 
|---|
| 51 | struct ZSTD_DCtx_s; | 
|---|
| 52 | struct ZSTD_CCtx_params_s; | 
|---|
| 53 |  | 
|---|
| 54 | typedef struct { | 
|---|
| 55 | /** | 
|---|
| 56 | * ZSTD_VERSION_NUMBER | 
|---|
| 57 | * | 
|---|
| 58 | * This is guaranteed to be the first member of ZSTD_trace. | 
|---|
| 59 | * Otherwise, this struct is not stable between versions. If | 
|---|
| 60 | * the version number does not match your expectation, you | 
|---|
| 61 | * should not interpret the rest of the struct. | 
|---|
| 62 | */ | 
|---|
| 63 | unsigned version; | 
|---|
| 64 | /** | 
|---|
| 65 | * Non-zero if streaming (de)compression is used. | 
|---|
| 66 | */ | 
|---|
| 67 | unsigned streaming; | 
|---|
| 68 | /** | 
|---|
| 69 | * The dictionary ID. | 
|---|
| 70 | */ | 
|---|
| 71 | unsigned dictionaryID; | 
|---|
| 72 | /** | 
|---|
| 73 | * Is the dictionary cold? | 
|---|
| 74 | * Only set on decompression. | 
|---|
| 75 | */ | 
|---|
| 76 | unsigned dictionaryIsCold; | 
|---|
| 77 | /** | 
|---|
| 78 | * The dictionary size or zero if no dictionary. | 
|---|
| 79 | */ | 
|---|
| 80 | size_t dictionarySize; | 
|---|
| 81 | /** | 
|---|
| 82 | * The uncompressed size of the data. | 
|---|
| 83 | */ | 
|---|
| 84 | size_t uncompressedSize; | 
|---|
| 85 | /** | 
|---|
| 86 | * The compressed size of the data. | 
|---|
| 87 | */ | 
|---|
| 88 | size_t compressedSize; | 
|---|
| 89 | /** | 
|---|
| 90 | * The fully resolved CCtx parameters (NULL on decompression). | 
|---|
| 91 | */ | 
|---|
| 92 | struct ZSTD_CCtx_params_s const* params; | 
|---|
| 93 | /** | 
|---|
| 94 | * The ZSTD_CCtx pointer (NULL on decompression). | 
|---|
| 95 | */ | 
|---|
| 96 | struct ZSTD_CCtx_s const* cctx; | 
|---|
| 97 | /** | 
|---|
| 98 | * The ZSTD_DCtx pointer (NULL on compression). | 
|---|
| 99 | */ | 
|---|
| 100 | struct ZSTD_DCtx_s const* dctx; | 
|---|
| 101 | } ZSTD_Trace; | 
|---|
| 102 |  | 
|---|
| 103 | /** | 
|---|
| 104 | * A tracing context. It must be 0 when tracing is disabled. | 
|---|
| 105 | * Otherwise, any non-zero value returned by a tracing begin() | 
|---|
| 106 | * function is presented to any subsequent calls to end(). | 
|---|
| 107 | * | 
|---|
| 108 | * Any non-zero value is treated as tracing is enabled and not | 
|---|
| 109 | * interpreted by the library. | 
|---|
| 110 | * | 
|---|
| 111 | * Two possible uses are: | 
|---|
| 112 | * * A timestamp for when the begin() function was called. | 
|---|
| 113 | * * A unique key identifying the (de)compression, like the | 
|---|
| 114 | *   address of the [dc]ctx pointer if you need to track | 
|---|
| 115 | *   more information than just a timestamp. | 
|---|
| 116 | */ | 
|---|
| 117 | typedef unsigned long long ZSTD_TraceCtx; | 
|---|
| 118 |  | 
|---|
| 119 | /** | 
|---|
| 120 | * Trace the beginning of a compression call. | 
|---|
| 121 | * @param cctx The dctx pointer for the compression. | 
|---|
| 122 | *             It can be used as a key to map begin() to end(). | 
|---|
| 123 | * @returns Non-zero if tracing is enabled. The return value is | 
|---|
| 124 | *          passed to ZSTD_trace_compress_end(). | 
|---|
| 125 | */ | 
|---|
| 126 | ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_compress_begin( | 
|---|
| 127 | struct ZSTD_CCtx_s const* cctx); | 
|---|
| 128 |  | 
|---|
| 129 | /** | 
|---|
| 130 | * Trace the end of a compression call. | 
|---|
| 131 | * @param ctx The return value of ZSTD_trace_compress_begin(). | 
|---|
| 132 | * @param trace The zstd tracing info. | 
|---|
| 133 | */ | 
|---|
| 134 | ZSTD_WEAK_ATTR void ZSTD_trace_compress_end( | 
|---|
| 135 | ZSTD_TraceCtx ctx, | 
|---|
| 136 | ZSTD_Trace const* trace); | 
|---|
| 137 |  | 
|---|
| 138 | /** | 
|---|
| 139 | * Trace the beginning of a decompression call. | 
|---|
| 140 | * @param dctx The dctx pointer for the decompression. | 
|---|
| 141 | *             It can be used as a key to map begin() to end(). | 
|---|
| 142 | * @returns Non-zero if tracing is enabled. The return value is | 
|---|
| 143 | *          passed to ZSTD_trace_compress_end(). | 
|---|
| 144 | */ | 
|---|
| 145 | ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_decompress_begin( | 
|---|
| 146 | struct ZSTD_DCtx_s const* dctx); | 
|---|
| 147 |  | 
|---|
| 148 | /** | 
|---|
| 149 | * Trace the end of a decompression call. | 
|---|
| 150 | * @param ctx The return value of ZSTD_trace_decompress_begin(). | 
|---|
| 151 | * @param trace The zstd tracing info. | 
|---|
| 152 | */ | 
|---|
| 153 | ZSTD_WEAK_ATTR void ZSTD_trace_decompress_end( | 
|---|
| 154 | ZSTD_TraceCtx ctx, | 
|---|
| 155 | ZSTD_Trace const* trace); | 
|---|
| 156 |  | 
|---|
| 157 | #endif /* ZSTD_TRACE */ | 
|---|
| 158 |  | 
|---|
| 159 | #if defined (__cplusplus) | 
|---|
| 160 | } | 
|---|
| 161 | #endif | 
|---|
| 162 |  | 
|---|
| 163 | #endif /* ZSTD_TRACE_H */ | 
|---|
| 164 |  | 
|---|