@@ -202,11 +202,12 @@ class ZSTDCodec : public Codec {
202202 DCHECK_EQ (output_buffer_len, 0 );
203203 output_buffer = &empty_buffer;
204204 }
205- if (!decompression_context_) {
206- decompression_context_ =
207- decltype (decompression_context_)(ZSTD_createDCtx (), ZSTDContextDeleter{});
208- }
209- size_t ret = ZSTD_decompressDCtx (decompression_context_.get (), output_buffer,
205+ // Decompression context for ZSTD contains several large heap allocations.
206+ // This method is additionally used in a free-threaded context so caching in a class
207+ // member is not possible.
208+ thread_local std::unique_ptr<ZSTD_DCtx, ZSTDContextDeleter> decompression_context{
209+ ZSTD_createDCtx (), ZSTDContextDeleter{}};
210+ size_t ret = ZSTD_decompressDCtx (decompression_context.get (), output_buffer,
210211 static_cast <size_t >(output_buffer_len), input,
211212 static_cast <size_t >(input_len));
212213 if (ZSTD_isError (ret)) {
@@ -226,18 +227,14 @@ class ZSTDCodec : public Codec {
226227
227228 Result<int64_t > Compress (int64_t input_len, const uint8_t * input,
228229 int64_t output_buffer_len, uint8_t * output_buffer) override {
229- if (!compression_context_) {
230- compression_context_ =
231- decltype (compression_context_)(ZSTD_createCCtx (), ZSTDContextDeleter{});
232- size_t ret = ZSTD_CCtx_setParameter (compression_context_.get (),
233- ZSTD_c_compressionLevel, compression_level_);
234- if (ZSTD_isError (ret)) {
235- return ZSTDError (ret, " Setting ZSTD compression level failed: " );
236- }
237- }
238- size_t ret = ZSTD_compress2 (compression_context_.get (), output_buffer,
239- static_cast <size_t >(output_buffer_len), input,
240- static_cast <size_t >(input_len));
230+ // Compression context for ZSTD contains several large heap allocations.
231+ // This method is additionally used in a free-threaded context so caching in a class
232+ // member is not possible.
233+ thread_local std::unique_ptr<ZSTD_CCtx, ZSTDContextDeleter> compression_context{
234+ ZSTD_createCCtx (), ZSTDContextDeleter{}};
235+ size_t ret = ZSTD_compressCCtx (compression_context.get (), output_buffer,
236+ static_cast <size_t >(output_buffer_len), input,
237+ static_cast <size_t >(input_len), compression_level_);
241238 if (ZSTD_isError (ret)) {
242239 return ZSTDError (ret, " ZSTD compression failed: " );
243240 }
@@ -265,8 +262,6 @@ class ZSTDCodec : public Codec {
265262
266263 private:
267264 const int compression_level_;
268- std::unique_ptr<ZSTD_DCtx, ZSTDContextDeleter> decompression_context_;
269- std::unique_ptr<ZSTD_CCtx, ZSTDContextDeleter> compression_context_;
270265};
271266
272267} // namespace
0 commit comments