21 #include "my_global.h"
46 static bool user_hash_inited=
false;
60 user_instr_class_waits_array= NULL;
61 user_instr_class_stages_array= NULL;
62 user_instr_class_statements_array= NULL;
63 uint waits_sizing= user_max * wait_class_max;
71 if (unlikely(user_array == NULL))
77 user_instr_class_waits_array=
79 if (unlikely(user_instr_class_waits_array == NULL))
83 if (stages_sizing > 0)
85 user_instr_class_stages_array=
87 if (unlikely(user_instr_class_stages_array == NULL))
91 if (statements_sizing > 0)
93 user_instr_class_statements_array=
95 if (unlikely(user_instr_class_statements_array == NULL))
99 for (index= 0; index < user_max; index++)
102 &user_instr_class_waits_array[index * wait_class_max];
117 pfs_free(user_instr_class_waits_array);
118 user_instr_class_waits_array= NULL;
119 pfs_free(user_instr_class_stages_array);
120 user_instr_class_stages_array= NULL;
121 pfs_free(user_instr_class_statements_array);
122 user_instr_class_statements_array= NULL;
127 static uchar *user_hash_get_key(
const uchar *
entry,
size_t *length,
130 const PFS_user *
const *typed_entry;
133 typed_entry=
reinterpret_cast<const PFS_user*
const *
> (
entry);
134 DBUG_ASSERT(typed_entry != NULL);
136 DBUG_ASSERT(user != NULL);
137 *length= user->m_key.m_key_length;
139 return const_cast<uchar*
> (
reinterpret_cast<const uchar*
> (result));
149 if ((! user_hash_inited) && (user_max > 0))
151 lf_hash_init(&user_hash,
sizeof(
PFS_user*), LF_HASH_UNIQUE,
152 0, 0, user_hash_get_key, &my_charset_bin);
153 user_hash.size= user_max;
154 user_hash_inited=
true;
162 if (user_hash_inited)
164 lf_hash_destroy(&user_hash);
165 user_hash_inited=
false;
173 if (! user_hash_inited)
181 const char *user, uint user_length)
183 DBUG_ASSERT(user_length <= USERNAME_LENGTH);
188 memcpy(ptr, user, user_length);
198 const char *username, uint username_length)
206 LF_PINS *pins= get_user_hash_pins(thread);
207 if (unlikely(pins == NULL))
214 set_user_key(&key, username, username_length);
218 const uint retry_max= 3;
222 (lf_hash_search(&user_hash, pins,
224 if (entry && (entry != MY_ERRPTR))
229 lf_hash_search_unpin(pins);
233 lf_hash_search_unpin(pins);
238 for (scan.
init(random, user_max);
244 for ( ; pfs < pfs_last; pfs++)
251 if (username_length > 0)
254 pfs->m_username= NULL;
255 pfs->m_username_length= username_length;
257 pfs->init_refcount();
259 pfs->m_disconnected_count= 0;
262 res= lf_hash_insert(&user_hash, pins, &pfs);
263 if (likely(res == 0))
273 if (++retry_count > retry_max)
292 void PFS_user::aggregate()
296 aggregate_statements();
300 void PFS_user::aggregate_waits()
306 void PFS_user::aggregate_stages()
312 void PFS_user::aggregate_statements()
318 void PFS_user::aggregate_stats()
321 m_disconnected_count= 0;
324 void PFS_user::release()
331 if ((&user_array[0] <= unsafe) &&
332 (unsafe < &user_array[user_max]))
339 LF_PINS *pins= get_user_hash_pins(thread);
340 if (unlikely(pins == NULL))
345 (lf_hash_search(&user_hash, pins,
346 user->m_key.
m_hash_key, user->m_key.m_key_length));
347 if (entry && (entry != MY_ERRPTR))
351 DBUG_ASSERT(pfs == user);
352 if (user->get_refcount() == 0)
354 lf_hash_delete(&user_hash, pins,
355 user->m_key.
m_hash_key, user->m_key.m_key_length);
360 lf_hash_search_unpin(pins);
366 PFS_thread *thread= PFS_thread::get_current_thread();
367 if (unlikely(thread == NULL))
371 PFS_user *pfs_last= user_array + user_max;
373 for ( ; pfs < pfs_last; pfs++)
378 if (pfs->get_refcount() == 0)
379 purge_user(thread, pfs);