From: Peter Rosin Date: Wed, 17 Mar 2010 07:54:16 +0000 (+0100) Subject: Use Get/SetThreadErrorMode if they are available. X-Git-Tag: v2.2.7b~15 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=3f0fa1bae41684e2ec5dba6d4f01c0d35fde7599;p=thirdparty%2Flibtool.git Use Get/SetThreadErrorMode if they are available. * libltdl/loaders/loadlibrary.c (wrap_geterrormode): Replaced... (wrap_getthreaderrormode): ...by this function that checks first for GetThreadErrorMode, then GetErrorMode and makes use of either of those or... (fallback_getthreaderrormode): ...else falls back to this replacement function that implements the old workaround, which was previously implemented in... (fallback_geterrormode): ...this now renamed function. (geterrormode): Replaced... (getthreaderrormode): ...by this function pointer that points at either of wrap_getthreaderrormode, GetThreadErrorMode, GetErrorMode or fallback_getthreaderrormode. (wrap_setthreaderrormode): New function that checks if SetThreadErrorMode is supported by the system and makes use of it if it is. (fallback_setthreaderrormode): New function that is used otherwise that implements the old version using SetErrorMode. (setthreaderrormode): New function pointer that points at either of wrap_setthreaderrormode, SetThreadErrorMode or fallback_setthreaderrormode. (vm_open): Adjust to the above. Signed-off-by: Peter Rosin --- diff --git a/ChangeLog b/ChangeLog index 0e5d92c00..3aed40009 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2010-03-17 Peter Rosin + + Use Get/SetThreadErrorMode if they are available. + * libltdl/loaders/loadlibrary.c (wrap_geterrormode): Replaced... + (wrap_getthreaderrormode): ...by this function that checks + first for GetThreadErrorMode, then GetErrorMode and makes use + of either of those or... + (fallback_getthreaderrormode): ...else falls back to this + replacement function that implements the old workaround, which + was previously implemented in... + (fallback_geterrormode): ...this now renamed function. + (geterrormode): Replaced... + (getthreaderrormode): ...by this function pointer that points + at either of wrap_getthreaderrormode, GetThreadErrorMode, + GetErrorMode or fallback_getthreaderrormode. + (wrap_setthreaderrormode): New function that checks if + SetThreadErrorMode is supported by the system and makes use of + it if it is. + (fallback_setthreaderrormode): New function that is used + otherwise that implements the old version using SetErrorMode. + (setthreaderrormode): New function pointer that points at + either of wrap_setthreaderrormode, SetThreadErrorMode or + fallback_setthreaderrormode. + (vm_open): Adjust to the above. + 2010-02-28 Ralf Wildenhues Detect Sun compiler suite with 'sun'-prefixed names. diff --git a/libltdl/loaders/loadlibrary.c b/libltdl/loaders/loadlibrary.c index 139851a1d..620e7cf42 100644 --- a/libltdl/loaders/loadlibrary.c +++ b/libltdl/loaders/loadlibrary.c @@ -104,12 +104,16 @@ get_vtable (lt_user_data loader_data) #define LOADLIB_SETERROR(errcode) LOADLIB__SETERROR (LT__STRERROR (errcode)) static const char *loadlibraryerror (const char *default_errmsg); -static UINT WINAPI wrap_geterrormode (void); -static UINT WINAPI fallback_geterrormode (void); +static DWORD WINAPI wrap_getthreaderrormode (void); +static DWORD WINAPI fallback_getthreaderrormode (void); +static BOOL WINAPI wrap_setthreaderrormode (DWORD mode, DWORD *oldmode); +static BOOL WINAPI fallback_setthreaderrormode (DWORD mode, DWORD *oldmode); -typedef UINT (WINAPI geterrormode_type) (void); +typedef DWORD (WINAPI getthreaderrormode_type) (void); +typedef BOOL (WINAPI setthreaderrormode_type) (DWORD, DWORD *); -static geterrormode_type *geterrormode = wrap_geterrormode; +static getthreaderrormode_type *getthreaderrormode = wrap_getthreaderrormode; +static setthreaderrormode_type *setthreaderrormode = wrap_setthreaderrormode; static char *error_message = 0; @@ -187,13 +191,13 @@ vm_open (lt_user_data LT__UNUSED loader_data, const char *filename, { /* Silence dialog from LoadLibrary on some failures. */ - UINT errormode = geterrormode (); - SetErrorMode (errormode | SEM_FAILCRITICALERRORS); + DWORD errormode = getthreaderrormode (); + setthreaderrormode (errormode | SEM_FAILCRITICALERRORS, NULL); module = LoadLibrary (wpath); /* Restore the error mode. */ - SetErrorMode (errormode); + setthreaderrormode (errormode, NULL); } /* libltdl expects this function to fail if it is unable @@ -298,28 +302,64 @@ loadlibraryerror (const char *default_errmsg) return len ? error_message : default_errmsg; } -/* A function called through the geterrormode variable which checks - if the system supports GetErrorMode and arranges for it or a - fallback implementation to be called directly in the future. The - selected version is then called. */ -static UINT WINAPI -wrap_geterrormode (void) +/* A function called through the getthreaderrormode variable which checks + if the system supports GetThreadErrorMode (or GetErrorMode) and arranges + for it or a fallback implementation to be called directly in the future. + The selected version is then called. */ +static DWORD WINAPI +wrap_getthreaderrormode (void) { HMODULE kernel32 = GetModuleHandleA ("kernel32.dll"); - geterrormode = (geterrormode_type *) GetProcAddress (kernel32, - "GetErrorMode"); - if (!geterrormode) - geterrormode = fallback_geterrormode; - return geterrormode (); + getthreaderrormode + = (getthreaderrormode_type *) GetProcAddress (kernel32, + "GetThreadErrorMode"); + if (!getthreaderrormode) + getthreaderrormode + = (getthreaderrormode_type *) GetProcAddress (kernel32, + "GetErrorMode"); + if (!getthreaderrormode) + getthreaderrormode = fallback_getthreaderrormode; + return getthreaderrormode (); } -/* A function called through the geterrormode variable for cases - where the system does not support GetErrorMode */ -static UINT WINAPI -fallback_geterrormode (void) +/* A function called through the getthreaderrormode variable for cases + where the system does not support GetThreadErrorMode or GetErrorMode */ +static DWORD WINAPI +fallback_getthreaderrormode (void) { /* Prior to Windows Vista, the only way to get the current error mode was to set a new one. In our case, we are setting a new - error mode right after "getting" it, so that's fairly ok. */ - return SetErrorMode (SEM_FAILCRITICALERRORS); + error mode right after "getting" it while ignoring the error + mode in effect when setting the new error mode, so that's + fairly ok. */ + return (DWORD) SetErrorMode (SEM_FAILCRITICALERRORS); +} + +/* A function called through the setthreaderrormode variable which checks + if the system supports SetThreadErrorMode and arranges for it or a + fallback implementation to be called directly in the future. + The selected version is then called. */ +static BOOL WINAPI +wrap_setthreaderrormode (DWORD mode, DWORD *oldmode) +{ + HMODULE kernel32 = GetModuleHandleA ("kernel32.dll"); + setthreaderrormode + = (setthreaderrormode_type *) GetProcAddress (kernel32, + "SetThreadErrorMode"); + if (!setthreaderrormode) + setthreaderrormode = fallback_setthreaderrormode; + return setthreaderrormode (mode, oldmode); +} + +/* A function called through the setthreaderrormode variable for cases + where the system does not support SetThreadErrorMode. */ +static BOOL WINAPI +fallback_setthreaderrormode (DWORD mode, DWORD *oldmode) +{ + /* Prior to Windows 7, there was no way to set the thread local error + mode, so set the process global error mode instead. */ + DWORD old = (DWORD) SetErrorMode (mode); + if (oldmode) + *oldmode = old; + return TRUE; }