21#if defined (__cplusplus)
36#ifndef ZSTD_CWKSP_ASAN_REDZONE_SIZE
37#define ZSTD_CWKSP_ASAN_REDZONE_SIZE 128
42#define ZSTD_CWKSP_ALIGNMENT_BYTES 64
169 int workspaceOversizedDuration;
191#if ZSTD_MEMORY_SANITIZER
193 intptr_t
const offset = __msan_test_shadow(ws->
initOnceStart,
196#if defined(ZSTD_MSAN_PRINT)
210 size_t const mask = align - 1;
211 assert((align & mask) == 0);
212 return (
size + mask) & ~mask;
230#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
263 size_t const alignBytesMask = alignBytes - 1;
264 size_t const bytes = (alignBytes - ((size_t)ptr & (alignBytesMask))) & alignBytesMask;
265 assert((alignBytes & alignBytesMask) == 0);
290 DEBUGLOG(5,
"cwksp: reserving %p %zd bytes, %zd bytes remaining",
294 if (alloc < bottom) {
295 DEBUGLOG(4,
"cwksp: alloc failed!");
301 if (alloc < ws->tableValidEnd) {
317 if (phase > ws->
phase) {
327 void *
const objectEnd = (
BYTE *) alloc + bytesToAlign;
328 DEBUGLOG(5,
"reserving table alignment addtl space: %zu", bytesToAlign);
330 "table phase - alignment initial allocation failed!");
349 return (ptr !=
NULL) && (ws->
workspace <= ptr) && (ptr < ws->workspaceEnd);
363#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
370#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
408 if(ptr && ptr < ws->initOnceStart) {
418#if ZSTD_MEMORY_SANITIZER
449 if(ws->
phase < phase) {
458 DEBUGLOG(5,
"cwksp: reserving %p table %zd bytes, %zd bytes remaining",
464 DEBUGLOG(4,
"cwksp: table alloc failed!");
470#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
472 __asan_unpoison_memory_region(alloc,
bytes);
489 void* end = (
BYTE*)alloc + roundedBytes;
491#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
497 "cwksp: reserving %p object %zd bytes (rounded to %zd), %zd bytes remaining",
504 DEBUGLOG(3,
"cwksp: object alloc failed!");
512#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
517 __asan_unpoison_memory_region(alloc,
bytes);
526 DEBUGLOG(4,
"cwksp: ZSTD_cwksp_mark_tables_dirty");
528#if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE)
554 DEBUGLOG(4,
"cwksp: ZSTD_cwksp_mark_tables_clean");
567 DEBUGLOG(4,
"cwksp: ZSTD_cwksp_clean_tables");
581 DEBUGLOG(4,
"cwksp: clearing tables!");
583#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
605#if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE)
619#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
654 DEBUGLOG(4,
"cwksp: init'ing workspace with %zd bytes",
size);
670 DEBUGLOG(4,
"cwksp: creating new workspace with %zd bytes",
size);
678 DEBUGLOG(4,
"cwksp: freeing workspace");
679#if ZSTD_MEMORY_SANITIZER && !defined(ZSTD_MSAN_DONT_POISON_WORKSPACE)
680 if (ptr !=
NULL && customMem.customFree !=
NULL) {
736 ZSTD_cwksp* ws,
size_t additionalNeededSpace) {
744#if defined (__cplusplus)
#define MIN(a, b)
Definition deflate.c:1626
unsigned char BYTE
Definition lz4.c:314
#define DEBUGLOG(l,...)
Definition lz4.c:289
unsigned int U32
Definition lz4.c:316
#define assert(condition)
Definition lz4.c:273
char * dst
Definition lz4.h:833
const char * src
Definition lz4.h:866
#define RETURN_ERROR_IF(c, e)
Definition lz4frame.c:320
Definition zstd_cwksp.h:145
BYTE allocFailed
Definition zstd_cwksp.h:154
void * workspaceEnd
Definition zstd_cwksp.h:147
void * tableValidEnd
Definition zstd_cwksp.h:151
void * tableEnd
Definition zstd_cwksp.h:150
ZSTD_cwksp_alloc_phase_e phase
Definition zstd_cwksp.h:156
int workspaceOversizedDuration
Definition zstd_cwksp.h:155
void * objectEnd
Definition zstd_cwksp.h:149
void * workspace
Definition zstd_cwksp.h:146
void * initOnceStart
Definition zstd_cwksp.h:166
void * allocStart
Definition zstd_cwksp.h:152
ZSTD_cwksp_static_alloc_e isStatic
Definition zstd_cwksp.h:157
Definition compress42.c:551
#define ZSTD_ALIGNOF(T)
Definition compiler.h:267
#define NULL
Definition getopt1.c:37
uint8_t U8
Definition mem.h:33
#define MEM_STATIC
Definition mem.h:27
#define ZSTD_memset(d, s, n)
Definition zstd_deps.h:34
void * ZSTD_customMalloc(size_t size, ZSTD_customMem customMem)
Definition zstd_common.c:56
void ZSTD_customFree(void *ptr, ZSTD_customMem customMem)
Definition zstd_common.c:75
#define ZSTD_WORKSPACETOOLARGE_MAXDURATION
Definition zstd_internal.h:274
#define ZSTD_isError
Definition zstd_internal.h:49
#define ZSTD_WORKSPACETOOLARGE_FACTOR
Definition zstd_internal.h:267
MEM_STATIC size_t ZSTD_cwksp_create(ZSTD_cwksp *ws, size_t size, ZSTD_customMem customMem)
Definition zstd_cwksp.h:586
MEM_STATIC size_t ZSTD_cwksp_align(size_t size, size_t const align)
Definition zstd_cwksp.h:179
MEM_STATIC void ZSTD_cwksp_mark_tables_clean(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:484
MEM_STATIC int ZSTD_cwksp_reserve_failed(const ZSTD_cwksp *ws)
Definition zstd_cwksp.h:619
ZSTD_cwksp_static_alloc_e
Definition zstd_cwksp.h:56
@ ZSTD_cwksp_dynamic_alloc
Definition zstd_cwksp.h:57
@ ZSTD_cwksp_static_alloc
Definition zstd_cwksp.h:58
MEM_STATIC void * ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp *ws, size_t const bytes)
Definition zstd_cwksp.h:252
MEM_STATIC void ZSTD_cwksp_move(ZSTD_cwksp *dst, ZSTD_cwksp *src)
Definition zstd_cwksp.h:605
MEM_STATIC size_t ZSTD_cwksp_internal_advance_phase(ZSTD_cwksp *ws, ZSTD_cwksp_alloc_phase_e phase)
Definition zstd_cwksp.h:280
MEM_STATIC size_t ZSTD_cwksp_used(const ZSTD_cwksp *ws)
Definition zstd_cwksp.h:614
#define ZSTD_CWKSP_ALIGNMENT_BYTES
Definition zstd_cwksp.h:40
MEM_STATIC void ZSTD_cwksp_clean_tables(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:497
MEM_STATIC int ZSTD_cwksp_check_too_large(ZSTD_cwksp *ws, size_t additionalNeededSpace)
Definition zstd_cwksp.h:653
MEM_STATIC size_t ZSTD_cwksp_bytes_to_align_ptr(void *ptr, const size_t alignBytes)
Definition zstd_cwksp.h:236
MEM_STATIC void ZSTD_cwksp_clear_tables(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:511
MEM_STATIC void ZSTD_cwksp_assert_internal_consistency(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:166
MEM_STATIC int ZSTD_cwksp_owns_buffer(const ZSTD_cwksp *ws, const void *ptr)
Definition zstd_cwksp.h:322
MEM_STATIC int ZSTD_cwksp_check_wasteful(ZSTD_cwksp *ws, size_t additionalNeededSpace)
Definition zstd_cwksp.h:658
MEM_STATIC int ZSTD_cwksp_estimated_space_within_bounds(const ZSTD_cwksp *const ws, size_t const estimatedSpace, int resizedWorkspace)
Definition zstd_cwksp.h:631
MEM_STATIC size_t ZSTD_cwksp_sizeof(const ZSTD_cwksp *ws)
Definition zstd_cwksp.h:610
MEM_STATIC void ZSTD_cwksp_bump_oversized_duration(ZSTD_cwksp *ws, size_t additionalNeededSpace)
Definition zstd_cwksp.h:663
MEM_STATIC size_t ZSTD_cwksp_slack_space_required(void)
Definition zstd_cwksp.h:219
MEM_STATIC void ZSTD_cwksp_mark_tables_dirty(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:463
ZSTD_cwksp_alloc_phase_e
Definition zstd_cwksp.h:45
@ ZSTD_cwksp_alloc_objects
Definition zstd_cwksp.h:46
@ ZSTD_cwksp_alloc_buffers
Definition zstd_cwksp.h:47
@ ZSTD_cwksp_alloc_aligned
Definition zstd_cwksp.h:48
MEM_STATIC void ZSTD_cwksp_free(ZSTD_cwksp *ws, ZSTD_customMem customMem)
Definition zstd_cwksp.h:594
MEM_STATIC void * ZSTD_cwksp_reserve_internal(ZSTD_cwksp *ws, size_t bytes, ZSTD_cwksp_alloc_phase_e phase)
Definition zstd_cwksp.h:331
MEM_STATIC BYTE * ZSTD_cwksp_reserve_buffer(ZSTD_cwksp *ws, size_t bytes)
Definition zstd_cwksp.h:362
MEM_STATIC void ZSTD_cwksp_clear(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:533
MEM_STATIC void * ZSTD_cwksp_reserve_object(ZSTD_cwksp *ws, size_t bytes)
Definition zstd_cwksp.h:424
MEM_STATIC void ZSTD_cwksp_init(ZSTD_cwksp *ws, void *start, size_t size, ZSTD_cwksp_static_alloc_e isStatic)
Definition zstd_cwksp.h:572
MEM_STATIC size_t ZSTD_cwksp_aligned_alloc_size(size_t size)
Definition zstd_cwksp.h:211
MEM_STATIC size_t ZSTD_cwksp_alloc_size(size_t size)
Definition zstd_cwksp.h:197
MEM_STATIC int ZSTD_cwksp_check_available(ZSTD_cwksp *ws, size_t additionalNeededSpace)
Definition zstd_cwksp.h:649
MEM_STATIC void * ZSTD_cwksp_reserve_table(ZSTD_cwksp *ws, size_t bytes)
Definition zstd_cwksp.h:383
#define ZSTD_CWKSP_ASAN_REDZONE_SIZE
Definition zstd_cwksp.h:35
MEM_STATIC void * ZSTD_cwksp_reserve_aligned(ZSTD_cwksp *ws, size_t bytes)
Definition zstd_cwksp.h:370
MEM_STATIC size_t ZSTD_cwksp_available_space(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:645
MEM_STATIC void * ZSTD_cwksp_reserve_aligned_init_once(ZSTD_cwksp *ws, size_t bytes)
Definition zstd_cwksp.h:402
@ ZSTD_cwksp_alloc_aligned_init_once
Definition zstd_cwksp.h:49
MEM_STATIC void * ZSTD_cwksp_initialAllocStart(ZSTD_cwksp *ws)
Definition zstd_cwksp.h:273