mysql5/mysql-5.7.27/sql/sys_vars_resource_mgr.h

106 lines
3.6 KiB
C++

#ifndef SYS_VARS_RESOURCE_MGR_INCLUDED
#define SYS_VARS_RESOURCE_MGR_INCLUDED
#include <hash.h>
/* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
/**
Session_sysvar_resource_manager
-------------------------------
When a session (THD) gets initialized, it receives a shallow copy of all
global system variables.
thd->variables= global_system_variables; (see plugin_thdvar_init())
In case of Sys_var_charptr variables, we need to maintain a separate copy for
each session though so that global and session variables can be altered
independently.
This class is responsible for alloc|dealloc-ating memory for Sys_var_charptr
variables for every session. It works in three steps :
(1) init :
Creates a copy (memdup()) of global Sys_var_charptr system variable for
the respective session variable (passed as a parameter) & inserts it
into sysvar_string_alloc_hash (containing the alloced address) to infer
that memory has been allocated for the session. init() is called during
the initialization of session system variables. (plugin_thdvar_init())
(2) update :
When the session variable is updated, the old memory is freed and new
memory is allocated to hold the new value. The corresponding member in
sysvar_string_alloc_hash is also updated to hold the new alloced memory
address. (Sys_var_charptr::session_update())
(3) deinit :
Its a one-shot operation to free all the session Sys_var_charptr system
variables. It basically traverses down the sysvar_string_alloc_hash
hash and calls free() for all the addresses that it holds.
Note, there should always be at most one node per Sys_var_charptr session
system variable.
*/
class Session_sysvar_resource_manager {
private:
struct sys_var_ptr
{
void *data;
};
/**
It maintains a member per Sys_var_charptr session variable to hold the
address of non-freed memory, alloced to store the session variable's value.
*/
HASH m_sysvar_string_alloc_hash;
/**
Returns the member that contains the given key (address).
*/
uchar *find(void *key, size_t length);
public:
Session_sysvar_resource_manager()
{
(void) memset(&m_sysvar_string_alloc_hash, 0, sizeof(m_sysvar_string_alloc_hash));
}
/**
Allocates memory for Sys_var_charptr session variable during session
initialization.
*/
bool init(char **var, const CHARSET_INFO *charset);
/**
Frees the old alloced memory, memdup()'s the given val to a new memory
address & updated the session variable pointer.
*/
bool update(char **var, char *val, size_t val_len);
static uchar *sysvars_mgr_get_key(const char *entry, size_t *length,
my_bool not_used MY_ATTRIBUTE((unused)));
void claim_memory_ownership();
/**
Frees the memory allocated for Sys_var_charptr session variables.
*/
void deinit();
};
#endif /* SYS_VARS_RESOURCE_MGR_INCLUDED */