summaryrefslogtreecommitdiff
path: root/dbug
diff options
context:
space:
mode:
authorVladislav Vaintroub <vvaintroub@mysql.com>2008-12-04 19:41:53 +0100
committerVladislav Vaintroub <vvaintroub@mysql.com>2008-12-04 19:41:53 +0100
commit8f500c522b5b38b55204031a90977c2c087ffd5c (patch)
treed7a8c4dab0b8f84158841d43c0809b985e9f07a9 /dbug
parent014143e8588c4313ccf10e269aa34a997f5772b6 (diff)
downloadmariadb-git-8f500c522b5b38b55204031a90977c2c087ffd5c.tar.gz
Bug#38522: 5 seconds delay when closing application using embedded server
The problem here is that embedded server starts handle_thread manager thread on mysql_library_init() does not stop it on mysql_library_end(). At shutdown, my_thread_global_end() waits for thread count to become 0, but since we did not stop the thread it will give up after 5 seconds. Solution is to move shutdown for handle_manager thread from kill_server() (mysqld specific) to clean_up() that is used by both embedded and mysqld. This patch also contains some refactorings - to avoid duplicate code, start_handle_manager() and stop_handle_manager() functions are introduced. Unused variables are eliminated. handle_manager does not rely on global variable abort_loop anymore to stop (abort_loop is not set for embedded). Note: Specifically on Windows and when using DBUG version of libmysqld, the complete solution requires removing obsolete code my_thread_init() from my_thread_var(). This has a side effect that a DBUG statement after my_thread_end() can cause thread counter to be incremented, and embedded will hang for some seconds. Or worse, my_thread_init() will crash if critical sections have been deleted by the global cleanup routine that runs in a different thread. This patch also fixes and revert prior changes for Bug#38293 "Libmysqld crash in mysql_library_init if language file missing". Root cause of the crash observed in Bug#38293 was bug in my_thread_init() described above client/mysql.cc: sql_protocol_typelib is not exported from libmysqld (does not make sense either) thus excluded from embedded client dbug/dbug.c: revert changes for Bug#38293 include/my_dbug.h: revert changes for Bug#38293 libmysql/libmysql.c: Removed DBUG_POP call, because when called after my_end(), will access THR_key_mysys that is already deleted. The result of pthread_get_specific is not predictable in this case and hence DBUG_POP can crash. libmysqld/examples/CMakeLists.txt: Revert changes for Bug#38293. libmysqld/lib_sql.cc: code to start handle manager is factored out into start_handle_manager() function libmysqld/libmysqld.def: Revert changes for Bug #38293 Remove excessive exports from libmysqld, export what API documents. mysys/my_thr_init.c: Remove windows-DLL-specific workaround for something (old code, no documentation for what specifically). The problem is that even after my_thread_end() is finished, DBUG statement can initiate my_thread_init(). This does not happen anywhere else and should not happen on Windows either. sql/mysql_priv.h: - new functions start_handle_manager() and stop_handle_manager() - move manager_thread_in_use variable to sql_manager.cc and made it static - remove manager_status, as it is unused sql/mysqld.cc: Code to start/stop handle_manager thread is factored out into start_handle_manager()
Diffstat (limited to 'dbug')
-rw-r--r--dbug/dbug.c17
1 files changed, 1 insertions, 16 deletions
diff --git a/dbug/dbug.c b/dbug/dbug.c
index bbd1abb9598..baf080f5e27 100644
--- a/dbug/dbug.c
+++ b/dbug/dbug.c
@@ -1851,13 +1851,7 @@ static void DBUGOpenFile(CODE_STATE *cs,
else
{
newfile= !EXISTS(name);
- if (!(fp= fopen(name,
-#if defined(MSDOS) || defined(__WIN__)
- append ? "a+c" : "wc"
-#else
- append ? "a+" : "w"
-#endif
- )))
+ if (!(fp= fopen(name, append ? "a+" : "w")))
{
(void) fprintf(stderr, ERR_OPEN, cs->process, name);
perror("");
@@ -2407,13 +2401,4 @@ int i_am_a_dummy_function() {
return 0;
}
-#ifdef __WIN__
-char _db_doprnt_;
-char _db_enter_;
-char _db_pargs_;
-char _db_process_;
-char _db_push_;
-char _db_return_;
-#endif /*__WIN__*/
-
#endif