2674 Vladislav Vaintroub 2008-09-01
This patch fixes
Bug#37226 Explicit call of my_thread_init() on Windows for every new thread.
Bug#33031 app linked to libmysql.lib crash if run as service in vista under
There are some problems using DllMain hook functions on Windows that
automatically do global and per-thread initialization for libmysqld.dll
MySQL internally counts number of active threads that and causes a delay in in
my_end() if not all threads are exited. But,there are threads that can be
started either by Windows internally (often in TCP/IP scenarios) or by user
himself - those threads are not necessarily using libmysql.dll functionality,
but nonetheless the contribute to the count of open threads.
my_init() calls WSAStartup that itself loads DLLs and can lead to a deadlock in
Fix is to remove dll initialization code from libmysql.dll in general case. I
still leave an environment variable LIBMYSQL_DLLINIT, which if set to any value
will cause the old behavior (DLL init hooks will be called). This env.variable
exists only to prevent breakage of existing Windows-only applications that
don't do mysql_thread_init() and work ok today. Use of LIBMYSQL_DLLINIT is
discouraged and it will be removed in 6.0
=== modified file 'libmysql/dll.c'
--- a/libmysql/dll.c 2004-08-18 17:57:55 +0000
+++ b/libmysql/dll.c 2008-09-01 16:22:51 +0000
@@ -89,9 +89,20 @@ BOOL APIENTRY LibMain(HANDLE hInst,DWORD
} /* LibMain */
+static BOOL do_libmain;
int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved)
- return LibMain(hInst,ul_reason_being_called,lpReserved);
+ Unless environment variable LIBMYSQL_DLLINIT is set, do nothing.
+ The environment variable is checked once, during the first call to DllMain()
+ (in DLL_PROCESS_ATTACH hook).
+ if (ul_reason_being_called == DLL_PROCESS_ATTACH)
+ do_libmain = (getenv("LIBMYSQL_DLLINIT") != NULL);
+ if (do_libmain)
+ return LibMain(hInst,ul_reason_being_called,lpReserved);
+ return TRUE;
|• bzr commit into mysql-5.0 branch (vvaintroub:2674) Bug#33031 Bug#37226||Vladislav Vaintroub||1 Sep|