From 484a4b518f6025f2cdec9eb89fdf3883eb57fc28 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sun, 30 Jan 2022 22:44:29 +0100 Subject: [PATCH] Add another very awful workaround to prevent a crash on Mingw32 This appears to be the same issue as 70df3d54f37c280f7afe60f6e964b8406577f39f. Hopefully the next MinGW update will remove the need for this. --- src/serialization.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/serialization.cpp b/src/serialization.cpp index b6ce3b37f..d4d7b5f6e 100644 --- a/src/serialization.cpp +++ b/src/serialization.cpp @@ -208,11 +208,31 @@ struct ZSTD_Deleter { } }; +#if defined(__MINGW32__) && !defined(__MINGW64__) +/* + * This is exactly as dumb as it looks. + * Yes, this is a memory leak. No, we don't have better solution right now. + */ +template class leaky_ptr +{ + T *value; +public: + leaky_ptr(T *value) : value(value) {}; + T *get() { return value; } +}; +#endif + void compressZstd(const u8 *data, size_t data_size, std::ostream &os, int level) { +#if defined(__MINGW32__) && !defined(__MINGW64__) + // leaks one context per thread but doesn't crash :shrug: + thread_local leaky_ptr stream(ZSTD_createCStream()); +#else // reusing the context is recommended for performance // it will destroyed when the thread ends thread_local std::unique_ptr stream(ZSTD_createCStream()); +#endif + ZSTD_initCStream(stream.get(), level); @@ -256,9 +276,14 @@ void compressZstd(const std::string &data, std::ostream &os, int level) void decompressZstd(std::istream &is, std::ostream &os) { +#if defined(__MINGW32__) && !defined(__MINGW64__) + // leaks one context per thread but doesn't crash :shrug: + thread_local leaky_ptr stream(ZSTD_createDStream()); +#else // reusing the context is recommended for performance // it will destroyed when the thread ends thread_local std::unique_ptr stream(ZSTD_createDStream()); +#endif ZSTD_initDStream(stream.get());