From 1befa76448266208ee853f3e5b3a34a12807eaf4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 3 Feb 2012 12:15:56 +0000 Subject: [PATCH] Fix Savannah bug #34832 with unused TLS attributes. w32/subproc/w32err.c (map_windows32_error_to_string) [_MSC_VER]: Don't use TLS storage for szMessageBuffer. Ifdef away special code for handling Winsock error codes. Make the function return a `const char *'. Suggested by Ozkan Sezer. Fixes Savannah bug #34832. --- ChangeLog | 7 +++++++ w32/include/w32err.h | 2 +- w32/subproc/w32err.c | 30 +++++++++++++++++++++++------- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index f046a0f..53c1d0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-02-03 Eli Zaretskii + + * w32/subproc/w32err.c (map_windows32_error_to_string) [_MSC_VER]: + Don't use TLS storage for szMessageBuffer. Ifdef away special + code for handling Winsock error codes. Make the function return a + `const char *'. Suggested by Ozkan Sezer. Fixes Savannah bug #34832. + 2012-01-29 Paul Smith * gmk-default.scm (to-string-maybe): Variables map to empty strings. diff --git a/w32/include/w32err.h b/w32/include/w32err.h index ebf8c81..9131f04 100644 --- a/w32/include/w32err.h +++ b/w32/include/w32err.h @@ -22,6 +22,6 @@ this program. If not, see . */ #define EXTERN_DECL(entry, args) entry args #endif -EXTERN_DECL(char * map_windows32_error_to_string, (DWORD error)); +EXTERN_DECL(const char * map_windows32_error_to_string, (DWORD error)); #endif /* !_W32ERR_H */ diff --git a/w32/subproc/w32err.c b/w32/subproc/w32err.c index e0bb110..7f68f59 100644 --- a/w32/subproc/w32err.c +++ b/w32/subproc/w32err.c @@ -15,7 +15,9 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include #include +#include "make.h" #include "w32err.h" /* @@ -26,14 +28,24 @@ this program. If not, see . */ * Notes/Dependencies: I got this from * comp.os.ms-windows.programmer.win32 */ -char * +const char * map_windows32_error_to_string (DWORD ercode) { -/* __declspec (thread) necessary if you will use multiple threads on MSVC */ -#ifdef _MSC_VER -__declspec (thread) static char szMessageBuffer[128]; -#else -static char szMessageBuffer[128]; -#endif +/* + * We used to have an MSVC-specific `__declspec (thread)' qualifier + * here, with the following comment: + * + * __declspec (thread) necessary if you will use multiple threads on MSVC + * + * However, Make was never multithreaded on Windows (except when + * Ctrl-C is hit, in which case the main thread is stopped + * immediately, so it doesn't matter in this context). The functions + * on sub_proc.c that started and stopped additional threads were + * never used, and are now #ifdef'ed away. Until we need more than + * one thread, we have no problems with the following buffer being + * static. (If and when we do need it to be in thread-local storage, + * the corresponding GCC qualifier is `__thread'.) + */ + static char szMessageBuffer[128]; /* Fill message buffer with a default message in * case FormatMessage fails */ @@ -43,6 +55,7 @@ static char szMessageBuffer[128]; * Special code for winsock error handling. */ if (ercode > WSABASEERR) { +#if 0 HMODULE hModule = GetModuleHandle("wsock32"); if (hModule != NULL) { FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, @@ -54,6 +67,9 @@ static char szMessageBuffer[128]; NULL); FreeLibrary(hModule); } +#else + fatal(NILF, szMessageBuffer); +#endif } else { /* * Default system message handling -- 2.7.4