diff options
author | Sergey Vojtovich <svoj@mariadb.org> | 2019-03-18 19:18:54 +0400 |
---|---|---|
committer | Sergey Vojtovich <svoj@mariadb.org> | 2019-05-03 16:40:58 +0400 |
commit | a7adc2ce1680f00635b8241202066fd5542d286f (patch) | |
tree | 78888bd51d3a47ce3393a4b3aa6728832a7167cc /sql/session_tracker.h | |
parent | 47bd06d55ec211bc4d05d616a0833629504c7edf (diff) | |
download | mariadb-git-a7adc2ce1680f00635b8241202066fd5542d286f.tar.gz |
Allocate Transaction_state_tracker statically
One less new/delete per connection.
Part of MDEV-14984 - regression in connect performance
Diffstat (limited to 'sql/session_tracker.h')
-rw-r--r-- | sql/session_tracker.h | 139 |
1 files changed, 71 insertions, 68 deletions
diff --git a/sql/session_tracker.h b/sql/session_tracker.h index ec6d21bd344..faa34e88c74 100644 --- a/sql/session_tracker.h +++ b/sql/session_tracker.h @@ -154,65 +154,6 @@ public: }; -/** - Session_tracker - - This class holds an object each for all tracker classes and provides - methods necessary for systematic detection and generation of session - state change information. -*/ - -class Session_tracker -{ - State_tracker *m_trackers[SESSION_TRACKER_END]; - - /* The following two functions are private to disable copying. */ - Session_tracker(Session_tracker const &other) - { - DBUG_ASSERT(FALSE); - } - Session_tracker& operator= (Session_tracker const &rhs) - { - DBUG_ASSERT(FALSE); - return *this; - } - -public: - Current_schema_tracker current_schema; - Session_state_change_tracker state_change; - - Session_tracker(); - ~Session_tracker() { deinit(); } - - /* trick to make happy memory accounting system */ - void deinit() - { - delete m_trackers[SESSION_SYSVARS_TRACKER]; - m_trackers[SESSION_SYSVARS_TRACKER]= 0; - delete m_trackers[TRANSACTION_INFO_TRACKER]; - m_trackers[TRANSACTION_INFO_TRACKER]= 0; - } - - void enable(THD *thd); - - /** Returns the pointer to the tracker object for the specified tracker. */ - inline State_tracker *get_tracker(enum_session_tracker tracker) const - { - return m_trackers[tracker]; - } - - inline void mark_as_changed(THD *thd, enum enum_session_tracker tracker, - LEX_CSTRING *data) - { - if (m_trackers[tracker]->is_enabled()) - m_trackers[tracker]->mark_as_changed(thd, data); - } - - - void store(THD *thd, String *main_buf); -}; - - /* Transaction_state_tracker */ @@ -277,12 +218,17 @@ class Transaction_state_tracker : public State_tracker /** Helper function: turn table info into table access flag */ enum_tx_state calc_trx_state(THD *thd, thr_lock_type l, bool has_trx); public: - /** Constructor */ - Transaction_state_tracker(): tx_changed(TX_CHG_NONE), - tx_curr_state(TX_EMPTY), - tx_reported_state(TX_EMPTY), - tx_read_flags(TX_READ_INHERIT), - tx_isol_level(TX_ISOL_INHERIT) {} + + bool enable(THD *thd) + { + m_enabled= false; + tx_changed= TX_CHG_NONE; + tx_curr_state= TX_EMPTY; + tx_reported_state= TX_EMPTY; + tx_read_flags= TX_READ_INHERIT; + tx_isol_level= TX_ISOL_INHERIT; + return State_tracker::enable(thd); + } bool update(THD *thd, set_var *var); bool store(THD *thd, String *buf); @@ -332,12 +278,69 @@ private: #define TRANSACT_TRACKER(X) \ do { if (thd->variables.session_track_transaction_info > TX_TRACK_NONE) \ - {((Transaction_state_tracker *) \ - thd->session_tracker.get_tracker(TRANSACTION_INFO_TRACKER)) \ - ->X; } } while(0) + thd->session_tracker.transaction_info.X; } while(0) #define SESSION_TRACKER_CHANGED(A,B,C) \ thd->session_tracker.mark_as_changed(A,B,C) + +/** + Session_tracker + + This class holds an object each for all tracker classes and provides + methods necessary for systematic detection and generation of session + state change information. +*/ + +class Session_tracker +{ + State_tracker *m_trackers[SESSION_TRACKER_END]; + + /* The following two functions are private to disable copying. */ + Session_tracker(Session_tracker const &other) + { + DBUG_ASSERT(FALSE); + } + Session_tracker& operator= (Session_tracker const &rhs) + { + DBUG_ASSERT(FALSE); + return *this; + } + +public: + Current_schema_tracker current_schema; + Session_state_change_tracker state_change; + Transaction_state_tracker transaction_info; + + Session_tracker(); + ~Session_tracker() { deinit(); } + + /* trick to make happy memory accounting system */ + void deinit() + { + delete m_trackers[SESSION_SYSVARS_TRACKER]; + m_trackers[SESSION_SYSVARS_TRACKER]= 0; + } + + void enable(THD *thd); + + /** Returns the pointer to the tracker object for the specified tracker. */ + inline State_tracker *get_tracker(enum_session_tracker tracker) const + { + return m_trackers[tracker]; + } + + inline void mark_as_changed(THD *thd, enum enum_session_tracker tracker, + LEX_CSTRING *data) + { + if (m_trackers[tracker]->is_enabled()) + m_trackers[tracker]->mark_as_changed(thd, data); + } + + + void store(THD *thd, String *main_buf); +}; + + int session_tracker_init(); #else |