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