aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp8
-rw-r--r--src/script/common/c_converter.cpp8
-rw-r--r--src/serialization.cpp28
3 files changed, 10 insertions, 34 deletions
diff --git a/src/main.cpp b/src/main.cpp
index ca95ef874..5ea212d8a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -65,6 +65,14 @@ extern "C" {
#error Minetest cannot be built without exceptions or RTTI
#endif
+#if defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__clang__) && \
+ (__GNUC__ < 11 || (__GNUC__ == 11 && __GNUC_MINOR__ < 1))
+// see e.g. https://github.com/minetest/minetest/issues/10137
+#warning ==================================
+#warning 32-bit MinGW gcc before 11.1 has known issues with crashes on thread exit, you should upgrade.
+#warning ==================================
+#endif
+
#define DEBUGFILE "debug.txt"
#define DEFAULT_SERVER_PORT 30000
diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp
index 19734b913..7898b197d 100644
--- a/src/script/common/c_converter.cpp
+++ b/src/script/common/c_converter.cpp
@@ -479,17 +479,9 @@ size_t read_stringlist(lua_State *L, int index, std::vector<std::string> *result
Table field getters
*/
-#if defined(__MINGW32__) && !defined(__MINGW64__)
-/* MinGW 32-bit somehow crashes in the std::set destructor when this
- * variable is thread-local, so just don't do that. */
-static std::set<u64> warned_msgs;
-#endif
-
bool check_field_or_nil(lua_State *L, int index, int type, const char *fieldname)
{
-#if !defined(__MINGW32__) || defined(__MINGW64__)
thread_local std::set<u64> warned_msgs;
-#endif
int t = lua_type(L, index);
if (t == LUA_TNIL)
diff --git a/src/serialization.cpp b/src/serialization.cpp
index d4d7b5f6e..d3009bc83 100644
--- a/src/serialization.cpp
+++ b/src/serialization.cpp
@@ -208,30 +208,11 @@ 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
+ // it will be destroyed when the thread ends
thread_local std::unique_ptr<ZSTD_CStream, ZSTD_Deleter> stream(ZSTD_createCStream());
-#endif
ZSTD_initCStream(stream.get(), level);
@@ -276,14 +257,9 @@ 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
+ // it will be destroyed when the thread ends
thread_local std::unique_ptr<ZSTD_DStream, ZSTD_Deleter> stream(ZSTD_createDStream());
-#endif
ZSTD_initDStream(stream.get());