diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2021-03-15 12:34:17 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2021-03-15 12:34:17 -0400 |
commit | 146cb3889c3ccb3fce198fe7464a1296a9e107c3 (patch) | |
tree | 47c436adf7839e52a50f1535f7964ef3bbd4ee94 /src | |
parent | eeb60e45d82d5840b713a8741ae552238d57e8b9 (diff) | |
download | postgresql-146cb3889c3ccb3fce198fe7464a1296a9e107c3.tar.gz postgresql-146cb3889c3ccb3fce198fe7464a1296a9e107c3.zip |
Work around issues in MinGW-64's setjmp/longjmp support.
It's hard to avoid the conclusion that there is something wrong with
setjmp/longjmp on MinGW-64, as we have seen failures come and go after
entirely-unrelated-looking changes in our own code. Other projects
such as Ruby have given up and started using gcc's setjmp/longjmp
builtins on that platform; this patch just follows that lead.
Note that this is a pretty fundamental ABI break for functions
containining either setjmp or longjmp, so we can't really consider
a back-patch.
Per reports from Regina Obe and Heath Lord, as well as recent failures
on buildfarm member walleye, and less-recent failures on fairywren.
Juan José SantamarÃa Flecha
Discussion: https://postgr.es/m/000401d716a0$1ed0fc70$5c72f550$@pcorp.us
Discussion: https://postgr.es/m/CA+BEBhvHhM-Bn628pf-LsjqRh3Ang7qCSBG0Ga+7KwhGqrNUPw@mail.gmail.com
Discussion: https://postgr.es/m/f1caef93-9640-022e-9211-bbe8755a56b0@2ndQuadrant.com
Diffstat (limited to 'src')
-rw-r--r-- | src/include/c.h | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/include/c.h b/src/include/c.h index 2b45e6d6ca7..c8ede082739 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -1335,14 +1335,21 @@ extern unsigned long long strtoull(const char *str, char **endptr, int base); /* * When there is no sigsetjmp, its functionality is provided by plain - * setjmp. Incidentally, nothing provides setjmp's functionality in - * that case. We now support the case only on Windows. + * setjmp. We now support the case only on Windows. However, it seems + * that MinGW-64 has some longstanding issues in its setjmp support, + * so on that toolchain we cheat and use gcc's builtins. */ #ifdef WIN32 +#ifdef __MINGW64__ +typedef intptr_t sigjmp_buf[5]; +#define sigsetjmp(x,y) __builtin_setjmp(x) +#define siglongjmp __builtin_longjmp +#else /* !__MINGW64__ */ #define sigjmp_buf jmp_buf #define sigsetjmp(x,y) setjmp(x) #define siglongjmp longjmp -#endif +#endif /* __MINGW64__ */ +#endif /* WIN32 */ /* EXEC_BACKEND defines */ #ifdef EXEC_BACKEND |