summaryrefslogtreecommitdiff
path: root/sql/my_apc.h
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2015-05-20 12:04:32 +0400
committerSergey Vojtovich <svoj@mariadb.org>2015-06-23 09:54:36 +0400
commit84568c296520f399da23f260151a7512393eb03b (patch)
tree7af56defe9644a430c38c83fb962f4180fd08424 /sql/my_apc.h
parent0357791e3c291c47fe128954dac45c271f721b2a (diff)
downloadmariadb-git-84568c296520f399da23f260151a7512393eb03b.tar.gz
MDEV-8030 - Apc_target::disable() locks mutex twice
Moved Apc_target::destroy(), Apc_target::enable() and Apc_targe::disable() definitions to my_apc.h so that they can be inlined. Apc_targe::disable() now calls Apc_target::process_apc_requests() only if there're APC requests. This saves one pthread_mutex_lock() call. Overhead change: Apc_target::disable 0.04% -> out of radar Apc_target::enable 0.03% -> out of radar Apc_target::process_apc_requests 0.02% -> out of radar pthread_mutex_lock 0.43% -> 0.42% pthread_mutex_unlock 0.26% -> 0.25%
Diffstat (limited to 'sql/my_apc.h')
-rw-r--r--sql/my_apc.h27
1 files changed, 23 insertions, 4 deletions
diff --git a/sql/my_apc.h b/sql/my_apc.h
index dfeef5eb8ac..20b1ee4c4ec 100644
--- a/sql/my_apc.h
+++ b/sql/my_apc.h
@@ -50,10 +50,29 @@ public:
~Apc_target() { DBUG_ASSERT(!enabled && !apc_calls);}
void init(mysql_mutex_t *target_mutex);
- void destroy();
- void enable();
- void disable();
-
+
+ /* Destroy the target. The target must be disabled when this call is made. */
+ void destroy() { DBUG_ASSERT(!enabled); }
+
+ /* Enter ther state where the target is available for serving APC requests */
+ void enable() { enabled++; }
+
+ /*
+ Make the target unavailable for serving APC requests.
+
+ @note
+ This call will serve all requests that were already enqueued
+ */
+ void disable()
+ {
+ DBUG_ASSERT(enabled);
+ mysql_mutex_lock(LOCK_thd_data_ptr);
+ bool process= !--enabled && have_apc_requests();
+ mysql_mutex_unlock(LOCK_thd_data_ptr);
+ if (unlikely(process))
+ process_apc_requests();
+ }
+
void process_apc_requests();
/*
A lightweight function, intended to be used in frequent checks like this: