From 094cd085139d3e8703cdb228045d18f7c6e4d1bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jaramago=20Fern=C3=A1ndez?= Date: Sun, 31 May 2020 17:21:24 +0200 Subject: [PATCH] Fix crashes related to accesses to worker threads during initialization / shutdown stages --- include/MySQL_Thread.h | 1 + lib/MySQL_Thread.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 1 + 3 files changed, 45 insertions(+) diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index f5d38b8b7..d1ff676c2 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -394,6 +394,7 @@ class MySQL_Threads_Handler } variables; struct { unsigned int mirror_sessions_current; + int threads_initialized = 0; } status_variables; unsigned int num_threads; proxysql_mysql_thread_t *mysql_threads; diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 8ce1f5343..2bf0371d8 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -5625,6 +5625,7 @@ __exit_kill_session: } unsigned long long MySQL_Threads_Handler::get_total_mirror_queue() { + if ((__sync_fetch_and_add(&status_variables.threads_initialized, 0) == 0) || this->shutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;ishutdown_) return 0; unsigned long long q=0; unsigned int i; for (i=0;istatus_variables.threads_initialized, 1); { cpu_timer t;