From fda54706886c3372a95d3720bed5a5c5aaa79a22 Mon Sep 17 00:00:00 2001 From: Daniele Date: Thu, 12 Jan 2017 18:56:02 +0100 Subject: [PATCH] Replace the spinlock on ProxySQL_Admin::wrlock with a pthread mutex or wrlock --- include/proxy_defines.h | 4 ++++ include/proxysql_admin.h | 13 +++++++++++++ lib/ProxySQL_Admin.cpp | 22 ++++++++++++++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 include/proxy_defines.h diff --git a/include/proxy_defines.h b/include/proxy_defines.h new file mode 100644 index 000000000..20b0bfa1c --- /dev/null +++ b/include/proxy_defines.h @@ -0,0 +1,4 @@ + +// If defined then active pthread mutex in ProxySQL_Admin else use the wrlock +#define PA_PTHREAD_MUTEX + diff --git a/include/proxysql_admin.h b/include/proxysql_admin.h index 312384aad..654cb35e6 100644 --- a/include/proxysql_admin.h +++ b/include/proxysql_admin.h @@ -1,5 +1,7 @@ #ifndef __CLASS_PROXYSQL_ADMIN_H #define __CLASS_PROXYSQL_ADMIN_H + +#include "proxy_defines.h" #include "proxysql.h" #include "cpp.h" #include @@ -58,8 +60,19 @@ class ProxySQL_Admin { int main_poll_nfds; struct pollfd *main_poll_fds; int *main_callback_func; + + rwlock_t rwlock; + +#ifdef PA_PTHREAD_MUTEX + pthread_mutex_t mysql_servers_lock; +#else rwlock_t mysql_servers_rwlock; +#endif + + + + void wrlock(); void wrunlock(); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 820eff25a..48cee39c0 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -2450,8 +2450,18 @@ ProxySQL_Admin::ProxySQL_Admin() { } SPA=this; + + //Initialize locker spinlock_rwlock_init(&rwlock); + +#ifdef PA_PTHREAD_MUTEX + pthread_mutex_init(&mysql_servers_lock, NULL); +#else spinlock_rwlock_init(&mysql_servers_rwlock); +#endif + + + variables.admin_credentials=strdup("admin:admin"); variables.stats_credentials=strdup("stats:stats"); if (GloVars.__cmd_proxysql_admin_socket) { @@ -2493,11 +2503,19 @@ void ProxySQL_Admin::wrunlock() { }; void ProxySQL_Admin::mysql_servers_wrlock() { - spin_wrlock(&mysql_servers_rwlock); + #ifdef PA_PTHREAD_MUTEX + pthread_mutex_lock(&mysql_servers_lock); + #else + spin_wrlock(&mysql_servers_rwlock); + #endif }; void ProxySQL_Admin::mysql_servers_wrunlock() { - spin_wrunlock(&mysql_servers_rwlock); + #ifdef PA_PTHREAD_MUTEX + pthread_mutex_unlock(&mysql_servers_lock); + #else + spin_wrunlock(&mysql_servers_rwlock); + #endif }; void ProxySQL_Admin::print_version() {