diff options
author | sfan5 <sfan5@live.de> | 2022-01-30 22:44:29 +0100 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2022-01-30 22:57:44 +0100 |
commit | 484a4b518f6025f2cdec9eb89fdf3883eb57fc28 (patch) | |
tree | bafe1a32ce30f161f6eb74e7cdeb418c17d823e2 | |
parent | 5e4a01f2debd173058963f3c19dd954fcd039660 (diff) | |
download | minetest-484a4b518f6025f2cdec9eb89fdf3883eb57fc28.tar.gz minetest-484a4b518f6025f2cdec9eb89fdf3883eb57fc28.tar.bz2 minetest-484a4b518f6025f2cdec9eb89fdf3883eb57fc28.zip |
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.
-rw-r--r-- | src/serialization.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
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<typename T> 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<ZSTD_CStream> stream(ZSTD_createCStream()); +#else // reusing the context is recommended for performance // it will destroyed when the thread ends thread_local std::unique_ptr<ZSTD_CStream, ZSTD_Deleter> 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<ZSTD_DStream> stream(ZSTD_createDStream()); +#else // reusing the context is recommended for performance // it will destroyed when the thread ends thread_local std::unique_ptr<ZSTD_DStream, ZSTD_Deleter> stream(ZSTD_createDStream()); +#endif ZSTD_initDStream(stream.get()); |