summaryrefslogtreecommitdiff
path: root/sql/session_tracker.h
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2019-03-18 19:18:54 +0400
committerSergey Vojtovich <svoj@mariadb.org>2019-05-03 16:40:58 +0400
commita7adc2ce1680f00635b8241202066fd5542d286f (patch)
tree78888bd51d3a47ce3393a4b3aa6728832a7167cc /sql/session_tracker.h
parent47bd06d55ec211bc4d05d616a0833629504c7edf (diff)
downloadmariadb-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.h139
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