From 72e7f011b29998d8a3e15eb5b381ef962af5fe5b Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 5 Apr 2019 10:30:58 +0300 Subject: Upgrade to 8.0.15 --- mysql/mysql/client_authentication.h | 28 - mysql/mysql/client_plugin.h | 202 -- mysql/mysql/com_data.h | 125 - mysql/mysql/get_password.h | 36 - mysql/mysql/mysql_lex_string.h | 33 - mysql/mysql/plugin.h | 744 ------ mysql/mysql/plugin_auth_common.h | 143 -- mysql/mysql/plugin_trace.h | 349 --- mysql/mysql/psi/mysql_file.h | 1433 ----------- mysql/mysql/psi/mysql_memory.h | 62 - mysql/mysql/psi/mysql_socket.h | 1255 ---------- mysql/mysql/psi/mysql_stage.h | 198 -- mysql/mysql/psi/mysql_table.h | 142 -- mysql/mysql/psi/mysql_thread.h | 1323 ---------- mysql/mysql/psi/psi.h | 2980 ----------------------- mysql/mysql/psi/psi_base.h | 155 -- mysql/mysql/psi/psi_memory.h | 155 -- mysql/mysql/service_command.h | 436 ---- mysql/mysql/service_locking.h | 114 - mysql/mysql/service_my_plugin_log.h | 64 - mysql/mysql/service_my_snprintf.h | 101 - mysql/mysql/service_mysql_alloc.h | 81 - mysql/mysql/service_mysql_keyring.h | 62 - mysql/mysql/service_mysql_password_policy.h | 66 - mysql/mysql/service_mysql_string.h | 133 - mysql/mysql/service_parser.h | 286 --- mysql/mysql/service_rpl_transaction_ctx.h | 81 - mysql/mysql/service_rpl_transaction_write_set.h | 80 - mysql/mysql/service_rules_table.h | 192 -- mysql/mysql/service_security_context.h | 95 - mysql/mysql/service_srv_session.h | 173 -- mysql/mysql/service_srv_session_info.h | 174 -- mysql/mysql/service_thd_alloc.h | 132 - mysql/mysql/service_thd_wait.h | 114 - mysql/mysql/service_thread_scheduler.h | 85 - mysql/mysql/services.h | 59 - 36 files changed, 11891 deletions(-) delete mode 100644 mysql/mysql/client_authentication.h delete mode 100644 mysql/mysql/client_plugin.h delete mode 100644 mysql/mysql/com_data.h delete mode 100644 mysql/mysql/get_password.h delete mode 100644 mysql/mysql/mysql_lex_string.h delete mode 100644 mysql/mysql/plugin.h delete mode 100644 mysql/mysql/plugin_auth_common.h delete mode 100644 mysql/mysql/plugin_trace.h delete mode 100644 mysql/mysql/psi/mysql_file.h delete mode 100644 mysql/mysql/psi/mysql_memory.h delete mode 100644 mysql/mysql/psi/mysql_socket.h delete mode 100644 mysql/mysql/psi/mysql_stage.h delete mode 100644 mysql/mysql/psi/mysql_table.h delete mode 100644 mysql/mysql/psi/mysql_thread.h delete mode 100644 mysql/mysql/psi/psi.h delete mode 100644 mysql/mysql/psi/psi_base.h delete mode 100644 mysql/mysql/psi/psi_memory.h delete mode 100644 mysql/mysql/service_command.h delete mode 100644 mysql/mysql/service_locking.h delete mode 100644 mysql/mysql/service_my_plugin_log.h delete mode 100644 mysql/mysql/service_my_snprintf.h delete mode 100644 mysql/mysql/service_mysql_alloc.h delete mode 100644 mysql/mysql/service_mysql_keyring.h delete mode 100644 mysql/mysql/service_mysql_password_policy.h delete mode 100644 mysql/mysql/service_mysql_string.h delete mode 100644 mysql/mysql/service_parser.h delete mode 100644 mysql/mysql/service_rpl_transaction_ctx.h delete mode 100644 mysql/mysql/service_rpl_transaction_write_set.h delete mode 100644 mysql/mysql/service_rules_table.h delete mode 100644 mysql/mysql/service_security_context.h delete mode 100644 mysql/mysql/service_srv_session.h delete mode 100644 mysql/mysql/service_srv_session_info.h delete mode 100644 mysql/mysql/service_thd_alloc.h delete mode 100644 mysql/mysql/service_thd_wait.h delete mode 100644 mysql/mysql/service_thread_scheduler.h delete mode 100644 mysql/mysql/services.h (limited to 'mysql/mysql') diff --git a/mysql/mysql/client_authentication.h b/mysql/mysql/client_authentication.h deleted file mode 100644 index 8943579..0000000 --- a/mysql/mysql/client_authentication.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2012, 2014, 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 */ -#ifndef CLIENT_AUTHENTICATION_H -#define CLIENT_AUTHENTICATION_H -#include -#include "mysql.h" -#include "mysql/client_plugin.h" - -C_MODE_START -int sha256_password_auth_client(MYSQL_PLUGIN_VIO *vio, MYSQL *mysql); -int sha256_password_init(char *, size_t, int, va_list); -int sha256_password_deinit(void); -C_MODE_END - -#endif - diff --git a/mysql/mysql/client_plugin.h b/mysql/mysql/client_plugin.h deleted file mode 100644 index d6471db..0000000 --- a/mysql/mysql/client_plugin.h +++ /dev/null @@ -1,202 +0,0 @@ -#ifndef MYSQL_CLIENT_PLUGIN_INCLUDED -/* Copyright (c) 2010, 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 */ - -/** - @file - - MySQL Client Plugin API - - This file defines the API for plugins that work on the client side -*/ -#define MYSQL_CLIENT_PLUGIN_INCLUDED - -#ifndef MYSQL_ABI_CHECK -#include -#include -#endif - -/* - On Windows, exports from DLL need to be declared. - Also, plugin needs to be declared as extern "C" because MSVC - unlike other compilers, uses C++ mangling for variables not only - for functions. -*/ - -#undef MYSQL_PLUGIN_EXPORT - -#if defined(_MSC_VER) -#if defined(MYSQL_DYNAMIC_PLUGIN) - #ifdef __cplusplus - #define MYSQL_PLUGIN_EXPORT extern "C" __declspec(dllexport) - #else - #define MYSQL_PLUGIN_EXPORT __declspec(dllexport) - #endif -#else /* MYSQL_DYNAMIC_PLUGIN */ - #ifdef __cplusplus - #define MYSQL_PLUGIN_EXPORT extern "C" - #else - #define MYSQL_PLUGIN_EXPORT - #endif -#endif /*MYSQL_DYNAMIC_PLUGIN */ -#else /*_MSC_VER */ -#define MYSQL_PLUGIN_EXPORT -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -/* known plugin types */ -#define MYSQL_CLIENT_reserved1 0 -#define MYSQL_CLIENT_reserved2 1 -#define MYSQL_CLIENT_AUTHENTICATION_PLUGIN 2 -#define MYSQL_CLIENT_TRACE_PLUGIN 3 - -#define MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION 0x0100 -#define MYSQL_CLIENT_TRACE_PLUGIN_INTERFACE_VERSION 0x0100 - -#define MYSQL_CLIENT_MAX_PLUGINS 4 - -#define mysql_declare_client_plugin(X) \ - MYSQL_PLUGIN_EXPORT struct st_mysql_client_plugin_ ## X \ - _mysql_client_plugin_declaration_ = { \ - MYSQL_CLIENT_ ## X ## _PLUGIN, \ - MYSQL_CLIENT_ ## X ## _PLUGIN_INTERFACE_VERSION, -#define mysql_end_client_plugin } - -/* generic plugin header structure */ -#define MYSQL_CLIENT_PLUGIN_HEADER \ - int type; \ - unsigned int interface_version; \ - const char *name; \ - const char *author; \ - const char *desc; \ - unsigned int version[3]; \ - const char *license; \ - void *mysql_api; \ - int (*init)(char *, size_t, int, va_list); \ - int (*deinit)(void); \ - int (*options)(const char *option, const void *); - -struct st_mysql_client_plugin -{ - MYSQL_CLIENT_PLUGIN_HEADER -}; - -struct st_mysql; - -/******** authentication plugin specific declarations *********/ -#include "plugin_auth_common.h" - -struct st_mysql_client_plugin_AUTHENTICATION -{ - MYSQL_CLIENT_PLUGIN_HEADER - int (*authenticate_user)(MYSQL_PLUGIN_VIO *vio, struct st_mysql *mysql); -}; - -/******** using plugins ************/ - -/** - loads a plugin and initializes it - - @param mysql MYSQL structure. - @param name a name of the plugin to load - @param type type of plugin that should be loaded, -1 to disable type check - @param argc number of arguments to pass to the plugin initialization - function - @param ... arguments for the plugin initialization function - - @retval - a pointer to the loaded plugin, or NULL in case of a failure -*/ -struct st_mysql_client_plugin * -mysql_load_plugin(struct st_mysql *mysql, const char *name, int type, - int argc, ...); - -/** - loads a plugin and initializes it, taking va_list as an argument - - This is the same as mysql_load_plugin, but take va_list instead of - a list of arguments. - - @param mysql MYSQL structure. - @param name a name of the plugin to load - @param type type of plugin that should be loaded, -1 to disable type check - @param argc number of arguments to pass to the plugin initialization - function - @param args arguments for the plugin initialization function - - @retval - a pointer to the loaded plugin, or NULL in case of a failure -*/ -struct st_mysql_client_plugin * -mysql_load_plugin_v(struct st_mysql *mysql, const char *name, int type, - int argc, va_list args); - -/** - finds an already loaded plugin by name, or loads it, if necessary - - @param mysql MYSQL structure. - @param name a name of the plugin to load - @param type type of plugin that should be loaded - - @retval - a pointer to the plugin, or NULL in case of a failure -*/ -struct st_mysql_client_plugin * -mysql_client_find_plugin(struct st_mysql *mysql, const char *name, int type); - -/** - adds a plugin structure to the list of loaded plugins - - This is useful if an application has the necessary functionality - (for example, a special load data handler) statically linked into - the application binary. It can use this function to register the plugin - directly, avoiding the need to factor it out into a shared object. - - @param mysql MYSQL structure. It is only used for error reporting - @param plugin an st_mysql_client_plugin structure to register - - @retval - a pointer to the plugin, or NULL in case of a failure -*/ -struct st_mysql_client_plugin * -mysql_client_register_plugin(struct st_mysql *mysql, - struct st_mysql_client_plugin *plugin); - -/** - set plugin options - - Can be used to set extra options and affect behavior for a plugin. - This function may be called multiple times to set several options - - @param plugin an st_mysql_client_plugin structure - @param option a string which specifies the option to set - @param value value for the option. - - @retval 0 on success, 1 in case of failure -**/ -int mysql_plugin_options(struct st_mysql_client_plugin *plugin, - const char *option, const void *value); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/mysql/mysql/com_data.h b/mysql/mysql/com_data.h deleted file mode 100644 index 2fe9cf2..0000000 --- a/mysql/mysql/com_data.h +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2015, 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 */ -#ifndef PLUGIN_PROTOCOL_INCLUDED -#define PLUGIN_PROTOCOL_INCLUDED - -#ifndef MYSQL_ABI_CHECK -#include "my_global.h" /* Needed for my_bool in mysql_com.h */ -#include "mysql_com.h" /* mysql_enum_shutdown_level */ -#endif - - -/** -@file - Definition of COM_DATA to be used with the Command service as data input - structure. -*/ - - -typedef struct st_com_init_db_data -{ - const char *db_name; - unsigned long length; -} COM_INIT_DB_DATA; - -typedef struct st_com_refresh_data -{ - unsigned char options; -} COM_REFRESH_DATA; - -typedef struct st_com_shutdown_data -{ - enum mysql_enum_shutdown_level level; -} COM_SHUTDOWN_DATA; - -typedef struct st_com_kill_data -{ - unsigned long id; -} COM_KILL_DATA; - -typedef struct st_com_set_option_data -{ - unsigned int opt_command; -} COM_SET_OPTION_DATA; - -typedef struct st_com_stmt_execute_data -{ - unsigned long stmt_id; - unsigned long flags; - unsigned char *params; - unsigned long params_length; -} COM_STMT_EXECUTE_DATA; - -typedef struct st_com_stmt_fetch_data -{ - unsigned long stmt_id; - unsigned long num_rows; -} COM_STMT_FETCH_DATA; - -typedef struct st_com_stmt_send_long_data_data -{ - unsigned long stmt_id; - unsigned int param_number; - unsigned char *longdata; - unsigned long length; -} COM_STMT_SEND_LONG_DATA_DATA; - -typedef struct st_com_stmt_prepare_data -{ - const char *query; - unsigned int length; -} COM_STMT_PREPARE_DATA; - -typedef struct st_stmt_close_data -{ - unsigned int stmt_id; -} COM_STMT_CLOSE_DATA; - -typedef struct st_com_stmt_reset_data -{ - unsigned int stmt_id; -} COM_STMT_RESET_DATA; - -typedef struct st_com_query_data -{ - const char *query; - unsigned int length; -} COM_QUERY_DATA; - -typedef struct st_com_field_list_data -{ - unsigned char *table_name; - unsigned int table_name_length; - const unsigned char *query; - unsigned int query_length; -} COM_FIELD_LIST_DATA; - -union COM_DATA { - COM_INIT_DB_DATA com_init_db; - COM_REFRESH_DATA com_refresh; - COM_SHUTDOWN_DATA com_shutdown; - COM_KILL_DATA com_kill; - COM_SET_OPTION_DATA com_set_option; - COM_STMT_EXECUTE_DATA com_stmt_execute; - COM_STMT_FETCH_DATA com_stmt_fetch; - COM_STMT_SEND_LONG_DATA_DATA com_stmt_send_long_data; - COM_STMT_PREPARE_DATA com_stmt_prepare; - COM_STMT_CLOSE_DATA com_stmt_close; - COM_STMT_RESET_DATA com_stmt_reset; - COM_QUERY_DATA com_query; - COM_FIELD_LIST_DATA com_field_list; -}; - -#endif /* PLUGIN_PROTOCOL_INCLUDED */ diff --git a/mysql/mysql/get_password.h b/mysql/mysql/get_password.h deleted file mode 100644 index a633c58..0000000 --- a/mysql/mysql/get_password.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2000, 2011, 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 */ - -/* -** Ask for a password from tty -** This is an own file to avoid conflicts with curses -*/ - -#ifndef MYSQL_GET_PASSWORD_H_INCLUDED -#define MYSQL_GET_PASSWORD_H_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif - -typedef char *(* strdup_handler_t)(const char *, int); -char *get_tty_password_ext(const char *opt_message, - strdup_handler_t strdup_function); - -#ifdef __cplusplus -} -#endif - -#endif /* ! MYSQL_GET_PASSWORD_H_INCLUDED */ diff --git a/mysql/mysql/mysql_lex_string.h b/mysql/mysql/mysql_lex_string.h deleted file mode 100644 index ce3b6e4..0000000 --- a/mysql/mysql/mysql_lex_string.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (c) 2015, 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 */ - -#ifndef MYSQL_LEX_STRING_INCLUDED -#define MYSQL_LEX_STRING_INCLUDED - -struct st_mysql_lex_string -{ - char *str; - size_t length; -}; -typedef struct st_mysql_lex_string MYSQL_LEX_STRING; - -struct st_mysql_const_lex_string -{ - const char *str; - size_t length; -}; -typedef struct st_mysql_const_lex_string MYSQL_LEX_CSTRING; - -#endif // MYSQL_LEX_STRING_INCLUDED diff --git a/mysql/mysql/plugin.h b/mysql/mysql/plugin.h deleted file mode 100644 index d683203..0000000 --- a/mysql/mysql/plugin.h +++ /dev/null @@ -1,744 +0,0 @@ -/* Copyright (c) 2005, 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 */ - -#ifndef _my_plugin_h -#define _my_plugin_h - -#ifndef MYSQL_ABI_CHECK -#include -#include "mysql_version.h" /* MYSQL_VERSION_ID */ -#endif - -/* - On Windows, exports from DLL need to be declared. - Also, plugin needs to be declared as extern "C" because MSVC - unlike other compilers, uses C++ mangling for variables not only - for functions. -*/ -#if defined(_MSC_VER) -#if defined(MYSQL_DYNAMIC_PLUGIN) - #ifdef __cplusplus - #define MYSQL_PLUGIN_EXPORT extern "C" __declspec(dllexport) - #else - #define MYSQL_PLUGIN_EXPORT __declspec(dllexport) - #endif -#else /* MYSQL_DYNAMIC_PLUGIN */ - #ifdef __cplusplus - #define MYSQL_PLUGIN_EXPORT extern "C" - #else - #define MYSQL_PLUGIN_EXPORT - #endif -#endif /*MYSQL_DYNAMIC_PLUGIN */ -#else /*_MSC_VER */ -#define MYSQL_PLUGIN_EXPORT -#endif - -#ifdef __cplusplus -class THD; -class Item; -#define MYSQL_THD THD* -#else -#define MYSQL_THD void* -#endif - -typedef void * MYSQL_PLUGIN; - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -#define MYSQL_XIDDATASIZE 128 -/** - struct st_mysql_xid is binary compatible with the XID structure as - in the X/Open CAE Specification, Distributed Transaction Processing: - The XA Specification, X/Open Company Ltd., 1991. - http://www.opengroup.org/bookstore/catalog/c193.htm - - @see XID in sql/handler.h -*/ -struct st_mysql_xid { - long formatID; - long gtrid_length; - long bqual_length; - char data[MYSQL_XIDDATASIZE]; /* Not \0-terminated */ -}; -typedef struct st_mysql_xid MYSQL_XID; - -/************************************************************************* - Plugin API. Common for all plugin types. -*/ - -#define MYSQL_PLUGIN_INTERFACE_VERSION 0x0107 - -/* - The allowable types of plugins -*/ -#define MYSQL_UDF_PLUGIN 0 /* User-defined function */ -#define MYSQL_STORAGE_ENGINE_PLUGIN 1 /* Storage Engine */ -#define MYSQL_FTPARSER_PLUGIN 2 /* Full-text parser plugin */ -#define MYSQL_DAEMON_PLUGIN 3 /* The daemon/raw plugin type */ -#define MYSQL_INFORMATION_SCHEMA_PLUGIN 4 /* The I_S plugin type */ -#define MYSQL_AUDIT_PLUGIN 5 /* The Audit plugin type */ -#define MYSQL_REPLICATION_PLUGIN 6 /* The replication plugin type */ -#define MYSQL_AUTHENTICATION_PLUGIN 7 /* The authentication plugin type */ -#define MYSQL_VALIDATE_PASSWORD_PLUGIN 8 /* validate password plugin type */ -#define MYSQL_GROUP_REPLICATION_PLUGIN 9 /* The Group Replication plugin */ -#define MYSQL_KEYRING_PLUGIN 10 /* The Keyring plugin type */ -#define MYSQL_MAX_PLUGIN_TYPE_NUM 11 /* The number of plugin types */ - -/* We use the following strings to define licenses for plugins */ -#define PLUGIN_LICENSE_PROPRIETARY 0 -#define PLUGIN_LICENSE_GPL 1 -#define PLUGIN_LICENSE_BSD 2 - -#define PLUGIN_LICENSE_PROPRIETARY_STRING "PROPRIETARY" -#define PLUGIN_LICENSE_GPL_STRING "GPL" -#define PLUGIN_LICENSE_BSD_STRING "BSD" - -/* - Macros for beginning and ending plugin declarations. Between - mysql_declare_plugin and mysql_declare_plugin_end there should - be a st_mysql_plugin struct for each plugin to be declared. -*/ - - -#ifndef MYSQL_DYNAMIC_PLUGIN -#define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ -MYSQL_PLUGIN_EXPORT int VERSION= MYSQL_PLUGIN_INTERFACE_VERSION; \ -MYSQL_PLUGIN_EXPORT int PSIZE= sizeof(struct st_mysql_plugin); \ -MYSQL_PLUGIN_EXPORT struct st_mysql_plugin DECLS[]= { -#else -#define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ -MYSQL_PLUGIN_EXPORT int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; \ -MYSQL_PLUGIN_EXPORT int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); \ -MYSQL_PLUGIN_EXPORT struct st_mysql_plugin _mysql_plugin_declarations_[]= { -#endif - -#define mysql_declare_plugin(NAME) \ -__MYSQL_DECLARE_PLUGIN(NAME, \ - builtin_ ## NAME ## _plugin_interface_version, \ - builtin_ ## NAME ## _sizeof_struct_st_plugin, \ - builtin_ ## NAME ## _plugin) - -#define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0,0,0}} - -/** - Declarations for SHOW STATUS support in plugins -*/ -enum enum_mysql_show_type -{ - SHOW_UNDEF, SHOW_BOOL, - SHOW_INT, ///< shown as _unsigned_ int - SHOW_LONG, ///< shown as _unsigned_ long - SHOW_LONGLONG, ///< shown as _unsigned_ longlong - SHOW_CHAR, SHOW_CHAR_PTR, - SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE -#ifdef MYSQL_SERVER - /* - This include defines server-only values of the enum. - Using them in plugins is not supported. - */ - #include "sql_plugin_enum.h" -#endif -}; - -/** - Status variable scope. - Only GLOBAL status variable scope is available in plugins. -*/ -enum enum_mysql_show_scope -{ - SHOW_SCOPE_UNDEF, - SHOW_SCOPE_GLOBAL -#ifdef MYSQL_SERVER - /* Server-only values. Not supported in plugins. */ - , - SHOW_SCOPE_SESSION, - SHOW_SCOPE_ALL -#endif -}; - -/** - SHOW STATUS Server status variable -*/ -struct st_mysql_show_var -{ - const char *name; - char *value; - enum enum_mysql_show_type type; - enum enum_mysql_show_scope scope; -}; - -#define SHOW_VAR_MAX_NAME_LEN 64 -#define SHOW_VAR_FUNC_BUFF_SIZE 1024 -typedef int (*mysql_show_var_func)(MYSQL_THD, struct st_mysql_show_var*, char *); - - -/* - Constants for plugin flags. - */ - -#define PLUGIN_OPT_NO_INSTALL 1UL /* Not dynamically loadable */ -#define PLUGIN_OPT_NO_UNINSTALL 2UL /* Not dynamically unloadable */ - - -/* - declarations for server variables and command line options -*/ - - -#define PLUGIN_VAR_BOOL 0x0001 -#define PLUGIN_VAR_INT 0x0002 -#define PLUGIN_VAR_LONG 0x0003 -#define PLUGIN_VAR_LONGLONG 0x0004 -#define PLUGIN_VAR_STR 0x0005 -#define PLUGIN_VAR_ENUM 0x0006 -#define PLUGIN_VAR_SET 0x0007 -#define PLUGIN_VAR_DOUBLE 0x0008 -#define PLUGIN_VAR_UNSIGNED 0x0080 -#define PLUGIN_VAR_THDLOCAL 0x0100 /* Variable is per-connection */ -#define PLUGIN_VAR_READONLY 0x0200 /* Server variable is read only */ -#define PLUGIN_VAR_NOSYSVAR 0x0400 /* Not a server variable */ -#define PLUGIN_VAR_NOCMDOPT 0x0800 /* Not a command line option */ -#define PLUGIN_VAR_NOCMDARG 0x1000 /* No argument for cmd line */ -#define PLUGIN_VAR_RQCMDARG 0x0000 /* Argument required for cmd line */ -#define PLUGIN_VAR_OPCMDARG 0x2000 /* Argument optional for cmd line */ -#define PLUGIN_VAR_NODEFAULT 0x4000 /* SET DEFAULT is prohibited */ -#define PLUGIN_VAR_MEMALLOC 0x8000 /* String needs memory allocated */ - -struct st_mysql_sys_var; -struct st_mysql_value; - -/* - SYNOPSIS - (*mysql_var_check_func)() - thd thread handle - var dynamic variable being altered - save pointer to temporary storage - value user provided value - RETURN - 0 user provided value is OK and the update func may be called. - any other value indicates error. - - This function should parse the user provided value and store in the - provided temporary storage any data as required by the update func. - There is sufficient space in the temporary storage to store a double. - Note that the update func may not be called if any other error occurs - so any memory allocated should be thread-local so that it may be freed - automatically at the end of the statement. -*/ - -typedef int (*mysql_var_check_func)(MYSQL_THD thd, - struct st_mysql_sys_var *var, - void *save, struct st_mysql_value *value); - -/* - SYNOPSIS - (*mysql_var_update_func)() - thd thread handle - var dynamic variable being altered - var_ptr pointer to dynamic variable - save pointer to temporary storage - RETURN - NONE - - This function should use the validated value stored in the temporary store - and persist it in the provided pointer to the dynamic variable. - For example, strings may require memory to be allocated. -*/ -typedef void (*mysql_var_update_func)(MYSQL_THD thd, - struct st_mysql_sys_var *var, - void *var_ptr, const void *save); - - -/* the following declarations are for internal use only */ - - -#define PLUGIN_VAR_MASK \ - (PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR | \ - PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_NOCMDARG | \ - PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC | \ - PLUGIN_VAR_NODEFAULT) - -#define MYSQL_PLUGIN_VAR_HEADER \ - int flags; \ - const char *name; \ - const char *comment; \ - mysql_var_check_func check; \ - mysql_var_update_func update - -#define MYSQL_SYSVAR_NAME(name) mysql_sysvar_ ## name -#define MYSQL_SYSVAR(name) \ - ((struct st_mysql_sys_var *)&(MYSQL_SYSVAR_NAME(name))) - -/* - for global variables, the value pointer is the first - element after the header, the default value is the second. - for thread variables, the value offset is the first - element after the header, the default value is the second. -*/ - - -#define DECLARE_MYSQL_SYSVAR_BASIC(name, type) struct { \ - MYSQL_PLUGIN_VAR_HEADER; \ - type *value; \ - const type def_val; \ -} MYSQL_SYSVAR_NAME(name) - -#define DECLARE_MYSQL_SYSVAR_SIMPLE(name, type) struct { \ - MYSQL_PLUGIN_VAR_HEADER; \ - type *value; type def_val; \ - type min_val; type max_val; \ - type blk_sz; \ -} MYSQL_SYSVAR_NAME(name) - -#define DECLARE_MYSQL_SYSVAR_TYPELIB(name, type) struct { \ - MYSQL_PLUGIN_VAR_HEADER; \ - type *value; type def_val; \ - TYPELIB *typelib; \ -} MYSQL_SYSVAR_NAME(name) - -#define DECLARE_THDVAR_FUNC(type) \ - type *(*resolve)(MYSQL_THD thd, int offset) - -#define DECLARE_MYSQL_THDVAR_BASIC(name, type) struct { \ - MYSQL_PLUGIN_VAR_HEADER; \ - int offset; \ - const type def_val; \ - DECLARE_THDVAR_FUNC(type); \ -} MYSQL_SYSVAR_NAME(name) - -#define DECLARE_MYSQL_THDVAR_SIMPLE(name, type) struct { \ - MYSQL_PLUGIN_VAR_HEADER; \ - int offset; \ - type def_val; type min_val; \ - type max_val; type blk_sz; \ - DECLARE_THDVAR_FUNC(type); \ -} MYSQL_SYSVAR_NAME(name) - -#define DECLARE_MYSQL_THDVAR_TYPELIB(name, type) struct { \ - MYSQL_PLUGIN_VAR_HEADER; \ - int offset; \ - type def_val; \ - DECLARE_THDVAR_FUNC(type); \ - TYPELIB *typelib; \ -} MYSQL_SYSVAR_NAME(name) - - -/* - the following declarations are for use by plugin implementors -*/ - -#define MYSQL_SYSVAR_BOOL(name, varname, opt, comment, check, update, def) \ -DECLARE_MYSQL_SYSVAR_BASIC(name, char) = { \ - PLUGIN_VAR_BOOL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def} - -#define MYSQL_SYSVAR_STR(name, varname, opt, comment, check, update, def) \ -DECLARE_MYSQL_SYSVAR_BASIC(name, char *) = { \ - PLUGIN_VAR_STR | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def} - -#define MYSQL_SYSVAR_INT(name, varname, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_SYSVAR_SIMPLE(name, int) = { \ - PLUGIN_VAR_INT | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, min, max, blk } - -#define MYSQL_SYSVAR_UINT(name, varname, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned int) = { \ - PLUGIN_VAR_INT | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, min, max, blk } - -#define MYSQL_SYSVAR_LONG(name, varname, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_SYSVAR_SIMPLE(name, long) = { \ - PLUGIN_VAR_LONG | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, min, max, blk } - -#define MYSQL_SYSVAR_ULONG(name, varname, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long) = { \ - PLUGIN_VAR_LONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, min, max, blk } - -#define MYSQL_SYSVAR_LONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_SYSVAR_SIMPLE(name, long long) = { \ - PLUGIN_VAR_LONGLONG | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, min, max, blk } - -#define MYSQL_SYSVAR_ULONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long long) = { \ - PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, min, max, blk } - -#define MYSQL_SYSVAR_ENUM(name, varname, opt, comment, check, update, def, typelib) \ -DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned long) = { \ - PLUGIN_VAR_ENUM | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, typelib } - -#define MYSQL_SYSVAR_SET(name, varname, opt, comment, check, update, def, typelib) \ -DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned long long) = { \ - PLUGIN_VAR_SET | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, typelib } - -#define MYSQL_SYSVAR_DOUBLE(name, varname, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_SYSVAR_SIMPLE(name, double) = { \ - PLUGIN_VAR_DOUBLE | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, &varname, def, min, max, blk } - -#define MYSQL_THDVAR_BOOL(name, opt, comment, check, update, def) \ -DECLARE_MYSQL_THDVAR_BASIC(name, char) = { \ - PLUGIN_VAR_BOOL | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, NULL} - -#define MYSQL_THDVAR_STR(name, opt, comment, check, update, def) \ -DECLARE_MYSQL_THDVAR_BASIC(name, char *) = { \ - PLUGIN_VAR_STR | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, NULL} - -#define MYSQL_THDVAR_INT(name, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_THDVAR_SIMPLE(name, int) = { \ - PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, min, max, blk, NULL } - -#define MYSQL_THDVAR_UINT(name, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned int) = { \ - PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, min, max, blk, NULL } - -#define MYSQL_THDVAR_LONG(name, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_THDVAR_SIMPLE(name, long) = { \ - PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, min, max, blk, NULL } - -#define MYSQL_THDVAR_ULONG(name, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned long) = { \ - PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, min, max, blk, NULL } - -#define MYSQL_THDVAR_LONGLONG(name, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_THDVAR_SIMPLE(name, long long) = { \ - PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, min, max, blk, NULL } - -#define MYSQL_THDVAR_ULONGLONG(name, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_THDVAR_SIMPLE(name, unsigned long long) = { \ - PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, min, max, blk, NULL } - -#define MYSQL_THDVAR_ENUM(name, opt, comment, check, update, def, typelib) \ -DECLARE_MYSQL_THDVAR_TYPELIB(name, unsigned long) = { \ - PLUGIN_VAR_ENUM | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, NULL, typelib } - -#define MYSQL_THDVAR_SET(name, opt, comment, check, update, def, typelib) \ -DECLARE_MYSQL_THDVAR_TYPELIB(name, unsigned long long) = { \ - PLUGIN_VAR_SET | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, NULL, typelib } - -#define MYSQL_THDVAR_DOUBLE(name, opt, comment, check, update, def, min, max, blk) \ -DECLARE_MYSQL_THDVAR_SIMPLE(name, double) = { \ - PLUGIN_VAR_DOUBLE | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \ - #name, comment, check, update, -1, def, min, max, blk, NULL } - -/* accessor macros */ - -#define SYSVAR(name) \ - (*(MYSQL_SYSVAR_NAME(name).value)) - -/* when thd == null, result points to global value */ -#define THDVAR(thd, name) \ - (*(MYSQL_SYSVAR_NAME(name).resolve(thd, MYSQL_SYSVAR_NAME(name).offset))) - - -/* - Plugin description structure. -*/ - -struct st_mysql_plugin -{ - int type; /* the plugin type (a MYSQL_XXX_PLUGIN value) */ - void *info; /* pointer to type-specific plugin descriptor */ - const char *name; /* plugin name */ - const char *author; /* plugin author (for I_S.PLUGINS) */ - const char *descr; /* general descriptive text (for I_S.PLUGINS) */ - int license; /* the plugin license (PLUGIN_LICENSE_XXX) */ - int (*init)(MYSQL_PLUGIN); /* the function to invoke when plugin is loaded */ - int (*deinit)(MYSQL_PLUGIN);/* the function to invoke when plugin is unloaded */ - unsigned int version; /* plugin version (for I_S.PLUGINS) */ - struct st_mysql_show_var *status_vars; - struct st_mysql_sys_var **system_vars; - void * __reserved1; /* reserved for dependency checking */ - unsigned long flags; /* flags for plugin */ -}; - -/************************************************************************* - API for Full-text parser plugin. (MYSQL_FTPARSER_PLUGIN) -*/ -#define MYSQL_FTPARSER_INTERFACE_VERSION 0x0101 - -/************************************************************************* - API for Query Rewrite plugin. (MYSQL_QUERY_REWRITE_PLUGIN) -*/ - -#define MYSQL_REWRITE_PRE_PARSE_INTERFACE_VERSION 0x0010 -#define MYSQL_REWRITE_POST_PARSE_INTERFACE_VERSION 0x0010 - -/************************************************************************* - API for Storage Engine plugin. (MYSQL_DAEMON_PLUGIN) -*/ - -/* handlertons of different MySQL releases are incompatible */ -#define MYSQL_DAEMON_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) - -/* - Here we define only the descriptor structure, that is referred from - st_mysql_plugin. -*/ - -struct st_mysql_daemon -{ - int interface_version; -}; - - -/************************************************************************* - API for I_S plugin. (MYSQL_INFORMATION_SCHEMA_PLUGIN) -*/ - -/* handlertons of different MySQL releases are incompatible */ -#define MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) - -/* - Here we define only the descriptor structure, that is referred from - st_mysql_plugin. -*/ - -struct st_mysql_information_schema -{ - int interface_version; -}; - - -/************************************************************************* - API for Storage Engine plugin. (MYSQL_STORAGE_ENGINE_PLUGIN) -*/ - -/* handlertons of different MySQL releases are incompatible */ -#define MYSQL_HANDLERTON_INTERFACE_VERSION (MYSQL_VERSION_ID << 8) - -/* - The real API is in the sql/handler.h - Here we define only the descriptor structure, that is referred from - st_mysql_plugin. -*/ - -struct st_mysql_storage_engine -{ - int interface_version; -}; - -struct handlerton; - - -/* - API for Replication plugin. (MYSQL_REPLICATION_PLUGIN) -*/ - #define MYSQL_REPLICATION_INTERFACE_VERSION 0x0400 - - /** - Replication plugin descriptor - */ - struct Mysql_replication { - int interface_version; - }; - -/************************************************************************* - st_mysql_value struct for reading values from mysqld. - Used by server variables framework to parse user-provided values. - Will be used for arguments when implementing UDFs. - - Note that val_str() returns a string in temporary memory - that will be freed at the end of statement. Copy the string - if you need it to persist. -*/ - -#define MYSQL_VALUE_TYPE_STRING 0 -#define MYSQL_VALUE_TYPE_REAL 1 -#define MYSQL_VALUE_TYPE_INT 2 - -struct st_mysql_value -{ - int (*value_type)(struct st_mysql_value *); - const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length); - int (*val_real)(struct st_mysql_value *, double *realbuf); - int (*val_int)(struct st_mysql_value *, long long *intbuf); - int (*is_unsigned)(struct st_mysql_value *); -}; - - -/************************************************************************* - Miscellaneous functions for plugin implementors -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -int thd_in_lock_tables(const MYSQL_THD thd); -int thd_tablespace_op(const MYSQL_THD thd); -long long thd_test_options(const MYSQL_THD thd, long long test_options); -int thd_sql_command(const MYSQL_THD thd); -const char *set_thd_proc_info(MYSQL_THD thd, const char *info, - const char *calling_func, - const char *calling_file, - const unsigned int calling_line); -void **thd_ha_data(const MYSQL_THD thd, const struct handlerton *hton); -void thd_storage_lock_wait(MYSQL_THD thd, long long value); -int thd_tx_isolation(const MYSQL_THD thd); -int thd_tx_is_read_only(const MYSQL_THD thd); -MYSQL_THD thd_tx_arbitrate(MYSQL_THD requestor, MYSQL_THD holder); -int thd_tx_priority(const MYSQL_THD thd); -int thd_tx_is_dd_trx(const MYSQL_THD thd); -char *thd_security_context(MYSQL_THD thd, char *buffer, size_t length, - size_t max_query_len); -/* Increments the row counter, see THD::row_count */ -void thd_inc_row_count(MYSQL_THD thd); -int thd_allow_batch(MYSQL_THD thd); - - -/** - Mark transaction to rollback and mark error as fatal to a - sub-statement if in sub statement mode. - - @param thd user thread connection handle - @param all if all != 0, rollback the main transaction -*/ - -void thd_mark_transaction_to_rollback(MYSQL_THD thd, int all); - -/** - Create a temporary file. - - @details - The temporary file is created in a location specified by the mysql - server configuration (--tmpdir option). The caller does not need to - delete the file, it will be deleted automatically. - - @param prefix prefix for temporary file name - @retval -1 error - @retval >= 0 a file handle that can be passed to dup or my_close -*/ -int mysql_tmpfile(const char *prefix); - -/** - Check the killed state of a connection - - @details - In MySQL support for the KILL statement is cooperative. The KILL - statement only sets a "killed" flag. This function returns the value - of that flag. A thread should check it often, especially inside - time-consuming loops, and gracefully abort the operation if it is - non-zero. - - @param thd user thread connection handle - @retval 0 the connection is active - @retval 1 the connection has been killed -*/ -int thd_killed(const MYSQL_THD thd); - -/** - Set the killed status of the current statement. - - @param thd user thread connection handle -*/ -void thd_set_kill_status(const MYSQL_THD thd); - -/** - Get binary log position for latest written entry. - - @note The file variable will be set to a buffer holding the name of - the file name currently, but this can change if a rotation - occur. Copy the string if you want to retain it. - - @param thd Use thread connection handle - @param file_var Pointer to variable that will hold the file name. - @param pos_var Pointer to variable that will hold the file position. - */ -void thd_binlog_pos(const MYSQL_THD thd, - const char **file_var, - unsigned long long *pos_var); - -/** - Return the thread id of a user thread - - @param thd user thread connection handle - @return thread id -*/ -unsigned long thd_get_thread_id(const MYSQL_THD thd); - -/** - Get the XID for this connection's transaction - - @param thd user thread connection handle - @param xid location where identifier is stored -*/ -void thd_get_xid(const MYSQL_THD thd, MYSQL_XID *xid); - -/** - Invalidate the query cache for a given table. - - @param thd user thread connection handle - @param key databasename/tablename in the canonical format. - @param key_length length of key in bytes, including the PATH separator - @param using_trx flag: TRUE if using transactions, FALSE otherwise -*/ -void mysql_query_cache_invalidate4(MYSQL_THD thd, - const char *key, unsigned int key_length, - int using_trx); - - -/** - Provide a handler data getter to simplify coding -*/ -void *thd_get_ha_data(const MYSQL_THD thd, const struct handlerton *hton); - - -/** - Provide a handler data setter to simplify coding - - @details - Set ha_data pointer (storage engine per-connection information). - - To avoid unclean deactivation (uninstall) of storage engine plugin - in the middle of transaction, additional storage engine plugin - lock is acquired. - - If ha_data is not null and storage engine plugin was not locked - by thd_set_ha_data() in this connection before, storage engine - plugin gets locked. - - If ha_data is null and storage engine plugin was locked by - thd_set_ha_data() in this connection before, storage engine - plugin lock gets released. - - If handlerton::close_connection() didn't reset ha_data, server does - it immediately after calling handlerton::close_connection(). -*/ -void thd_set_ha_data(MYSQL_THD thd, const struct handlerton *hton, - const void *ha_data); -#ifdef __cplusplus -} -#endif - -#endif /* _my_plugin_h */ diff --git a/mysql/mysql/plugin_auth_common.h b/mysql/mysql/plugin_auth_common.h deleted file mode 100644 index 1eb1786..0000000 --- a/mysql/mysql/plugin_auth_common.h +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef MYSQL_PLUGIN_AUTH_COMMON_INCLUDED -/* Copyright (c) 2010, 2015, 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 */ - -/** - @file - - This file defines constants and data structures that are the same for - both client- and server-side authentication plugins. -*/ -#define MYSQL_PLUGIN_AUTH_COMMON_INCLUDED - -/** the max allowed length for a user name */ -#define MYSQL_USERNAME_LENGTH 96 - -/** - return values of the plugin authenticate_user() method. -*/ - -/** - Authentication failed, plugin internal error. - An error occurred in the authentication plugin itself. - These errors are reported in table performance_schema.host_cache, - column COUNT_AUTH_PLUGIN_ERRORS. -*/ -#define CR_AUTH_PLUGIN_ERROR 3 -/** - Authentication failed, client server handshake. - An error occurred during the client server handshake. - These errors are reported in table performance_schema.host_cache, - column COUNT_HANDSHAKE_ERRORS. -*/ -#define CR_AUTH_HANDSHAKE 2 -/** - Authentication failed, user credentials. - For example, wrong passwords. - These errors are reported in table performance_schema.host_cache, - column COUNT_AUTHENTICATION_ERRORS. -*/ -#define CR_AUTH_USER_CREDENTIALS 1 -/** - Authentication failed. Additionally, all other CR_xxx values - (libmysql error code) can be used too. - - The client plugin may set the error code and the error message directly - in the MYSQL structure and return CR_ERROR. If a CR_xxx specific error - code was returned, an error message in the MYSQL structure will be - overwritten. If CR_ERROR is returned without setting the error in MYSQL, - CR_UNKNOWN_ERROR will be user. -*/ -#define CR_ERROR 0 -/** - Authentication (client part) was successful. It does not mean that the - authentication as a whole was successful, usually it only means - that the client was able to send the user name and the password to the - server. If CR_OK is returned, the libmysql reads the next packet expecting - it to be one of OK, ERROR, or CHANGE_PLUGIN packets. -*/ -#define CR_OK -1 -/** - Authentication was successful. - It means that the client has done its part successfully and also that - a plugin has read the last packet (one of OK, ERROR, CHANGE_PLUGIN). - In this case, libmysql will not read a packet from the server, - but it will use the data at mysql->net.read_pos. - - A plugin may return this value if the number of roundtrips in the - authentication protocol is not known in advance, and the client plugin - needs to read one packet more to determine if the authentication is finished - or not. -*/ -#define CR_OK_HANDSHAKE_COMPLETE -2 - -/** -Flag to be passed back to server from authentication plugins via -authenticated_as when proxy mapping should be done by the server. -*/ -#define PROXY_FLAG 0 - -/* - We need HANDLE definition if on Windows. Define WIN32_LEAN_AND_MEAN (if - not already done) to minimize amount of imported declarations. -*/ -#ifdef _WIN32 -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#endif - -typedef struct st_plugin_vio_info -{ - enum { MYSQL_VIO_INVALID, MYSQL_VIO_TCP, MYSQL_VIO_SOCKET, - MYSQL_VIO_PIPE, MYSQL_VIO_MEMORY } protocol; - int socket; /**< it's set, if the protocol is SOCKET or TCP */ -#ifdef _WIN32 - HANDLE handle; /**< it's set, if the protocol is PIPE or MEMORY */ -#endif -} MYSQL_PLUGIN_VIO_INFO; - -/** - Provides plugin access to communication channel -*/ -typedef struct st_plugin_vio -{ - /** - Plugin provides a pointer reference and this function sets it to the - contents of any incoming packet. Returns the packet length, or -1 if - the plugin should terminate. - */ - int (*read_packet)(struct st_plugin_vio *vio, - unsigned char **buf); - - /** - Plugin provides a buffer with data and the length and this - function sends it as a packet. Returns 0 on success, 1 on failure. - */ - int (*write_packet)(struct st_plugin_vio *vio, - const unsigned char *packet, - int packet_len); - - /** - Fills in a st_plugin_vio_info structure, providing the information - about the connection. - */ - void (*info)(struct st_plugin_vio *vio, struct st_plugin_vio_info *info); - -} MYSQL_PLUGIN_VIO; - -#endif - diff --git a/mysql/mysql/plugin_trace.h b/mysql/mysql/plugin_trace.h deleted file mode 100644 index 71ac0b1..0000000 --- a/mysql/mysql/plugin_trace.h +++ /dev/null @@ -1,349 +0,0 @@ -/* Copyright (c) 2012, 2013, 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 */ - -#ifndef PLUGIN_TRACE_INCLUDED -#define PLUGIN_TRACE_INCLUDED -/** - @file - - ======================================================================== - Declarations for client-side plugins of type MYSQL_CLIENT_TRACE_PLUGIN - ======================================================================== - - See libmysql/mysql_trace.c for a brief description of the client-side - protocol tracing infrastructure. -*/ - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - Lists of protocol stages and trace events - ========================================= - - These lists are defined with PROTOCOL_STAGE_LIST() and TRACE_EVENT_LIST(), - respectively. Macros accept a disposition name as an argument. - - For example, to process list of protocol stages using disposition "foo", - define protocol_stage_foo(Stage) macro and then put - - PROTOCOL_STAGE_LIST(foo) - - in your code. This will expand to sequence of protocol_stage_foo(X) - macros where X ranges over the list of protocol stages, and these macros - should generate the actual code. See below how this technique is used - to generate protocol_stage and trace_events enums. -*/ - -/** - Protocol stages - --------------- - - A client following the MySQL protocol goes through several stages of it. Each - stage determines what packets can be expected from the server or can be send - by the client. - - Upon receiving each trace event, trace plugin will be notified of the current - protocol stage so that it can correctly interpret the event. - - These are the possible protocol stages and the transitions between them. - - .. digraph:: protocol_stages - - CONNECTING -> WAIT_FOR_INIT_PACKET; - CONNECTING -> DISCONNECTED [ label = "failed connection" ]; - - WAIT_FOR_INIT_PACKET -> AUTHENTICATE; - WAIT_FOR_INIT_PACKET -> SSL_NEGOTIATION -> AUTHENTICATE; - - AUTHENTICATE -> READY_FOR_COMMAND [ label = "accepted" ]; - AUTHENTICATE -> DISCONNECTED [ label = "rejected" ]; - - READY_FOR_COMMAND -> DISCONNECTED [ label = "COM_QUIT" ]; - READY_FOR_COMMAND -> AUTHENTICATE [ label="after change user" ]; - READY_FOR_COMMAND -> WAIT_FOR_PACKET - [ label="wait for a single packet after, e.g., COM_STATISTICS" ]; - READY_FOR_COMMAND -> WAIT_FOR_RESULT; - READY_FOR_COMMAND -> WAIT_FOR_PS_DESCRIPTION - [ label="after prepare command" ]; - - WAIT_FOR_PACKET -> READY_FOR_COMAND; - - WAIT_FOR_RESULT -> READY_FOR_COMMAND [ label="simple reply" ]; - WAIT_FOR_RESULT -> WAIT_FOR_FIELD_DEF; - WAIT_FOR_RESULT -> FILE_REQUEST; - - WAIT_FOR_FIELD_DEF -> WAIT_FOR_ROW [ label="in a resultset" ]; - WAIT_FOR_FIELD_DEF -> READY_FOR_COMMAND - [ label="after describe table or prepare command" ]; - - WAIT_FOR_ROW -> READY_FOR_COMMAND; - WAIT_FOR_ROW -> WAIT_FOR_RESULT [ label="multi-resultset" ]; - - WAIT_FOR_PS_DESCRIPTION -> WAIT_FOR_PARAM_DEF; - WAIT_FOR_PS_DESCRIPTION -> READY_FOR_COMMAND - [ label="no params and result" ]; - WAIT_FOR_PS_DESCRIPTION -> WAIT_FOR_FIELD_DEF [ label="no params" ]; - - WAIT_FOR_PARAM_DEF -> WAIT_FOR_FIELD_DEF; - WAIT_FOR_PARAM_DEF -> READY_FOR_COMMAND [ label="no result" ]; - - FILE_REQUEST -> WAIT_FOR_RESULT [label="when whole file sent"]; -*/ - -#define PROTOCOL_STAGE_LIST(X) \ - protocol_stage_ ## X(CONNECTING) \ - protocol_stage_ ## X(WAIT_FOR_INIT_PACKET) \ - protocol_stage_ ## X(AUTHENTICATE) \ - protocol_stage_ ## X(SSL_NEGOTIATION) \ - protocol_stage_ ## X(READY_FOR_COMMAND) \ - protocol_stage_ ## X(WAIT_FOR_PACKET) \ - protocol_stage_ ## X(WAIT_FOR_RESULT) \ - protocol_stage_ ## X(WAIT_FOR_FIELD_DEF) \ - protocol_stage_ ## X(WAIT_FOR_ROW) \ - protocol_stage_ ## X(FILE_REQUEST) \ - protocol_stage_ ## X(WAIT_FOR_PS_DESCRIPTION) \ - protocol_stage_ ## X(WAIT_FOR_PARAM_DEF) \ - protocol_stage_ ## X(DISCONNECTED) - -/** - Trace events - ------------ - - The following events are generated during the various stages of the - client-server conversation. - - ---------------------- ----------------------------------------------------- - Connection events - ---------------------- ----------------------------------------------------- - CONNECTING Client is connecting to the server. - CONNECTED Physical connection has been established. - DISCONNECTED Connection with server was broken. - ---------------------- ----------------------------------------------------- - SSL events - ---------------------- ----------------------------------------------------- - SEND_SSL_REQUEST Client is sending SSL connection request. - SSL_CONNECT Client is initiating SSL handshake. - SSL_CONNECTED SSL connection has been established. - ---------------------- ----------------------------------------------------- - Authentication events - ---------------------- ----------------------------------------------------- - CHALLENGE_RECEIVED Client received authentication challenge. - AUTH_PLUGIN Client selects an authentication plugin to be used - in the following authentication exchange. - SEND_AUTH_RESPONSE Client sends response to the authentication - challenge. - SEND_AUTH_DATA Client sends extra authentication data packet. - AUTHENTICATED Server has accepted connection. - ---------------------- ----------------------------------------------------- - Command phase events - ---------------------- ----------------------------------------------------- - SEND_COMMAND Client is sending a command to the server. - SEND_FILE Client is sending local file contents to the server. - ---------------------- ----------------------------------------------------- - General events - ---------------------- ----------------------------------------------------- - READ_PACKET Client starts waiting for a packet from server. - PACKET_RECEIVED A packet from server has been received. - PACKET_SENT After successful sending of a packet to the server. - ERROR Client detected an error. - ---------------------- ----------------------------------------------------- -*/ - -#define TRACE_EVENT_LIST(X) \ - trace_event_ ## X(ERROR) \ - trace_event_ ## X(CONNECTING) \ - trace_event_ ## X(CONNECTED) \ - trace_event_ ## X(DISCONNECTED) \ - trace_event_ ## X(SEND_SSL_REQUEST) \ - trace_event_ ## X(SSL_CONNECT) \ - trace_event_ ## X(SSL_CONNECTED) \ - trace_event_ ## X(INIT_PACKET_RECEIVED) \ - trace_event_ ## X(AUTH_PLUGIN) \ - trace_event_ ## X(SEND_AUTH_RESPONSE) \ - trace_event_ ## X(SEND_AUTH_DATA) \ - trace_event_ ## X(AUTHENTICATED) \ - trace_event_ ## X(SEND_COMMAND) \ - trace_event_ ## X(SEND_FILE) \ - trace_event_ ## X(READ_PACKET) \ - trace_event_ ## X(PACKET_RECEIVED) \ - trace_event_ ## X(PACKET_SENT) - -/** - Some trace events have additional arguments. These are stored in - st_trace_event_args structure. Various events store their arguments in the - structure as follows. Unused members are set to 0/NULL. - - AUTH_PLUGIN - ------------- ---------------------------------- - plugin_name the name of the plugin - ------------- ---------------------------------- - - SEND_COMMAND - ------------- ---------------------------------- - cmd the command code - hdr pointer to command packet header - hdr_len length of the header - pkt pointer to command arguments - pkt_len length of arguments - ------------- ---------------------------------- - - Other SEND_* and *_RECEIVED events - ------------- ---------------------------------- - pkt the data sent or received - pkt_len length of the data - ------------- ---------------------------------- - - PACKET_SENT - ------------- ---------------------------------- - pkt_len number of bytes sent - ------------- ---------------------------------- -*/ - -struct st_trace_event_args -{ - const char *plugin_name; - int cmd; - const unsigned char *hdr; - size_t hdr_len; - const unsigned char *pkt; - size_t pkt_len; -}; - - -/* Definitions of protocol_stage and trace_event enums. */ - -#define protocol_stage_enum(X) PROTOCOL_STAGE_ ## X, - -enum protocol_stage { - PROTOCOL_STAGE_LIST(enum) - PROTOCOL_STAGE_LAST -}; - -#define trace_event_enum(X) TRACE_EVENT_ ## X, - -enum trace_event { - TRACE_EVENT_LIST(enum) - TRACE_EVENT_LAST -}; - - -/* - Trace plugin methods - ==================== -*/ - -struct st_mysql_client_plugin_TRACE; -struct st_mysql; - -/** - Trace plugin tracing_start() method. - - Called when tracing with this plugin starts on a connection. A trace - plugin might want to maintain per-connection information. It can - return a pointer to memory area holding such information. It will be - stored in a connection handle and passed to other plugin methods. - - @param self pointer to the plugin instance - @param connection_handle - @param stage protocol stage in which tracing has started - currently - it is always CONNECTING stage. - - @return A pointer to plugin-specific, per-connection data if any. -*/ - -typedef -void* (tracing_start_callback)(struct st_mysql_client_plugin_TRACE *self, - struct st_mysql *connection_handle, - enum protocol_stage stage); - -/** - Trace plugin tracing_stop() method. - - Called when tracing of the connection has ended. If a plugin - allocated any per-connection resources, it should de-allocate them - here. - - @param self pointer to the plugin instance - @param connection_handle - @param plugin_data pointer to plugin's per-connection data. -*/ - -typedef -void (tracing_stop_callback)(struct st_mysql_client_plugin_TRACE *self, - struct st_mysql *connection_handle, - void *plugin_data); - -/** - Trace plugin trace_event() method. - - Called when a trace event occurs. Plugin can decide to stop tracing - this connection by returning non-zero value. - - @param self pointer to the plugin instance - @param plugin_data pointer to plugin's per-connection data - @param connection_handle - @param stage current protocol stage - @param event the trace event - @param args trace event arguments - - @return Non-zero if tracing of the connection should end here. -*/ - -typedef -int (trace_event_handler)(struct st_mysql_client_plugin_TRACE *self, - void *plugin_data, - struct st_mysql *connection_handle, - enum protocol_stage stage, - enum trace_event event, - struct st_trace_event_args args); - - -struct st_mysql_client_plugin_TRACE -{ - MYSQL_CLIENT_PLUGIN_HEADER - tracing_start_callback *tracing_start; - tracing_stop_callback *tracing_stop; - trace_event_handler *trace_event; -}; - -/** - The global trace_plugin pointer. If it is not NULL, it points at a - loaded trace plugin which should be used to trace all connections made - to the server. -*/ -extern -struct st_mysql_client_plugin_TRACE *trace_plugin; - -#ifndef DBUG_OFF - -/* - Functions for getting names of trace events and protocol - stages for debugging purposes. -*/ -const char* protocol_stage_name(enum protocol_stage stage); -const char* trace_event_name(enum trace_event ev); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mysql/mysql/psi/mysql_file.h b/mysql/mysql/psi/mysql_file.h deleted file mode 100644 index fd28886..0000000 --- a/mysql/mysql/psi/mysql_file.h +++ /dev/null @@ -1,1433 +0,0 @@ -/* Copyright (c) 2008, 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, - 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ - -#ifndef MYSQL_FILE_H -#define MYSQL_FILE_H - -#include - -/* For strlen() */ -#include -/* For MY_STAT */ -#include -/* For my_chsize */ -#include - -/** - @file mysql/psi/mysql_file.h - Instrumentation helpers for mysys file io. - This header file provides the necessary declarations - to use the mysys file API with the performance schema instrumentation. - In some compilers (SunStudio), 'static inline' functions, when declared - but not used, are not optimized away (because they are unused) by default, - so that including a static inline function from a header file does - create unwanted dependencies, causing unresolved symbols at link time. - Other compilers, like gcc, optimize these dependencies by default. - - Since the instrumented APIs declared here are wrapper on top - of mysys file io APIs, including mysql/psi/mysql_file.h assumes that - the dependency on my_sys already exists. -*/ - -#include "mysql/psi/psi.h" - -#ifndef PSI_FILE_CALL -#define PSI_FILE_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -/** - @defgroup File_instrumentation File Instrumentation - @ingroup Instrumentation_interface - @{ -*/ - -/** - @def mysql_file_register(P1, P2, P3) - File registration. -*/ -#define mysql_file_register(P1, P2, P3) \ - inline_mysql_file_register(P1, P2, P3) - -/** - @def mysql_file_fgets(P1, P2, F) - Instrumented fgets. - @c mysql_file_fgets is a replacement for @c fgets. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fgets(P1, P2, F) \ - inline_mysql_file_fgets(__FILE__, __LINE__, P1, P2, F) -#else - #define mysql_file_fgets(P1, P2, F) \ - inline_mysql_file_fgets(P1, P2, F) -#endif - -/** - @def mysql_file_fgetc(F) - Instrumented fgetc. - @c mysql_file_fgetc is a replacement for @c fgetc. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fgetc(F) inline_mysql_file_fgetc(__FILE__, __LINE__, F) -#else - #define mysql_file_fgetc(F) inline_mysql_file_fgetc(F) -#endif - -/** - @def mysql_file_fputs(P1, F) - Instrumented fputs. - @c mysql_file_fputs is a replacement for @c fputs. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fputs(P1, F) \ - inline_mysql_file_fputs(__FILE__, __LINE__, P1, F) -#else - #define mysql_file_fputs(P1, F)\ - inline_mysql_file_fputs(P1, F) -#endif - -/** - @def mysql_file_fputc(P1, F) - Instrumented fputc. - @c mysql_file_fputc is a replacement for @c fputc. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fputc(P1, F) \ - inline_mysql_file_fputc(__FILE__, __LINE__, P1, F) -#else - #define mysql_file_fputc(P1, F) \ - inline_mysql_file_fputc(P1, F) -#endif - -/** - @def mysql_file_fprintf - Instrumented fprintf. - @c mysql_file_fprintf is a replacement for @c fprintf. -*/ -#define mysql_file_fprintf inline_mysql_file_fprintf - -/** - @def mysql_file_vfprintf(F, P1, P2) - Instrumented vfprintf. - @c mysql_file_vfprintf is a replacement for @c vfprintf. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_vfprintf(F, P1, P2) \ - inline_mysql_file_vfprintf(__FILE__, __LINE__, F, P1, P2) -#else - #define mysql_file_vfprintf(F, P1, P2) \ - inline_mysql_file_vfprintf(F, P1, P2) -#endif - -/** - @def mysql_file_fflush(F, P1, P2) - Instrumented fflush. - @c mysql_file_fflush is a replacement for @c fflush. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fflush(F) \ - inline_mysql_file_fflush(__FILE__, __LINE__, F) -#else - #define mysql_file_fflush(F) \ - inline_mysql_file_fflush(F) -#endif - -/** - @def mysql_file_feof(F) - Instrumented feof. - @c mysql_file_feof is a replacement for @c feof. -*/ -#define mysql_file_feof(F) inline_mysql_file_feof(F) - -/** - @def mysql_file_fstat(FN, S, FL) - Instrumented fstat. - @c mysql_file_fstat is a replacement for @c my_fstat. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fstat(FN, S, FL) \ - inline_mysql_file_fstat(__FILE__, __LINE__, FN, S, FL) -#else - #define mysql_file_fstat(FN, S, FL) \ - inline_mysql_file_fstat(FN, S, FL) -#endif - -/** - @def mysql_file_stat(K, FN, S, FL) - Instrumented stat. - @c mysql_file_stat is a replacement for @c my_stat. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_stat(K, FN, S, FL) \ - inline_mysql_file_stat(K, __FILE__, __LINE__, FN, S, FL) -#else - #define mysql_file_stat(K, FN, S, FL) \ - inline_mysql_file_stat(FN, S, FL) -#endif - -/** - @def mysql_file_chsize(F, P1, P2, P3) - Instrumented chsize. - @c mysql_file_chsize is a replacement for @c my_chsize. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_chsize(F, P1, P2, P3) \ - inline_mysql_file_chsize(__FILE__, __LINE__, F, P1, P2, P3) -#else - #define mysql_file_chsize(F, P1, P2, P3) \ - inline_mysql_file_chsize(F, P1, P2, P3) -#endif - -/** - @def mysql_file_fopen(K, N, F1, F2) - Instrumented fopen. - @c mysql_file_fopen is a replacement for @c my_fopen. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fopen(K, N, F1, F2) \ - inline_mysql_file_fopen(K, __FILE__, __LINE__, N, F1, F2) -#else - #define mysql_file_fopen(K, N, F1, F2) \ - inline_mysql_file_fopen(N, F1, F2) -#endif - -/** - @def mysql_file_fclose(FD, FL) - Instrumented fclose. - @c mysql_file_fclose is a replacement for @c my_fclose. - Without the instrumentation, this call will have the same behavior as the - undocumented and possibly platform specific my_fclose(NULL, ...) behavior. - With the instrumentation, mysql_fclose(NULL, ...) will safely return 0, - which is an extension compared to my_fclose and is therefore compliant. - mysql_fclose is on purpose *not* implementing - @code DBUG_ASSERT(file != NULL) @endcode, - since doing so could introduce regressions. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fclose(FD, FL) \ - inline_mysql_file_fclose(__FILE__, __LINE__, FD, FL) -#else - #define mysql_file_fclose(FD, FL) \ - inline_mysql_file_fclose(FD, FL) -#endif - -/** - @def mysql_file_fread(FD, P1, P2, P3) - Instrumented fread. - @c mysql_file_fread is a replacement for @c my_fread. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fread(FD, P1, P2, P3) \ - inline_mysql_file_fread(__FILE__, __LINE__, FD, P1, P2, P3) -#else - #define mysql_file_fread(FD, P1, P2, P3) \ - inline_mysql_file_fread(FD, P1, P2, P3) -#endif - -/** - @def mysql_file_fwrite(FD, P1, P2, P3) - Instrumented fwrite. - @c mysql_file_fwrite is a replacement for @c my_fwrite. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fwrite(FD, P1, P2, P3) \ - inline_mysql_file_fwrite(__FILE__, __LINE__, FD, P1, P2, P3) -#else - #define mysql_file_fwrite(FD, P1, P2, P3) \ - inline_mysql_file_fwrite(FD, P1, P2, P3) -#endif - -/** - @def mysql_file_fseek(FD, P, W, F) - Instrumented fseek. - @c mysql_file_fseek is a replacement for @c my_fseek. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_fseek(FD, P, W, F) \ - inline_mysql_file_fseek(__FILE__, __LINE__, FD, P, W, F) -#else - #define mysql_file_fseek(FD, P, W, F) \ - inline_mysql_file_fseek(FD, P, W, F) -#endif - -/** - @def mysql_file_ftell(FD, F) - Instrumented ftell. - @c mysql_file_ftell is a replacement for @c my_ftell. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_ftell(FD, F) \ - inline_mysql_file_ftell(__FILE__, __LINE__, FD, F) -#else - #define mysql_file_ftell(FD, F) \ - inline_mysql_file_ftell(FD, F) -#endif - -/** - @def mysql_file_create(K, N, F1, F2, F3) - Instrumented create. - @c mysql_file_create is a replacement for @c my_create. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_create(K, N, F1, F2, F3) \ - inline_mysql_file_create(K, __FILE__, __LINE__, N, F1, F2, F3) -#else - #define mysql_file_create(K, N, F1, F2, F3) \ - inline_mysql_file_create(N, F1, F2, F3) -#endif - -/** - @def mysql_file_create_temp(K, T, D, P, M, F) - Instrumented create_temp_file. - @c mysql_file_create_temp is a replacement for @c create_temp_file. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_create_temp(K, T, D, P, M, F) \ - inline_mysql_file_create_temp(K, __FILE__, __LINE__, T, D, P, M, F) -#else - #define mysql_file_create_temp(K, T, D, P, M, F) \ - inline_mysql_file_create_temp(T, D, P, M, F) -#endif - -/** - @def mysql_file_open(K, N, F1, F2) - Instrumented open. - @c mysql_file_open is a replacement for @c my_open. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_open(K, N, F1, F2) \ - inline_mysql_file_open(K, __FILE__, __LINE__, N, F1, F2) -#else - #define mysql_file_open(K, N, F1, F2) \ - inline_mysql_file_open(N, F1, F2) -#endif - -/** - @def mysql_file_close(FD, F) - Instrumented close. - @c mysql_file_close is a replacement for @c my_close. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_close(FD, F) \ - inline_mysql_file_close(__FILE__, __LINE__, FD, F) -#else - #define mysql_file_close(FD, F) \ - inline_mysql_file_close(FD, F) -#endif - -/** - @def mysql_file_read(FD, B, S, F) - Instrumented read. - @c mysql_read is a replacement for @c my_read. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_read(FD, B, S, F) \ - inline_mysql_file_read(__FILE__, __LINE__, FD, B, S, F) -#else - #define mysql_file_read(FD, B, S, F) \ - inline_mysql_file_read(FD, B, S, F) -#endif - -/** - @def mysql_file_write(FD, B, S, F) - Instrumented write. - @c mysql_file_write is a replacement for @c my_write. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_write(FD, B, S, F) \ - inline_mysql_file_write(__FILE__, __LINE__, FD, B, S, F) -#else - #define mysql_file_write(FD, B, S, F) \ - inline_mysql_file_write(FD, B, S, F) -#endif - -/** - @def mysql_file_pread(FD, B, S, O, F) - Instrumented pread. - @c mysql_pread is a replacement for @c my_pread. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_pread(FD, B, S, O, F) \ - inline_mysql_file_pread(__FILE__, __LINE__, FD, B, S, O, F) -#else - #define mysql_file_pread(FD, B, S, O, F) \ - inline_mysql_file_pread(FD, B, S, O, F) -#endif - -/** - @def mysql_file_pwrite(FD, B, S, O, F) - Instrumented pwrite. - @c mysql_file_pwrite is a replacement for @c my_pwrite. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_pwrite(FD, B, S, O, F) \ - inline_mysql_file_pwrite(__FILE__, __LINE__, FD, B, S, O, F) -#else - #define mysql_file_pwrite(FD, B, S, O, F) \ - inline_mysql_file_pwrite(FD, B, S, O, F) -#endif - -/** - @def mysql_file_seek(FD, P, W, F) - Instrumented seek. - @c mysql_file_seek is a replacement for @c my_seek. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_seek(FD, P, W, F) \ - inline_mysql_file_seek(__FILE__, __LINE__, FD, P, W, F) -#else - #define mysql_file_seek(FD, P, W, F) \ - inline_mysql_file_seek(FD, P, W, F) -#endif - -/** - @def mysql_file_tell(FD, F) - Instrumented tell. - @c mysql_file_tell is a replacement for @c my_tell. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_tell(FD, F) \ - inline_mysql_file_tell(__FILE__, __LINE__, FD, F) -#else - #define mysql_file_tell(FD, F) \ - inline_mysql_file_tell(FD, F) -#endif - -/** - @def mysql_file_delete(K, P1, P2) - Instrumented delete. - @c mysql_file_delete is a replacement for @c my_delete. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_delete(K, P1, P2) \ - inline_mysql_file_delete(K, __FILE__, __LINE__, P1, P2) -#else - #define mysql_file_delete(K, P1, P2) \ - inline_mysql_file_delete(P1, P2) -#endif - -/** - @def mysql_file_rename(K, P1, P2, P3) - Instrumented rename. - @c mysql_file_rename is a replacement for @c my_rename. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_rename(K, P1, P2, P3) \ - inline_mysql_file_rename(K, __FILE__, __LINE__, P1, P2, P3) -#else - #define mysql_file_rename(K, P1, P2, P3) \ - inline_mysql_file_rename(P1, P2, P3) -#endif - -/** - @def mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) - Instrumented create with symbolic link. - @c mysql_file_create_with_symlink is a replacement - for @c my_create_with_symlink. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) \ - inline_mysql_file_create_with_symlink(K, __FILE__, __LINE__, \ - P1, P2, P3, P4, P5) -#else - #define mysql_file_create_with_symlink(K, P1, P2, P3, P4, P5) \ - inline_mysql_file_create_with_symlink(P1, P2, P3, P4, P5) -#endif - -/** - @def mysql_file_delete_with_symlink(K, P1, P2) - Instrumented delete with symbolic link. - @c mysql_file_delete_with_symlink is a replacement - for @c my_delete_with_symlink. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_delete_with_symlink(K, P1, P2) \ - inline_mysql_file_delete_with_symlink(K, __FILE__, __LINE__, P1, P2) -#else - #define mysql_file_delete_with_symlink(K, P1, P2) \ - inline_mysql_file_delete_with_symlink(P1, P2) -#endif - -/** - @def mysql_file_rename_with_symlink(K, P1, P2, P3) - Instrumented rename with symbolic link. - @c mysql_file_rename_with_symlink is a replacement - for @c my_rename_with_symlink. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_rename_with_symlink(K, P1, P2, P3) \ - inline_mysql_file_rename_with_symlink(K, __FILE__, __LINE__, P1, P2, P3) -#else - #define mysql_file_rename_with_symlink(K, P1, P2, P3) \ - inline_mysql_file_rename_with_symlink(P1, P2, P3) -#endif - -/** - @def mysql_file_sync(P1, P2) - Instrumented file sync. - @c mysql_file_sync is a replacement for @c my_sync. -*/ -#ifdef HAVE_PSI_FILE_INTERFACE - #define mysql_file_sync(P1, P2) \ - inline_mysql_file_sync(__FILE__, __LINE__, P1, P2) -#else - #define mysql_file_sync(P1, P2) \ - inline_mysql_file_sync(P1, P2) -#endif - -/** - An instrumented FILE structure. - @sa MYSQL_FILE -*/ -struct st_mysql_file -{ - /** The real file. */ - FILE *m_file; - /** - The instrumentation hook. - Note that this hook is not conditionally defined, - for binary compatibility of the @c MYSQL_FILE interface. - */ - struct PSI_file *m_psi; -}; - -/** - Type of an instrumented file. - @c MYSQL_FILE is a drop-in replacement for @c FILE. - @sa mysql_file_open -*/ -typedef struct st_mysql_file MYSQL_FILE; - -static inline void inline_mysql_file_register( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *category, - PSI_file_info *info, - int count -#else - const char *category MY_ATTRIBUTE ((unused)), - void *info MY_ATTRIBUTE ((unused)), - int count MY_ATTRIBUTE ((unused)) -#endif -) -{ -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_FILE_CALL(register_file)(category, info, count); -#endif -} - -static inline char * -inline_mysql_file_fgets( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - char *str, int size, MYSQL_FILE *file) -{ - char *result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_READ); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) size, src_file, src_line); - result= fgets(str, size, file->m_file); - PSI_FILE_CALL(end_file_wait)(locker, result ? strlen(result) : 0); - return result; - } -#endif - - result= fgets(str, size, file->m_file); - return result; -} - -static inline int -inline_mysql_file_fgetc( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_READ); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 1, src_file, src_line); - result= fgetc(file->m_file); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 1); - return result; - } -#endif - - result= fgetc(file->m_file); - return result; -} - -static inline int -inline_mysql_file_fputs( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - const char *str, MYSQL_FILE *file) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - size_t bytes; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_WRITE); - if (likely(locker != NULL)) - { - bytes= str ? strlen(str) : 0; - PSI_FILE_CALL(start_file_wait)(locker, bytes, src_file, src_line); - result= fputs(str, file->m_file); - PSI_FILE_CALL(end_file_wait)(locker, bytes); - return result; - } -#endif - - result= fputs(str, file->m_file); - return result; -} - -static inline int -inline_mysql_file_fputc( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - char c, MYSQL_FILE *file) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_WRITE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 1, src_file, src_line); - result= fputc(c, file->m_file); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 1); - return result; - } -#endif - - result= fputc(c, file->m_file); - return result; -} - -static inline int -inline_mysql_file_fprintf(MYSQL_FILE *file, const char *format, ...) -{ - /* - TODO: figure out how to pass src_file and src_line from the caller. - */ - int result; - va_list args; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_WRITE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, __FILE__, __LINE__); - va_start(args, format); - result= vfprintf(file->m_file, format, args); - va_end(args); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) result); - return result; - } -#endif - - va_start(args, format); - result= vfprintf(file->m_file, format, args); - va_end(args); - return result; -} - -static inline int -inline_mysql_file_vfprintf( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file, const char *format, va_list args) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_WRITE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= vfprintf(file->m_file, format, args); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) result); - return result; - } -#endif - - result= vfprintf(file->m_file, format, args); - return result; -} - -static inline int -inline_mysql_file_fflush( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_FLUSH); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= fflush(file->m_file); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= fflush(file->m_file); - return result; -} - -static inline int inline_mysql_file_feof(MYSQL_FILE *file) -{ - /* Not instrumented, there is no wait involved */ - return feof(file->m_file); -} - -static inline int -inline_mysql_file_fstat( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - int filenr, MY_STAT *stat_area, myf flags) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, filenr, PSI_FILE_FSTAT); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_fstat(filenr, stat_area, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_fstat(filenr, stat_area, flags); - return result; -} - -static inline MY_STAT * -inline_mysql_file_stat( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *path, MY_STAT *stat_area, myf flags) -{ - MY_STAT *result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_STAT, path, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); - result= my_stat(path, stat_area, flags); - PSI_FILE_CALL(end_file_open_wait)(locker, result); - return result; - } -#endif - - result= my_stat(path, stat_area, flags); - return result; -} - -static inline int -inline_mysql_file_chsize( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, my_off_t newlength, int filler, myf flags) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_CHSIZE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) newlength, src_file, - src_line); - result= my_chsize(file, newlength, filler, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) newlength); - return result; - } -#endif - - result= my_chsize(file, newlength, filler, flags); - return result; -} - -static inline MYSQL_FILE* -inline_mysql_file_fopen( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *filename, int flags, myf myFlags) -{ - MYSQL_FILE *that; - that= (MYSQL_FILE*) my_malloc(PSI_NOT_INSTRUMENTED, - sizeof(MYSQL_FILE), MYF(MY_WME)); - if (likely(that != NULL)) - { -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_STREAM_OPEN, filename, that); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_open_wait) - (locker, src_file, src_line); - that->m_file= my_fopen(filename, flags, myFlags); - that->m_psi= PSI_FILE_CALL(end_file_open_wait)(locker, that->m_file); - if (unlikely(that->m_file == NULL)) - { - my_free(that); - return NULL; - } - return that; - } -#endif - - that->m_psi= NULL; - that->m_file= my_fopen(filename, flags, myFlags); - if (unlikely(that->m_file == NULL)) - { - my_free(that); - return NULL; - } - } - return that; -} - -static inline int -inline_mysql_file_fclose( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file, myf flags) -{ - int result= 0; - if (likely(file != NULL)) - { -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_STREAM_CLOSE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); - result= my_fclose(file->m_file, flags); - PSI_FILE_CALL(end_file_close_wait)(locker, result); - my_free(file); - return result; - } -#endif - - result= my_fclose(file->m_file, flags); - my_free(file); - } - return result; -} - -static inline size_t -inline_mysql_file_fread( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file, uchar *buffer, size_t count, myf flags) -{ - size_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - size_t bytes_read; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_READ); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); - result= my_fread(file->m_file, buffer, count, flags); - if (flags & (MY_NABP | MY_FNABP)) - bytes_read= (result == 0) ? count : 0; - else - bytes_read= (result != MY_FILE_ERROR) ? result : 0; - PSI_FILE_CALL(end_file_wait)(locker, bytes_read); - return result; - } -#endif - - result= my_fread(file->m_file, buffer, count, flags); - return result; -} - -static inline size_t -inline_mysql_file_fwrite( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file, const uchar *buffer, size_t count, myf flags) -{ - size_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - size_t bytes_written; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_WRITE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); - result= my_fwrite(file->m_file, buffer, count, flags); - if (flags & (MY_NABP | MY_FNABP)) - bytes_written= (result == 0) ? count : 0; - else - bytes_written= (result != MY_FILE_ERROR) ? result : 0; - PSI_FILE_CALL(end_file_wait)(locker, bytes_written); - return result; - } -#endif - - result= my_fwrite(file->m_file, buffer, count, flags); - return result; -} - -static inline my_off_t -inline_mysql_file_fseek( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file, my_off_t pos, int whence, myf flags) -{ - my_off_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_SEEK); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_fseek(file->m_file, pos, whence, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_fseek(file->m_file, pos, whence, flags); - return result; -} - -static inline my_off_t -inline_mysql_file_ftell( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_FILE *file, myf flags) -{ - my_off_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_stream_locker) - (&state, file->m_psi, PSI_FILE_TELL); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_ftell(file->m_file, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_ftell(file->m_file, flags); - return result; -} - -static inline File -inline_mysql_file_create( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *filename, int create_flags, int access_flags, myf myFlags) -{ - File file; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_CREATE, filename, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); - file= my_create(filename, create_flags, access_flags, myFlags); - PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(locker, file); - return file; - } -#endif - - file= my_create(filename, create_flags, access_flags, myFlags); - return file; -} - -static inline File -inline_mysql_file_create_temp( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - char *to, const char *dir, const char *pfx, int mode, myf myFlags) -{ - File file; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_CREATE, NULL, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); - /* The file name is generated by create_temp_file(). */ - file= create_temp_file(to, dir, pfx, mode, myFlags); - PSI_FILE_CALL(end_temp_file_open_wait_and_bind_to_descriptor)(locker, file, (const char*)to); - return file; - } -#endif - - file= create_temp_file(to, dir, pfx, mode, myFlags); - return file; -} - -static inline File -inline_mysql_file_open( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *filename, int flags, myf myFlags) -{ - File file; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_OPEN, filename, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); - file= my_open(filename, flags, myFlags); - PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(locker, file); - return file; - } -#endif - - file= my_open(filename, flags, myFlags); - return file; -} - -static inline int -inline_mysql_file_close( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, myf flags) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_CLOSE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); - result= my_close(file, flags); - PSI_FILE_CALL(end_file_close_wait)(locker, result); - return result; - } -#endif - - result= my_close(file, flags); - return result; -} - -static inline size_t -inline_mysql_file_read( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, uchar *buffer, size_t count, myf flags) -{ - size_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - size_t bytes_read; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_READ); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); - result= my_read(file, buffer, count, flags); - if (flags & (MY_NABP | MY_FNABP)) - bytes_read= (result == 0) ? count : 0; - else - bytes_read= (result != MY_FILE_ERROR) ? result : 0; - PSI_FILE_CALL(end_file_wait)(locker, bytes_read); - return result; - } -#endif - - result= my_read(file, buffer, count, flags); - return result; -} - -static inline size_t -inline_mysql_file_write( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, const uchar *buffer, size_t count, myf flags) -{ - size_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - size_t bytes_written; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_WRITE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); - result= my_write(file, buffer, count, flags); - if (flags & (MY_NABP | MY_FNABP)) - bytes_written= (result == 0) ? count : 0; - else - bytes_written= (result != MY_FILE_ERROR) ? result : 0; - PSI_FILE_CALL(end_file_wait)(locker, bytes_written); - return result; - } -#endif - - result= my_write(file, buffer, count, flags); - return result; -} - -static inline size_t -inline_mysql_file_pread( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, uchar *buffer, size_t count, my_off_t offset, myf flags) -{ - size_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - size_t bytes_read; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_READ); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); - result= my_pread(file, buffer, count, offset, flags); - if (flags & (MY_NABP | MY_FNABP)) - bytes_read= (result == 0) ? count : 0; - else - bytes_read= (result != MY_FILE_ERROR) ? result : 0; - PSI_FILE_CALL(end_file_wait)(locker, bytes_read); - return result; - } -#endif - - result= my_pread(file, buffer, count, offset, flags); - return result; -} - -static inline size_t -inline_mysql_file_pwrite( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, const uchar *buffer, size_t count, my_off_t offset, myf flags) -{ - size_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - size_t bytes_written; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_WRITE); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, count, src_file, src_line); - result= my_pwrite(file, buffer, count, offset, flags); - if (flags & (MY_NABP | MY_FNABP)) - bytes_written= (result == 0) ? count : 0; - else - bytes_written= (result != MY_FILE_ERROR) ? result : 0; - PSI_FILE_CALL(end_file_wait)(locker, bytes_written); - return result; - } -#endif - - result= my_pwrite(file, buffer, count, offset, flags); - return result; -} - -static inline my_off_t -inline_mysql_file_seek( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, my_off_t pos, int whence, myf flags) -{ - my_off_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_SEEK); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_seek(file, pos, whence, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_seek(file, pos, whence, flags); - return result; -} - -static inline my_off_t -inline_mysql_file_tell( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File file, myf flags) -{ - my_off_t result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, file, PSI_FILE_TELL); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_tell(file, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_tell(file, flags); - return result; -} - -static inline int -inline_mysql_file_delete( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *name, myf flags) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_DELETE, name, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); - result= my_delete(name, flags); - PSI_FILE_CALL(end_file_close_wait)(locker, result); - return result; - } -#endif - - result= my_delete(name, flags); - return result; -} - -static inline int -inline_mysql_file_rename( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *from, const char *to, myf flags) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_RENAME, to, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_rename(from, to, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_rename(from, to, flags); - return result; -} - -static inline File -inline_mysql_file_create_with_symlink( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *linkname, const char *filename, int create_flags, - int access_flags, myf flags) -{ - File file; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_CREATE, filename, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_open_wait)(locker, src_file, src_line); - file= my_create_with_symlink(linkname, filename, create_flags, access_flags, - flags); - PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor)(locker, file); - return file; - } -#endif - - file= my_create_with_symlink(linkname, filename, create_flags, access_flags, - flags); - return file; -} - -static inline int -inline_mysql_file_delete_with_symlink( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *name, myf flags) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_DELETE, name, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line); - result= my_delete_with_symlink(name, flags); - PSI_FILE_CALL(end_file_close_wait)(locker, result); - return result; - } -#endif - - result= my_delete_with_symlink(name, flags); - return result; -} - -static inline int -inline_mysql_file_rename_with_symlink( -#ifdef HAVE_PSI_FILE_INTERFACE - PSI_file_key key, const char *src_file, uint src_line, -#endif - const char *from, const char *to, myf flags) -{ - int result; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_name_locker) - (&state, key, PSI_FILE_RENAME, to, &locker); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_rename_with_symlink(from, to, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_rename_with_symlink(from, to, flags); - return result; -} - -static inline int -inline_mysql_file_sync( -#ifdef HAVE_PSI_FILE_INTERFACE - const char *src_file, uint src_line, -#endif - File fd, myf flags) -{ - int result= 0; -#ifdef HAVE_PSI_FILE_INTERFACE - struct PSI_file_locker *locker; - PSI_file_locker_state state; - locker= PSI_FILE_CALL(get_thread_file_descriptor_locker) - (&state, fd, PSI_FILE_SYNC); - if (likely(locker != NULL)) - { - PSI_FILE_CALL(start_file_wait)(locker, (size_t) 0, src_file, src_line); - result= my_sync(fd, flags); - PSI_FILE_CALL(end_file_wait)(locker, (size_t) 0); - return result; - } -#endif - - result= my_sync(fd, flags); - return result; -} - -/** @} (end of group File_instrumentation) */ - -#endif - diff --git a/mysql/mysql/psi/mysql_memory.h b/mysql/mysql/psi/mysql_memory.h deleted file mode 100644 index 55dd818..0000000 --- a/mysql/mysql/psi/mysql_memory.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2012, 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, - 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ - -#ifndef MYSQL_MEMORY_H -#define MYSQL_MEMORY_H - -/** - @file mysql/psi/mysql_memory.h - Instrumentation helpers for memory allocation. -*/ - -#include "mysql/psi/psi.h" - -#ifndef PSI_MEMORY_CALL -#define PSI_MEMORY_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -/** - @defgroup Memory_instrumentation Memory Instrumentation - @ingroup Instrumentation_interface - @{ -*/ - -/** - @def mysql_memory_register(P1, P2, P3) - Memory registration. -*/ -#define mysql_memory_register(P1, P2, P3) \ - inline_mysql_memory_register(P1, P2, P3) - -static inline void inline_mysql_memory_register( -#ifdef HAVE_PSI_MEMORY_INTERFACE - const char *category, - PSI_memory_info *info, - int count) -#else - const char *category MY_ATTRIBUTE((unused)), - void *info MY_ATTRIBUTE((unused)), - int count MY_ATTRIBUTE((unused))) -#endif -{ -#ifdef HAVE_PSI_MEMORY_INTERFACE - PSI_MEMORY_CALL(register_memory)(category, info, count); -#endif -} - -/** @} (end of group Memory_instrumentation) */ - -#endif - diff --git a/mysql/mysql/psi/mysql_socket.h b/mysql/mysql/psi/mysql_socket.h deleted file mode 100644 index ad76e31..0000000 --- a/mysql/mysql/psi/mysql_socket.h +++ /dev/null @@ -1,1255 +0,0 @@ -/* Copyright (c) 2010, 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 -*/ - -#ifndef MYSQL_SOCKET_H -#define MYSQL_SOCKET_H - -/* For strlen() */ -#include -/* For MY_STAT */ -#include -/* For my_chsize */ -#include -/* For socket api */ -#ifdef _WIN32 - #include - #include - #include - #define SOCKBUF_T char -#else - #include - #define SOCKBUF_T void -#endif -/** - @file mysql/psi/mysql_socket.h -[...] -*/ - -#include "mysql/psi/psi.h" - -#ifndef PSI_SOCKET_CALL -#define PSI_SOCKET_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -/** - @defgroup Socket_instrumentation Socket Instrumentation - @ingroup Instrumentation_interface - @{ -*/ - -/** - @def mysql_socket_register(P1, P2, P3) - Socket registration. -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_register(P1, P2, P3) \ - inline_mysql_socket_register(P1, P2, P3) -#else - #define mysql_socket_register(P1, P2, P3) \ - do {} while (0) -#endif - -/** An instrumented socket. */ -struct st_mysql_socket -{ - /** The real socket descriptor. */ - my_socket fd; - - /** - The instrumentation hook. - Note that this hook is not conditionally defined, - for binary compatibility of the @c MYSQL_SOCKET interface. - */ - struct PSI_socket *m_psi; -}; - -/** - An instrumented socket. - @c MYSQL_SOCKET is a replacement for @c my_socket. -*/ -typedef struct st_mysql_socket MYSQL_SOCKET; - - -/** - @def MYSQL_INVALID_SOCKET - MYSQL_SOCKET initial value. -*/ -//MYSQL_SOCKET MYSQL_INVALID_SOCKET= {INVALID_SOCKET, NULL}; -#define MYSQL_INVALID_SOCKET mysql_socket_invalid() - -/** - MYSQL_SOCKET helper. Initialize instrumented socket. - @sa mysql_socket_getfd - @sa mysql_socket_setfd -*/ -static inline MYSQL_SOCKET -mysql_socket_invalid() -{ - MYSQL_SOCKET mysql_socket= {INVALID_SOCKET, NULL}; - return mysql_socket; -} - -/** - Set socket descriptor and address. - @param socket nstrumented socket - @param addr unformatted socket address - @param addr_len length of socket addres -*/ - -static inline void -mysql_socket_set_address( -#ifdef HAVE_PSI_SOCKET_INTERFACE - MYSQL_SOCKET socket, - const struct sockaddr *addr, - socklen_t addr_len -#else - MYSQL_SOCKET socket MY_ATTRIBUTE ((unused)), - const struct sockaddr *addr MY_ATTRIBUTE ((unused)), - socklen_t addr_len MY_ATTRIBUTE ((unused)) -#endif -) -{ -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (socket.m_psi != NULL) - PSI_SOCKET_CALL(set_socket_info)(socket.m_psi, NULL, addr, addr_len); -#endif -} - -/** - Set socket descriptor and address. - @param socket instrumented socket -*/ -static inline void -mysql_socket_set_thread_owner( -#ifdef HAVE_PSI_SOCKET_INTERFACE -MYSQL_SOCKET socket -#else -MYSQL_SOCKET socket MY_ATTRIBUTE ((unused)) -#endif -) -{ -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (socket.m_psi != NULL) - PSI_SOCKET_CALL(set_socket_thread_owner)(socket.m_psi); -#endif -} - -/** - MYSQL_SOCKET helper. Get socket descriptor. - @param mysql_socket Instrumented socket - @sa mysql_socket_setfd -*/ -static inline my_socket -mysql_socket_getfd(MYSQL_SOCKET mysql_socket) -{ - return mysql_socket.fd; -} - -/** - MYSQL_SOCKET helper. Set socket descriptor. - @param mysql_socket Instrumented socket - @param fd Socket descriptor - @sa mysql_socket_getfd -*/ -static inline void -mysql_socket_setfd(MYSQL_SOCKET *mysql_socket, my_socket fd) -{ - if (likely(mysql_socket != NULL)) - mysql_socket->fd= fd; -} - -/** - @def MYSQL_SOCKET_WAIT_VARIABLES - Instrumentation helper for socket waits. - This instrumentation declares local variables. - Do not use a ';' after this macro - @param LOCKER locker - @param STATE locker state - @sa MYSQL_START_SOCKET_WAIT. - @sa MYSQL_END_SOCKET_WAIT. -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE) \ - struct PSI_socket_locker* LOCKER; \ - PSI_socket_locker_state STATE; -#else - #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE) -#endif - -/** - @def MYSQL_START_SOCKET_WAIT - Instrumentation helper for socket waits. - This instrumentation marks the start of a wait event. - @param LOCKER locker - @param STATE locker state - @param SOCKET instrumented socket - @param OP The socket operation to be performed - @param COUNT bytes to be written/read - @sa MYSQL_END_SOCKET_WAIT. -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define MYSQL_START_SOCKET_WAIT(LOCKER, STATE, SOCKET, OP, COUNT) \ - LOCKER= inline_mysql_start_socket_wait(STATE, SOCKET, OP, COUNT,\ - __FILE__, __LINE__) -#else - #define MYSQL_START_SOCKET_WAIT(LOCKER, STATE, SOCKET, OP, COUNT) \ - do {} while (0) -#endif - -/** - @def MYSQL_END_SOCKET_WAIT - Instrumentation helper for socket waits. - This instrumentation marks the end of a wait event. - @param LOCKER locker - @param COUNT actual bytes written/read, or -1 - @sa MYSQL_START_SOCKET_WAIT. -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define MYSQL_END_SOCKET_WAIT(LOCKER, COUNT) \ - inline_mysql_end_socket_wait(LOCKER, COUNT) -#else - #define MYSQL_END_SOCKET_WAIT(LOCKER, COUNT) \ - do {} while (0) -#endif - -/** - @def MYSQL_SOCKET_SET_STATE - Set the state (IDLE, ACTIVE) of an instrumented socket. - @param SOCKET the instrumented socket - @param STATE the new state - @sa PSI_socket_state -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define MYSQL_SOCKET_SET_STATE(SOCKET, STATE) \ - inline_mysql_socket_set_state(SOCKET, STATE) -#else - #define MYSQL_SOCKET_SET_STATE(SOCKET, STATE) \ - do {} while (0) -#endif - -#ifdef HAVE_PSI_SOCKET_INTERFACE -/** - Instrumentation calls for MYSQL_START_SOCKET_WAIT. - @sa MYSQL_START_SOCKET_WAIT. -*/ -static inline struct PSI_socket_locker* -inline_mysql_start_socket_wait(PSI_socket_locker_state *state, - MYSQL_SOCKET mysql_socket, - enum PSI_socket_operation op, - size_t byte_count, - const char *src_file, int src_line) -{ - struct PSI_socket_locker *locker; - if (mysql_socket.m_psi != NULL) - { - locker= PSI_SOCKET_CALL(start_socket_wait) - (state, mysql_socket.m_psi, op, byte_count, src_file, src_line); - } - else - locker= NULL; - return locker; -} - -/** - Instrumentation calls for MYSQL_END_SOCKET_WAIT. - @sa MYSQL_END_SOCKET_WAIT. -*/ -static inline void -inline_mysql_end_socket_wait(struct PSI_socket_locker *locker, size_t byte_count) -{ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, byte_count); -} - -/** - Set the state (IDLE, ACTIVE) of an instrumented socket. - @param socket the instrumented socket - @param state the new state - @sa PSI_socket_state -*/ -static inline void -inline_mysql_socket_set_state(MYSQL_SOCKET socket, enum PSI_socket_state state) -{ - if (socket.m_psi != NULL) - PSI_SOCKET_CALL(set_socket_state)(socket.m_psi, state); -} -#endif /* HAVE_PSI_SOCKET_INTERFACE */ - -/** - @def mysql_socket_socket(K, D, T, P) - Create a socket. - @c mysql_socket_socket is a replacement for @c socket. - @param K PSI_socket_key for this instrumented socket - @param D Socket domain - @param T Protocol type - @param P Transport protocol -*/ - -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_socket(K, D, T, P) \ - inline_mysql_socket_socket(K, D, T, P) -#else - #define mysql_socket_socket(K, D, T, P) \ - inline_mysql_socket_socket(D, T, P) -#endif - -/** - @def mysql_socket_bind(FD, AP, L) - Bind a socket to a local port number and IP address - @c mysql_socket_bind is a replacement for @c bind. - @param FD Instrumented socket descriptor returned by socket() - @param AP Pointer to local port number and IP address in sockaddr structure - @param L Length of sockaddr structure -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_bind(FD, AP, L) \ - inline_mysql_socket_bind(__FILE__, __LINE__, FD, AP, L) -#else - #define mysql_socket_bind(FD, AP, L) \ - inline_mysql_socket_bind(FD, AP, L) -#endif - -/** - @def mysql_socket_getsockname(FD, AP, LP) - Return port number and IP address of the local host - @c mysql_socket_getsockname is a replacement for @c getsockname. - @param FD Instrumented socket descriptor returned by socket() - @param AP Pointer to returned address of local host in @c sockaddr structure - @param LP Pointer to length of @c sockaddr structure -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_getsockname(FD, AP, LP) \ - inline_mysql_socket_getsockname(__FILE__, __LINE__, FD, AP, LP) -#else - #define mysql_socket_getsockname(FD, AP, LP) \ - inline_mysql_socket_getsockname(FD, AP, LP) -#endif - -/** - @def mysql_socket_connect(FD, AP, L) - Establish a connection to a remote host. - @c mysql_socket_connect is a replacement for @c connect. - @param FD Instrumented socket descriptor returned by socket() - @param AP Pointer to target address in sockaddr structure - @param L Length of sockaddr structure -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_connect(FD, AP, L) \ - inline_mysql_socket_connect(__FILE__, __LINE__, FD, AP, L) -#else - #define mysql_socket_connect(FD, AP, L) \ - inline_mysql_socket_connect(FD, AP, L) -#endif - -/** - @def mysql_socket_getpeername(FD, AP, LP) - Get port number and IP address of remote host that a socket is connected to. - @c mysql_socket_getpeername is a replacement for @c getpeername. - @param FD Instrumented socket descriptor returned by socket() or accept() - @param AP Pointer to returned address of remote host in sockaddr structure - @param LP Pointer to length of sockaddr structure -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_getpeername(FD, AP, LP) \ - inline_mysql_socket_getpeername(__FILE__, __LINE__, FD, AP, LP) -#else - #define mysql_socket_getpeername(FD, AP, LP) \ - inline_mysql_socket_getpeername(FD, AP, LP) -#endif - -/** - @def mysql_socket_send(FD, B, N, FL) - Send data from the buffer, B, to a connected socket. - @c mysql_socket_send is a replacement for @c send. - @param FD Instrumented socket descriptor returned by socket() or accept() - @param B Buffer to send - @param N Number of bytes to send - @param FL Control flags -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_send(FD, B, N, FL) \ - inline_mysql_socket_send(__FILE__, __LINE__, FD, B, N, FL) -#else - #define mysql_socket_send(FD, B, N, FL) \ - inline_mysql_socket_send(FD, B, N, FL) -#endif - -/** - @def mysql_socket_recv(FD, B, N, FL) - Receive data from a connected socket. - @c mysql_socket_recv is a replacement for @c recv. - @param FD Instrumented socket descriptor returned by socket() or accept() - @param B Buffer to receive to - @param N Maximum bytes to receive - @param FL Control flags -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_recv(FD, B, N, FL) \ - inline_mysql_socket_recv(__FILE__, __LINE__, FD, B, N, FL) -#else - #define mysql_socket_recv(FD, B, N, FL) \ - inline_mysql_socket_recv(FD, B, N, FL) -#endif - -/** - @def mysql_socket_sendto(FD, B, N, FL, AP, L) - Send data to a socket at the specified address. - @c mysql_socket_sendto is a replacement for @c sendto. - @param FD Instrumented socket descriptor returned by socket() - @param B Buffer to send - @param N Number of bytes to send - @param FL Control flags - @param AP Pointer to destination sockaddr structure - @param L Size of sockaddr structure -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_sendto(FD, B, N, FL, AP, L) \ - inline_mysql_socket_sendto(__FILE__, __LINE__, FD, B, N, FL, AP, L) -#else - #define mysql_socket_sendto(FD, B, N, FL, AP, L) \ - inline_mysql_socket_sendto(FD, B, N, FL, AP, L) -#endif - -/** - @def mysql_socket_recvfrom(FD, B, N, FL, AP, L) - Receive data from a socket and return source address information - @c mysql_socket_recvfrom is a replacement for @c recvfrom. - @param FD Instrumented socket descriptor returned by socket() - @param B Buffer to receive to - @param N Maximum bytes to receive - @param FL Control flags - @param AP Pointer to source address in sockaddr_storage structure - @param LP Size of sockaddr_storage structure -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_recvfrom(FD, B, N, FL, AP, LP) \ - inline_mysql_socket_recvfrom(__FILE__, __LINE__, FD, B, N, FL, AP, LP) -#else - #define mysql_socket_recvfrom(FD, B, N, FL, AP, LP) \ - inline_mysql_socket_recvfrom(FD, B, N, FL, AP, LP) -#endif - -/** - @def mysql_socket_getsockopt(FD, LV, ON, OP, OL) - Get a socket option for the specified socket. - @c mysql_socket_getsockopt is a replacement for @c getsockopt. - @param FD Instrumented socket descriptor returned by socket() - @param LV Protocol level - @param ON Option to query - @param OP Buffer which will contain the value for the requested option - @param OL Pointer to length of OP -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \ - inline_mysql_socket_getsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL) -#else - #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \ - inline_mysql_socket_getsockopt(FD, LV, ON, OP, OL) -#endif - -/** - @def mysql_socket_setsockopt(FD, LV, ON, OP, OL) - Set a socket option for the specified socket. - @c mysql_socket_setsockopt is a replacement for @c setsockopt. - @param FD Instrumented socket descriptor returned by socket() - @param LV Protocol level - @param ON Option to modify - @param OP Buffer containing the value for the specified option - @param OL Pointer to length of OP -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \ - inline_mysql_socket_setsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL) -#else - #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \ - inline_mysql_socket_setsockopt(FD, LV, ON, OP, OL) -#endif - -/** - @def mysql_sock_set_nonblocking - Set socket to non-blocking. - @param FD instrumented socket descriptor -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_sock_set_nonblocking(FD) \ - inline_mysql_sock_set_nonblocking(__FILE__, __LINE__, FD) -#else - #define mysql_sock_set_nonblocking(FD) \ - inline_mysql_sock_set_nonblocking(FD) -#endif - -/** - @def mysql_socket_listen(FD, N) - Set socket state to listen for an incoming connection. - @c mysql_socket_listen is a replacement for @c listen. - @param FD Instrumented socket descriptor, bound and connected - @param N Maximum number of pending connections allowed. -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_listen(FD, N) \ - inline_mysql_socket_listen(__FILE__, __LINE__, FD, N) -#else - #define mysql_socket_listen(FD, N) \ - inline_mysql_socket_listen(FD, N) -#endif - -/** - @def mysql_socket_accept(K, FD, AP, LP) - Accept a connection from any remote host; TCP only. - @c mysql_socket_accept is a replacement for @c accept. - @param K PSI_socket_key for this instrumented socket - @param FD Instrumented socket descriptor, bound and placed in a listen state - @param AP Pointer to sockaddr structure with returned IP address and port of connected host - @param LP Pointer to length of valid information in AP -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_accept(K, FD, AP, LP) \ - inline_mysql_socket_accept(__FILE__, __LINE__, K, FD, AP, LP) -#else - #define mysql_socket_accept(K, FD, AP, LP) \ - inline_mysql_socket_accept(FD, AP, LP) -#endif - -/** - @def mysql_socket_close(FD) - Close a socket and sever any connections. - @c mysql_socket_close is a replacement for @c close. - @param FD Instrumented socket descriptor returned by socket() or accept() -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_close(FD) \ - inline_mysql_socket_close(__FILE__, __LINE__, FD) -#else - #define mysql_socket_close(FD) \ - inline_mysql_socket_close(FD) -#endif - -/** - @def mysql_socket_shutdown(FD, H) - Disable receives and/or sends on a socket. - @c mysql_socket_shutdown is a replacement for @c shutdown. - @param FD Instrumented socket descriptor returned by socket() or accept() - @param H Specifies which operations to shutdown -*/ -#ifdef HAVE_PSI_SOCKET_INTERFACE - #define mysql_socket_shutdown(FD, H) \ - inline_mysql_socket_shutdown(__FILE__, __LINE__, FD, H) -#else - #define mysql_socket_shutdown(FD, H) \ - inline_mysql_socket_shutdown(FD, H) -#endif - -#ifdef HAVE_PSI_SOCKET_INTERFACE -static inline void inline_mysql_socket_register( - const char *category, - PSI_socket_info *info, - int count) -{ - PSI_SOCKET_CALL(register_socket)(category, info, count); -} -#endif - -/** mysql_socket_socket */ - -static inline MYSQL_SOCKET -inline_mysql_socket_socket -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - PSI_socket_key key, -#endif - int domain, int type, int protocol) -{ - MYSQL_SOCKET mysql_socket= MYSQL_INVALID_SOCKET; - mysql_socket.fd= socket(domain, type, protocol); - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (likely(mysql_socket.fd != INVALID_SOCKET)) - { - mysql_socket.m_psi= PSI_SOCKET_CALL(init_socket) - (key, (const my_socket*)&mysql_socket.fd, NULL, 0); - } -#endif - return mysql_socket; -} - -/** mysql_socket_bind */ - -static inline int -inline_mysql_socket_bind -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, const struct sockaddr *addr, socklen_t len) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker_state state; - PSI_socket_locker *locker; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= bind(mysql_socket.fd, addr, len); - - /* Instrumentation end */ - if (result == 0) - PSI_SOCKET_CALL(set_socket_info)(mysql_socket.m_psi, NULL, addr, len); - - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= bind(mysql_socket.fd, addr, len); - return result; -} - -/** mysql_socket_getsockname */ - -static inline int -inline_mysql_socket_getsockname -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, struct sockaddr *addr, socklen_t *len) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= getsockname(mysql_socket.fd, addr, len); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= getsockname(mysql_socket.fd, addr, len); - - return result; -} - -/** mysql_socket_connect */ - -static inline int -inline_mysql_socket_connect -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, const struct sockaddr *addr, socklen_t len) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= connect(mysql_socket.fd, addr, len); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= connect(mysql_socket.fd, addr, len); - - return result; -} - -/** mysql_socket_getpeername */ - -static inline int -inline_mysql_socket_getpeername -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, struct sockaddr *addr, socklen_t *len) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= getpeername(mysql_socket.fd, addr, len); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= getpeername(mysql_socket.fd, addr, len); - - return result; -} - -/** mysql_socket_send */ - -static inline ssize_t -inline_mysql_socket_send -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, const SOCKBUF_T *buf, size_t n, int flags) -{ - ssize_t result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_SEND, n, src_file, src_line); - - /* Instrumented code */ - result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags); - - /* Instrumentation end */ - if (locker != NULL) - { - size_t bytes_written; - bytes_written= (result > -1) ? result : 0; - PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_written); - } - - return result; - } -#endif - - /* Non instrumented code */ - result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags); - - return result; -} - -/** mysql_socket_recv */ - -static inline ssize_t -inline_mysql_socket_recv -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, SOCKBUF_T *buf, size_t n, int flags) -{ - ssize_t result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_RECV, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= recv(mysql_socket.fd, buf, IF_WIN((int),) n, flags); - - /* Instrumentation end */ - if (locker != NULL) - { - size_t bytes_read; - bytes_read= (result > -1) ? result : 0; - PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_read); - } - - return result; - } -#endif - - /* Non instrumented code */ - result= recv(mysql_socket.fd, buf, IF_WIN((int),) n, flags); - - return result; -} - -/** mysql_socket_sendto */ - -static inline ssize_t -inline_mysql_socket_sendto -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, const SOCKBUF_T *buf, size_t n, int flags, const struct sockaddr *addr, socklen_t addr_len) -{ - ssize_t result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_SEND, n, src_file, src_line); - - /* Instrumented code */ - result= sendto(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); - - /* Instrumentation end */ - if (locker != NULL) - { - size_t bytes_written; - bytes_written = (result > -1) ? result : 0; - PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_written); - } - - return result; - } -#endif - - /* Non instrumented code */ - result= sendto(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); - - return result; -} - -/** mysql_socket_recvfrom */ - -static inline ssize_t -inline_mysql_socket_recvfrom -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, SOCKBUF_T *buf, size_t n, int flags, - struct sockaddr *addr, socklen_t *addr_len) -{ - ssize_t result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_RECV, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= recvfrom(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); - - /* Instrumentation end */ - if (locker != NULL) - { - size_t bytes_read; - bytes_read = (result > -1) ? result : 0; - PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_read); - } - - return result; - } -#endif - - /* Non instrumented code */ - result= recvfrom(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len); - - return result; -} - -/** mysql_socket_getsockopt */ - -static inline int -inline_mysql_socket_getsockopt -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, int level, int optname, SOCKBUF_T *optval, socklen_t *optlen) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= getsockopt(mysql_socket.fd, level, optname, optval, optlen); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= getsockopt(mysql_socket.fd, level, optname, optval, optlen); - - return result; -} - -/** mysql_socket_setsockopt */ - -static inline int -inline_mysql_socket_setsockopt -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, int level, int optname, const SOCKBUF_T *optval, - socklen_t optlen) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= setsockopt(mysql_socket.fd, level, optname, optval, optlen); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= setsockopt(mysql_socket.fd, level, optname, optval, optlen); - - return result; -} - -/** set_socket_nonblock */ -static inline int -set_socket_nonblock(my_socket fd) -{ - int ret= 0; -#ifdef _WIN32 - { - u_long nonblocking= 1; - ret= ioctlsocket(fd, FIONBIO, &nonblocking); - } -#else - { - int fd_flags; - fd_flags= fcntl(fd, F_GETFL, 0); - if (fd_flags < 0) - return errno; -#if defined(O_NONBLOCK) - fd_flags |= O_NONBLOCK; -#elif defined(O_NDELAY) - fd_flags |= O_NDELAY; -#elif defined(O_FNDELAY) - fd_flags |= O_FNDELAY; -#else -#error "No definition of non-blocking flag found." -#endif /* O_NONBLOCK */ - if (fcntl(fd, F_SETFL, fd_flags) == -1) - ret= errno; - } -#endif /* _WIN32 */ - return ret; -} - -/** mysql_socket_set_nonblocking */ - -static inline int -inline_mysql_sock_set_nonblocking -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket -) -{ - int result= 0; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, - (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= set_socket_nonblock(mysql_socket.fd); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= set_socket_nonblock(mysql_socket.fd); - - return result; -} - -/** mysql_socket_listen */ - -static inline int -inline_mysql_socket_listen -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, int backlog) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= listen(mysql_socket.fd, backlog); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ - result= listen(mysql_socket.fd, backlog); - - return result; -} - -/** mysql_socket_accept */ - -static inline MYSQL_SOCKET -inline_mysql_socket_accept -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, PSI_socket_key key, -#endif - MYSQL_SOCKET socket_listen, struct sockaddr *addr, socklen_t *addr_len) -{ - MYSQL_SOCKET socket_accept= MYSQL_INVALID_SOCKET; - socklen_t addr_length= (addr_len != NULL) ? *addr_len : 0; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (socket_listen.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, socket_listen.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line); - - /* Instrumented code */ - socket_accept.fd= accept(socket_listen.fd, addr, &addr_length); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - } - else -#endif - { - /* Non instrumented code */ - socket_accept.fd= accept(socket_listen.fd, addr, &addr_length); - } - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (likely(socket_accept.fd != INVALID_SOCKET)) - { - /* Initialize the instrument with the new socket descriptor and address */ - socket_accept.m_psi= PSI_SOCKET_CALL(init_socket) - (key, (const my_socket*)&socket_accept.fd, addr, addr_length); - } -#endif - - return socket_accept; -} - -/** mysql_socket_close */ - -static inline int -inline_mysql_socket_close -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket) -{ - int result; - -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - /* Instrumentation start */ - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_CLOSE, (size_t)0, src_file, src_line); - - /* Instrumented code */ - result= closesocket(mysql_socket.fd); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - /* Remove the instrumentation for this socket. */ - if (mysql_socket.m_psi != NULL) - PSI_SOCKET_CALL(destroy_socket)(mysql_socket.m_psi); - - return result; - } -#endif - - /* Non instrumented code */ - result= closesocket(mysql_socket.fd); - - return result; -} - -/** mysql_socket_shutdown */ - -static inline int -inline_mysql_socket_shutdown -( -#ifdef HAVE_PSI_SOCKET_INTERFACE - const char *src_file, uint src_line, -#endif - MYSQL_SOCKET mysql_socket, int how) -{ - int result; - -#ifdef _WIN32 - static LPFN_DISCONNECTEX DisconnectEx = NULL; - if (DisconnectEx == NULL) - { - DWORD dwBytesReturned; - GUID guidDisconnectEx = WSAID_DISCONNECTEX; - WSAIoctl(mysql_socket.fd, SIO_GET_EXTENSION_FUNCTION_POINTER, - &guidDisconnectEx, sizeof(GUID), - &DisconnectEx, sizeof(DisconnectEx), - &dwBytesReturned, NULL, NULL); - } -#endif - -/* Instrumentation start */ -#ifdef HAVE_PSI_SOCKET_INTERFACE - if (mysql_socket.m_psi != NULL) - { - PSI_socket_locker *locker; - PSI_socket_locker_state state; - locker= PSI_SOCKET_CALL(start_socket_wait) - (&state, mysql_socket.m_psi, PSI_SOCKET_SHUTDOWN, (size_t)0, src_file, src_line); - - /* Instrumented code */ -#ifdef _WIN32 - if (DisconnectEx) - result= (DisconnectEx(mysql_socket.fd, (LPOVERLAPPED) NULL, - (DWORD) 0, (DWORD) 0) == TRUE) ? 0 : -1; - else -#endif - result= shutdown(mysql_socket.fd, how); - - /* Instrumentation end */ - if (locker != NULL) - PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0); - - return result; - } -#endif - - /* Non instrumented code */ -#ifdef _WIN32 - if (DisconnectEx) - result= (DisconnectEx(mysql_socket.fd, (LPOVERLAPPED) NULL, - (DWORD) 0, (DWORD) 0) == TRUE) ? 0 : -1; - else -#endif - result= shutdown(mysql_socket.fd, how); - - return result; -} - -/** @} (end of group Socket_instrumentation) */ - -#endif - diff --git a/mysql/mysql/psi/mysql_stage.h b/mysql/mysql/psi/mysql_stage.h deleted file mode 100644 index 9c1623f..0000000 --- a/mysql/mysql/psi/mysql_stage.h +++ /dev/null @@ -1,198 +0,0 @@ -/* Copyright (c) 2010, 2014, 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 */ - -#ifndef MYSQL_STAGE_H -#define MYSQL_STAGE_H - -/** - @file mysql/psi/mysql_stage.h - Instrumentation helpers for stages. -*/ - -#include "mysql/psi/psi.h" - -#ifndef PSI_STAGE_CALL -#define PSI_STAGE_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -/** - @defgroup Stage_instrumentation Stage Instrumentation - @ingroup Instrumentation_interface - @{ -*/ - -/** - @def mysql_stage_register(P1, P2, P3) - Stage registration. -*/ -#ifdef HAVE_PSI_STAGE_INTERFACE -#define mysql_stage_register(P1, P2, P3) \ - inline_mysql_stage_register(P1, P2, P3) -#else -#define mysql_stage_register(P1, P2, P3) \ - do {} while (0) -#endif - -/** - @def MYSQL_SET_STAGE - Set the current stage. - Use this API when the file and line - is passed from the caller. - @param K the stage key - @param F the source file name - @param L the source file line - @return the current stage progress -*/ -#ifdef HAVE_PSI_STAGE_INTERFACE - #define MYSQL_SET_STAGE(K, F, L) \ - inline_mysql_set_stage(K, F, L) -#else - #define MYSQL_SET_STAGE(K, F, L) \ - NULL -#endif - -/** - @def mysql_set_stage - Set the current stage. - @param K the stage key - @return the current stage progress -*/ -#ifdef HAVE_PSI_STAGE_INTERFACE - #define mysql_set_stage(K) \ - inline_mysql_set_stage(K, __FILE__, __LINE__) -#else - #define mysql_set_stage(K) \ - NULL -#endif - -/** - @def mysql_end_stage - End the last stage -*/ -#ifdef HAVE_PSI_STAGE_INTERFACE - #define mysql_end_stage \ - inline_mysql_end_stage -#else - #define mysql_end_stage \ - do {} while (0) -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -static inline void inline_mysql_stage_register( - const char *category, PSI_stage_info **info, int count) -{ - PSI_STAGE_CALL(register_stage)(category, info, count); -} -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -static inline PSI_stage_progress* -inline_mysql_set_stage(PSI_stage_key key, - const char *src_file, int src_line) -{ - return PSI_STAGE_CALL(start_stage)(key, src_file, src_line); -} -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -static inline void -inline_mysql_end_stage() -{ - PSI_STAGE_CALL(end_stage)(); -} -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -#define mysql_stage_set_work_completed(P1, P2) \ - inline_mysql_stage_set_work_completed(P1, P2) - -#define mysql_stage_get_work_completed(P1) \ - inline_mysql_stage_get_work_completed(P1) -#else -#define mysql_stage_set_work_completed(P1, P2) \ - do {} while (0) - -#define mysql_stage_get_work_completed(P1) \ - do {} while (0) -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -#define mysql_stage_inc_work_completed(P1, P2) \ - inline_mysql_stage_inc_work_completed(P1, P2) -#else -#define mysql_stage_inc_work_completed(P1, P2) \ - do {} while (0) -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -#define mysql_stage_set_work_estimated(P1, P2) \ - inline_mysql_stage_set_work_estimated(P1, P2) - -#define mysql_stage_get_work_estimated(P1) \ - inline_mysql_stage_get_work_estimated(P1) -#else -#define mysql_stage_set_work_estimated(P1, P2) \ - do {} while (0) - -#define mysql_stage_get_work_estimated(P1) \ - do {} while (0) -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -static inline void -inline_mysql_stage_set_work_completed(PSI_stage_progress *progress, - ulonglong val) -{ - if (progress != NULL) - progress->m_work_completed= val; -} - -static inline ulonglong -inline_mysql_stage_get_work_completed(PSI_stage_progress *progress) -{ - return progress->m_work_completed; -} -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -static inline void -inline_mysql_stage_inc_work_completed(PSI_stage_progress *progress, - ulonglong val) -{ - if (progress != NULL) - progress->m_work_completed+= val; -} -#endif - -#ifdef HAVE_PSI_STAGE_INTERFACE -static inline void -inline_mysql_stage_set_work_estimated(PSI_stage_progress *progress, - ulonglong val) -{ - if (progress != NULL) - progress->m_work_estimated= val; -} - -static inline ulonglong -inline_mysql_stage_get_work_estimated(PSI_stage_progress *progress) -{ - return progress->m_work_estimated; -} -#endif - -/** @} (end of group Stage_instrumentation) */ - -#endif - diff --git a/mysql/mysql/psi/mysql_table.h b/mysql/mysql/psi/mysql_table.h deleted file mode 100644 index 00f7566..0000000 --- a/mysql/mysql/psi/mysql_table.h +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (c) 2010, 2014, 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, - 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ - -#ifndef MYSQL_TABLE_H -#define MYSQL_TABLE_H - -/** - @file mysql/psi/mysql_table.h - Instrumentation helpers for table io. -*/ - -#include "mysql/psi/psi.h" - -#ifndef PSI_TABLE_CALL -#define PSI_TABLE_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -/** - @defgroup Table_instrumentation Table Instrumentation - @ingroup Instrumentation_interface - @{ -*/ - -/** - @def MYSQL_TABLE_WAIT_VARIABLES - Instrumentation helper for table waits. - This instrumentation declares local variables. - Do not use a ';' after this macro - @param LOCKER the locker - @param STATE the locker state - @sa MYSQL_START_TABLE_IO_WAIT. - @sa MYSQL_END_TABLE_IO_WAIT. - @sa MYSQL_START_TABLE_LOCK_WAIT. - @sa MYSQL_END_TABLE_LOCK_WAIT. -*/ -#ifdef HAVE_PSI_TABLE_INTERFACE - #define MYSQL_TABLE_WAIT_VARIABLES(LOCKER, STATE) \ - struct PSI_table_locker* LOCKER; \ - PSI_table_locker_state STATE; -#else - #define MYSQL_TABLE_WAIT_VARIABLES(LOCKER, STATE) -#endif - -/** - @def MYSQL_START_TABLE_LOCK_WAIT - Instrumentation helper for table lock waits. - This instrumentation marks the start of a wait event. - @param LOCKER the locker - @param STATE the locker state - @param PSI the instrumented table - @param OP the table operation to be performed - @param FLAGS per table operation flags. - @sa MYSQL_END_TABLE_LOCK_WAIT. -*/ -#ifdef HAVE_PSI_TABLE_INTERFACE - #define MYSQL_START_TABLE_LOCK_WAIT(LOCKER, STATE, PSI, OP, FLAGS) \ - LOCKER= inline_mysql_start_table_lock_wait(STATE, PSI, \ - OP, FLAGS, __FILE__, __LINE__) -#else - #define MYSQL_START_TABLE_LOCK_WAIT(LOCKER, STATE, PSI, OP, FLAGS) \ - do {} while (0) -#endif - -/** - @def MYSQL_END_TABLE_LOCK_WAIT - Instrumentation helper for table lock waits. - This instrumentation marks the end of a wait event. - @param LOCKER the locker - @sa MYSQL_START_TABLE_LOCK_WAIT. -*/ -#ifdef HAVE_PSI_TABLE_INTERFACE - #define MYSQL_END_TABLE_LOCK_WAIT(LOCKER) \ - inline_mysql_end_table_lock_wait(LOCKER) -#else - #define MYSQL_END_TABLE_LOCK_WAIT(LOCKER) \ - do {} while (0) -#endif - -#ifdef HAVE_PSI_TABLE_INTERFACE - #define MYSQL_UNLOCK_TABLE(T) \ - inline_mysql_unlock_table(T) -#else - #define MYSQL_UNLOCK_TABLE(T) \ - do {} while (0) -#endif - -#ifdef HAVE_PSI_TABLE_INTERFACE -/** - Instrumentation calls for MYSQL_START_TABLE_LOCK_WAIT. - @sa MYSQL_END_TABLE_LOCK_WAIT. -*/ -static inline struct PSI_table_locker * -inline_mysql_start_table_lock_wait(PSI_table_locker_state *state, - struct PSI_table *psi, - enum PSI_table_lock_operation op, - ulong flags, const char *src_file, int src_line) -{ - if (psi != NULL) - { - struct PSI_table_locker *locker; - locker= PSI_TABLE_CALL(start_table_lock_wait) - (state, psi, op, flags, src_file, src_line); - return locker; - } - return NULL; -} - -/** - Instrumentation calls for MYSQL_END_TABLE_LOCK_WAIT. - @sa MYSQL_START_TABLE_LOCK_WAIT. -*/ -static inline void -inline_mysql_end_table_lock_wait(struct PSI_table_locker *locker) -{ - if (locker != NULL) - PSI_TABLE_CALL(end_table_lock_wait)(locker); -} - -static inline void -inline_mysql_unlock_table(struct PSI_table *table) -{ - if (table != NULL) - PSI_TABLE_CALL(unlock_table)(table); -} -#endif - -/** @} (end of group Table_instrumentation) */ - -#endif - diff --git a/mysql/mysql/psi/mysql_thread.h b/mysql/mysql/psi/mysql_thread.h deleted file mode 100644 index c5ace99..0000000 --- a/mysql/mysql/psi/mysql_thread.h +++ /dev/null @@ -1,1323 +0,0 @@ -/* Copyright (c) 2008, 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, - 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ - -#ifndef MYSQL_THREAD_H -#define MYSQL_THREAD_H - -/** - @file mysql/psi/mysql_thread.h - Instrumentation helpers for mysys threads, mutexes, - read write locks and conditions. - This header file provides the necessary declarations - to use the mysys thread API with the performance schema instrumentation. - In some compilers (SunStudio), 'static inline' functions, when declared - but not used, are not optimized away (because they are unused) by default, - so that including a static inline function from a header file does - create unwanted dependencies, causing unresolved symbols at link time. - Other compilers, like gcc, optimize these dependencies by default. - - Since the instrumented APIs declared here are wrapper on top - of my_thread / safemutex / etc APIs, - including mysql/psi/mysql_thread.h assumes that - the dependency on my_thread and safemutex already exists. -*/ -/* - Note: there are several orthogonal dimensions here. - - Dimension 1: Instrumentation - HAVE_PSI_INTERFACE is defined when the instrumentation is compiled in. - This may happen both in debug or production builds. - - Dimension 2: Debug - SAFE_MUTEX is defined when debug is compiled in. - This may happen both with and without instrumentation. - - Dimension 3: Platform - Mutexes are implemented with one of: - - the pthread library - - fast mutexes - - window apis - This is implemented by various macro definitions in my_thread.h - - This causes complexity with '#ifdef'-ery that can't be avoided. -*/ - -#include "my_thread.h" -#include "my_thread_local.h" -#include "thr_mutex.h" -#include "thr_rwlock.h" -#include "mysql/psi/psi.h" -#ifdef MYSQL_SERVER -#ifndef MYSQL_DYNAMIC_PLUGIN -#include "pfs_thread_provider.h" -#endif -#endif - -#ifndef PSI_MUTEX_CALL -#define PSI_MUTEX_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -#ifndef PSI_RWLOCK_CALL -#define PSI_RWLOCK_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -#ifndef PSI_COND_CALL -#define PSI_COND_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -#ifndef PSI_THREAD_CALL -#define PSI_THREAD_CALL(M) PSI_DYNAMIC_CALL(M) -#endif - -/** - @defgroup Thread_instrumentation Thread Instrumentation - @ingroup Instrumentation_interface - @{ -*/ - -/** - An instrumented mutex structure. - @sa mysql_mutex_t -*/ -struct st_mysql_mutex -{ - /** The real mutex. */ - my_mutex_t m_mutex; - /** - The instrumentation hook. - Note that this hook is not conditionally defined, - for binary compatibility of the @c mysql_mutex_t interface. - */ - struct PSI_mutex *m_psi; -}; - -/** - Type of an instrumented mutex. - @c mysql_mutex_t is a drop-in replacement for @c my_mutex_t. - @sa mysql_mutex_assert_owner - @sa mysql_mutex_assert_not_owner - @sa mysql_mutex_init - @sa mysql_mutex_lock - @sa mysql_mutex_unlock - @sa mysql_mutex_destroy -*/ -typedef struct st_mysql_mutex mysql_mutex_t; - -/** - An instrumented rwlock structure. - @sa mysql_rwlock_t -*/ -struct st_mysql_rwlock -{ - /** The real rwlock */ - native_rw_lock_t m_rwlock; - /** - The instrumentation hook. - Note that this hook is not conditionally defined, - for binary compatibility of the @c mysql_rwlock_t interface. - */ - struct PSI_rwlock *m_psi; -}; - -/** - An instrumented prlock structure. - @sa mysql_prlock_t -*/ -struct st_mysql_prlock -{ - /** The real prlock */ - rw_pr_lock_t m_prlock; - /** - The instrumentation hook. - Note that this hook is not conditionally defined, - for binary compatibility of the @c mysql_rwlock_t interface. - */ - struct PSI_rwlock *m_psi; -}; - -/** - Type of an instrumented rwlock. - @c mysql_rwlock_t is a drop-in replacement for @c pthread_rwlock_t. - @sa mysql_rwlock_init - @sa mysql_rwlock_rdlock - @sa mysql_rwlock_tryrdlock - @sa mysql_rwlock_wrlock - @sa mysql_rwlock_trywrlock - @sa mysql_rwlock_unlock - @sa mysql_rwlock_destroy -*/ -typedef struct st_mysql_rwlock mysql_rwlock_t; - -/** - Type of an instrumented prlock. - A prlock is a read write lock that 'prefers readers' (pr). - @c mysql_prlock_t is a drop-in replacement for @c rw_pr_lock_t. - @sa mysql_prlock_init - @sa mysql_prlock_rdlock - @sa mysql_prlock_wrlock - @sa mysql_prlock_unlock - @sa mysql_prlock_destroy -*/ -typedef struct st_mysql_prlock mysql_prlock_t; - -/** - An instrumented cond structure. - @sa mysql_cond_t -*/ -struct st_mysql_cond -{ - /** The real condition */ - native_cond_t m_cond; - /** - The instrumentation hook. - Note that this hook is not conditionally defined, - for binary compatibility of the @c mysql_cond_t interface. - */ - struct PSI_cond *m_psi; -}; - -/** - Type of an instrumented condition. - @c mysql_cond_t is a drop-in replacement for @c native_cond_t. - @sa mysql_cond_init - @sa mysql_cond_wait - @sa mysql_cond_timedwait - @sa mysql_cond_signal - @sa mysql_cond_broadcast - @sa mysql_cond_destroy -*/ -typedef struct st_mysql_cond mysql_cond_t; - -/* - Consider the following code: - static inline void foo() { bar(); } - when foo() is never called. - - With gcc, foo() is a local static function, so the dependencies - are optimized away at compile time, and there is no dependency on bar(). - With other compilers (HP, Sun Studio), the function foo() implementation - is compiled, and bar() needs to be present to link. - - Due to the existing header dependencies in MySQL code, this header file - is sometime used when it is not needed, which in turn cause link failures - on some platforms. - The proper fix would be to cut these extra dependencies in the calling code. - DISABLE_MYSQL_THREAD_H is a work around to limit dependencies. - DISABLE_MYSQL_PRLOCK_H is similar, and is used to disable specifically - the prlock wrappers. -*/ -#ifndef DISABLE_MYSQL_THREAD_H - -/** - @def mysql_mutex_assert_owner(M) - Wrapper, to use safe_mutex_assert_owner with instrumented mutexes. - @c mysql_mutex_assert_owner is a drop-in replacement - for @c safe_mutex_assert_owner. -*/ -#ifdef SAFE_MUTEX -#define mysql_mutex_assert_owner(M) \ - safe_mutex_assert_owner(&(M)->m_mutex); -#else -#define mysql_mutex_assert_owner(M) { } -#endif - -/** - @def mysql_mutex_assert_not_owner(M) - Wrapper, to use safe_mutex_assert_not_owner with instrumented mutexes. - @c mysql_mutex_assert_not_owner is a drop-in replacement - for @c safe_mutex_assert_not_owner. -*/ -#ifdef SAFE_MUTEX -#define mysql_mutex_assert_not_owner(M) \ - safe_mutex_assert_not_owner(&(M)->m_mutex); -#else -#define mysql_mutex_assert_not_owner(M) { } -#endif - -/** - @def mysql_prlock_assert_write_owner(M) - Drop-in replacement - for @c rw_pr_lock_assert_write_owner. -*/ -#define mysql_prlock_assert_write_owner(M) \ - rw_pr_lock_assert_write_owner(&(M)->m_prlock) - -/** - @def mysql_prlock_assert_not_write_owner(M) - Drop-in replacement - for @c rw_pr_lock_assert_not_write_owner. -*/ -#define mysql_prlock_assert_not_write_owner(M) \ - rw_pr_lock_assert_not_write_owner(&(M)->m_prlock) - -/** - @def mysql_mutex_register(P1, P2, P3) - Mutex registration. -*/ -#define mysql_mutex_register(P1, P2, P3) \ - inline_mysql_mutex_register(P1, P2, P3) - -/** - @def mysql_mutex_init(K, M, A) - Instrumented mutex_init. - @c mysql_mutex_init is a replacement for @c pthread_mutex_init. - @param K The PSI_mutex_key for this instrumented mutex - @param M The mutex to initialize - @param A Mutex attributes -*/ - -#ifdef HAVE_PSI_MUTEX_INTERFACE - #ifdef SAFE_MUTEX - #define mysql_mutex_init(K, M, A) \ - inline_mysql_mutex_init(K, M, A, __FILE__, __LINE__) - #else - #define mysql_mutex_init(K, M, A) \ - inline_mysql_mutex_init(K, M, A) - #endif -#else - #ifdef SAFE_MUTEX - #define mysql_mutex_init(K, M, A) \ - inline_mysql_mutex_init(M, A, __FILE__, __LINE__) - #else - #define mysql_mutex_init(K, M, A) \ - inline_mysql_mutex_init(M, A) - #endif -#endif - -/** - @def mysql_mutex_destroy(M) - Instrumented mutex_destroy. - @c mysql_mutex_destroy is a drop-in replacement - for @c pthread_mutex_destroy. -*/ -#ifdef SAFE_MUTEX - #define mysql_mutex_destroy(M) \ - inline_mysql_mutex_destroy(M, __FILE__, __LINE__) -#else - #define mysql_mutex_destroy(M) \ - inline_mysql_mutex_destroy(M) -#endif - -/** - @def mysql_mutex_lock(M) - Instrumented mutex_lock. - @c mysql_mutex_lock is a drop-in replacement for @c pthread_mutex_lock. - @param M The mutex to lock -*/ - -#if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) - #define mysql_mutex_lock(M) \ - inline_mysql_mutex_lock(M, __FILE__, __LINE__) -#else - #define mysql_mutex_lock(M) \ - inline_mysql_mutex_lock(M) -#endif - -/** - @def mysql_mutex_trylock(M) - Instrumented mutex_lock. - @c mysql_mutex_trylock is a drop-in replacement - for @c my_mutex_trylock. -*/ - -#if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) - #define mysql_mutex_trylock(M) \ - inline_mysql_mutex_trylock(M, __FILE__, __LINE__) -#else - #define mysql_mutex_trylock(M) \ - inline_mysql_mutex_trylock(M) -#endif - -/** - @def mysql_mutex_unlock(M) - Instrumented mutex_unlock. - @c mysql_mutex_unlock is a drop-in replacement for @c pthread_mutex_unlock. -*/ -#ifdef SAFE_MUTEX - #define mysql_mutex_unlock(M) \ - inline_mysql_mutex_unlock(M, __FILE__, __LINE__) -#else - #define mysql_mutex_unlock(M) \ - inline_mysql_mutex_unlock(M) -#endif - -/** - @def mysql_rwlock_register(P1, P2, P3) - Rwlock registration. -*/ -#define mysql_rwlock_register(P1, P2, P3) \ - inline_mysql_rwlock_register(P1, P2, P3) - -/** - @def mysql_rwlock_init(K, RW) - Instrumented rwlock_init. - @c mysql_rwlock_init is a replacement for @c pthread_rwlock_init. - Note that pthread_rwlockattr_t is not supported in MySQL. - @param K The PSI_rwlock_key for this instrumented rwlock - @param RW The rwlock to initialize -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_rwlock_init(K, RW) inline_mysql_rwlock_init(K, RW) -#else - #define mysql_rwlock_init(K, RW) inline_mysql_rwlock_init(RW) -#endif - -/** - @def mysql_prlock_init(K, RW) - Instrumented rw_pr_init. - @c mysql_prlock_init is a replacement for @c rw_pr_init. - @param K The PSI_rwlock_key for this instrumented prlock - @param RW The prlock to initialize -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_prlock_init(K, RW) inline_mysql_prlock_init(K, RW) -#else - #define mysql_prlock_init(K, RW) inline_mysql_prlock_init(RW) -#endif - -/** - @def mysql_rwlock_destroy(RW) - Instrumented rwlock_destroy. - @c mysql_rwlock_destroy is a drop-in replacement - for @c pthread_rwlock_destroy. -*/ -#define mysql_rwlock_destroy(RW) inline_mysql_rwlock_destroy(RW) - -/** - @def mysql_prlock_destroy(RW) - Instrumented rw_pr_destroy. - @c mysql_prlock_destroy is a drop-in replacement - for @c rw_pr_destroy. -*/ -#define mysql_prlock_destroy(RW) inline_mysql_prlock_destroy(RW) - -/** - @def mysql_rwlock_rdlock(RW) - Instrumented rwlock_rdlock. - @c mysql_rwlock_rdlock is a drop-in replacement - for @c pthread_rwlock_rdlock. -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_rwlock_rdlock(RW) \ - inline_mysql_rwlock_rdlock(RW, __FILE__, __LINE__) -#else - #define mysql_rwlock_rdlock(RW) \ - inline_mysql_rwlock_rdlock(RW) -#endif - -/** - @def mysql_prlock_rdlock(RW) - Instrumented rw_pr_rdlock. - @c mysql_prlock_rdlock is a drop-in replacement - for @c rw_pr_rdlock. -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_prlock_rdlock(RW) \ - inline_mysql_prlock_rdlock(RW, __FILE__, __LINE__) -#else - #define mysql_prlock_rdlock(RW) \ - inline_mysql_prlock_rdlock(RW) -#endif - -/** - @def mysql_rwlock_wrlock(RW) - Instrumented rwlock_wrlock. - @c mysql_rwlock_wrlock is a drop-in replacement - for @c pthread_rwlock_wrlock. -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_rwlock_wrlock(RW) \ - inline_mysql_rwlock_wrlock(RW, __FILE__, __LINE__) -#else - #define mysql_rwlock_wrlock(RW) \ - inline_mysql_rwlock_wrlock(RW) -#endif - -/** - @def mysql_prlock_wrlock(RW) - Instrumented rw_pr_wrlock. - @c mysql_prlock_wrlock is a drop-in replacement - for @c rw_pr_wrlock. -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_prlock_wrlock(RW) \ - inline_mysql_prlock_wrlock(RW, __FILE__, __LINE__) -#else - #define mysql_prlock_wrlock(RW) \ - inline_mysql_prlock_wrlock(RW) -#endif - -/** - @def mysql_rwlock_tryrdlock(RW) - Instrumented rwlock_tryrdlock. - @c mysql_rwlock_tryrdlock is a drop-in replacement - for @c pthread_rwlock_tryrdlock. -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_rwlock_tryrdlock(RW) \ - inline_mysql_rwlock_tryrdlock(RW, __FILE__, __LINE__) -#else - #define mysql_rwlock_tryrdlock(RW) \ - inline_mysql_rwlock_tryrdlock(RW) -#endif - -/** - @def mysql_rwlock_trywrlock(RW) - Instrumented rwlock_trywrlock. - @c mysql_rwlock_trywrlock is a drop-in replacement - for @c pthread_rwlock_trywrlock. -*/ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - #define mysql_rwlock_trywrlock(RW) \ - inline_mysql_rwlock_trywrlock(RW, __FILE__, __LINE__) -#else - #define mysql_rwlock_trywrlock(RW) \ - inline_mysql_rwlock_trywrlock(RW) -#endif - -/** - @def mysql_rwlock_unlock(RW) - Instrumented rwlock_unlock. - @c mysql_rwlock_unlock is a drop-in replacement - for @c pthread_rwlock_unlock. -*/ -#define mysql_rwlock_unlock(RW) inline_mysql_rwlock_unlock(RW) - -/** - @def mysql_prlock_unlock(RW) - Instrumented rw_pr_unlock. - @c mysql_prlock_unlock is a drop-in replacement - for @c rw_pr_unlock. -*/ -#define mysql_prlock_unlock(RW) inline_mysql_prlock_unlock(RW) - -/** - @def mysql_cond_register(P1, P2, P3) - Cond registration. -*/ -#define mysql_cond_register(P1, P2, P3) \ - inline_mysql_cond_register(P1, P2, P3) - -/** - @def mysql_cond_init(K, C) - Instrumented cond_init. - @c mysql_cond_init is a replacement for @c pthread_cond_init. - Note that pthread_condattr_t is not supported in MySQL. - @param C The cond to initialize - @param K The PSI_cond_key for this instrumented cond - -*/ -#ifdef HAVE_PSI_COND_INTERFACE - #define mysql_cond_init(K, C) inline_mysql_cond_init(K, C) -#else - #define mysql_cond_init(K, C) inline_mysql_cond_init(C) -#endif - -/** - @def mysql_cond_destroy(C) - Instrumented cond_destroy. - @c mysql_cond_destroy is a drop-in replacement for @c pthread_cond_destroy. -*/ -#define mysql_cond_destroy(C) inline_mysql_cond_destroy(C) - -/** - @def mysql_cond_wait(C) - Instrumented cond_wait. - @c mysql_cond_wait is a drop-in replacement for @c native_cond_wait. -*/ -#if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) - #define mysql_cond_wait(C, M) \ - inline_mysql_cond_wait(C, M, __FILE__, __LINE__) -#else - #define mysql_cond_wait(C, M) \ - inline_mysql_cond_wait(C, M) -#endif - -/** - @def mysql_cond_timedwait(C, M, W) - Instrumented cond_timedwait. - @c mysql_cond_timedwait is a drop-in replacement - for @c native_cond_timedwait. -*/ -#if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) - #define mysql_cond_timedwait(C, M, W) \ - inline_mysql_cond_timedwait(C, M, W, __FILE__, __LINE__) -#else - #define mysql_cond_timedwait(C, M, W) \ - inline_mysql_cond_timedwait(C, M, W) -#endif - -/** - @def mysql_cond_signal(C) - Instrumented cond_signal. - @c mysql_cond_signal is a drop-in replacement for @c pthread_cond_signal. -*/ -#define mysql_cond_signal(C) inline_mysql_cond_signal(C) - -/** - @def mysql_cond_broadcast(C) - Instrumented cond_broadcast. - @c mysql_cond_broadcast is a drop-in replacement - for @c pthread_cond_broadcast. -*/ -#define mysql_cond_broadcast(C) inline_mysql_cond_broadcast(C) - -/** - @def mysql_thread_register(P1, P2, P3) - Thread registration. -*/ -#define mysql_thread_register(P1, P2, P3) \ - inline_mysql_thread_register(P1, P2, P3) - -/** - @def mysql_thread_create(K, P1, P2, P3, P4) - Instrumented my_thread_create. - This function creates both the thread instrumentation and a thread. - @c mysql_thread_create is a replacement for @c my_thread_create. - The parameter P4 (or, if it is NULL, P1) will be used as the - instrumented thread "indentity". - Providing a P1 / P4 parameter with a different value for each call - will on average improve performances, since this thread identity value - is used internally to randomize access to data and prevent contention. - This is optional, and the improvement is not guaranteed, only statistical. - @param K The PSI_thread_key for this instrumented thread - @param P1 my_thread_create parameter 1 - @param P2 my_thread_create parameter 2 - @param P3 my_thread_create parameter 3 - @param P4 my_thread_create parameter 4 -*/ -#ifdef HAVE_PSI_THREAD_INTERFACE - #define mysql_thread_create(K, P1, P2, P3, P4) \ - inline_mysql_thread_create(K, P1, P2, P3, P4) -#else - #define mysql_thread_create(K, P1, P2, P3, P4) \ - my_thread_create(P1, P2, P3, P4) -#endif - -/** - @def mysql_thread_set_psi_id(I) - Set the thread identifier for the instrumentation. - @param I The thread identifier -*/ -#ifdef HAVE_PSI_THREAD_INTERFACE - #define mysql_thread_set_psi_id(I) inline_mysql_thread_set_psi_id(I) -#else - #define mysql_thread_set_psi_id(I) do {} while (0) -#endif - -/** - @def mysql_thread_set_psi_THD(T) - Set the thread sql session for the instrumentation. - @param I The thread identifier -*/ -#ifdef HAVE_PSI_THREAD_INTERFACE - #define mysql_thread_set_psi_THD(T) inline_mysql_thread_set_psi_THD(T) -#else - #define mysql_thread_set_psi_THD(T) do {} while (0) -#endif - -static inline void inline_mysql_mutex_register( -#ifdef HAVE_PSI_MUTEX_INTERFACE - const char *category, - PSI_mutex_info *info, - int count -#else - const char *category MY_ATTRIBUTE ((unused)), - void *info MY_ATTRIBUTE ((unused)), - int count MY_ATTRIBUTE ((unused)) -#endif -) -{ -#ifdef HAVE_PSI_MUTEX_INTERFACE - PSI_MUTEX_CALL(register_mutex)(category, info, count); -#endif -} - -static inline int inline_mysql_mutex_init( -#ifdef HAVE_PSI_MUTEX_INTERFACE - PSI_mutex_key key, -#endif - mysql_mutex_t *that, - const native_mutexattr_t *attr -#ifdef SAFE_MUTEX - , const char *src_file, uint src_line -#endif - ) -{ -#ifdef HAVE_PSI_MUTEX_INTERFACE - that->m_psi= PSI_MUTEX_CALL(init_mutex)(key, &that->m_mutex); -#else - that->m_psi= NULL; -#endif - return my_mutex_init(&that->m_mutex, attr -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); -} - -static inline int inline_mysql_mutex_destroy( - mysql_mutex_t *that -#ifdef SAFE_MUTEX - , const char *src_file, uint src_line -#endif - ) -{ -#ifdef HAVE_PSI_MUTEX_INTERFACE - if (that->m_psi != NULL) - { - PSI_MUTEX_CALL(destroy_mutex)(that->m_psi); - that->m_psi= NULL; - } -#endif - return my_mutex_destroy(&that->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); -} - -static inline int inline_mysql_mutex_lock( - mysql_mutex_t *that -#if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_MUTEX_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_mutex_locker *locker; - PSI_mutex_locker_state state; - locker= PSI_MUTEX_CALL(start_mutex_wait)(&state, that->m_psi, - PSI_MUTEX_LOCK, src_file, src_line); - - /* Instrumented code */ - result= my_mutex_lock(&that->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - /* Instrumentation end */ - if (locker != NULL) - PSI_MUTEX_CALL(end_mutex_wait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= my_mutex_lock(&that->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - return result; -} - -static inline int inline_mysql_mutex_trylock( - mysql_mutex_t *that -#if defined(SAFE_MUTEX) || defined (HAVE_PSI_MUTEX_INTERFACE) - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_MUTEX_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_mutex_locker *locker; - PSI_mutex_locker_state state; - locker= PSI_MUTEX_CALL(start_mutex_wait)(&state, that->m_psi, - PSI_MUTEX_TRYLOCK, src_file, src_line); - - /* Instrumented code */ - result= my_mutex_trylock(&that->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - /* Instrumentation end */ - if (locker != NULL) - PSI_MUTEX_CALL(end_mutex_wait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= my_mutex_trylock(&that->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - return result; -} - -static inline int inline_mysql_mutex_unlock( - mysql_mutex_t *that -#ifdef SAFE_MUTEX - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_MUTEX_INTERFACE - if (that->m_psi != NULL) - PSI_MUTEX_CALL(unlock_mutex)(that->m_psi); -#endif - - result= my_mutex_unlock(&that->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - return result; -} - -static inline void inline_mysql_rwlock_register( -#ifdef HAVE_PSI_RWLOCK_INTERFACE - const char *category, - PSI_rwlock_info *info, - int count -#else - const char *category MY_ATTRIBUTE ((unused)), - void *info MY_ATTRIBUTE ((unused)), - int count MY_ATTRIBUTE ((unused)) -#endif -) -{ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - PSI_RWLOCK_CALL(register_rwlock)(category, info, count); -#endif -} - -static inline int inline_mysql_rwlock_init( -#ifdef HAVE_PSI_RWLOCK_INTERFACE - PSI_rwlock_key key, -#endif - mysql_rwlock_t *that) -{ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - that->m_psi= PSI_RWLOCK_CALL(init_rwlock)(key, &that->m_rwlock); -#else - that->m_psi= NULL; -#endif - return native_rw_init(&that->m_rwlock); -} - -#ifndef DISABLE_MYSQL_PRLOCK_H -static inline int inline_mysql_prlock_init( -#ifdef HAVE_PSI_RWLOCK_INTERFACE - PSI_rwlock_key key, -#endif - mysql_prlock_t *that) -{ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - that->m_psi= PSI_RWLOCK_CALL(init_rwlock)(key, &that->m_prlock); -#else - that->m_psi= NULL; -#endif - return rw_pr_init(&that->m_prlock); -} -#endif - -static inline int inline_mysql_rwlock_destroy( - mysql_rwlock_t *that) -{ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - PSI_RWLOCK_CALL(destroy_rwlock)(that->m_psi); - that->m_psi= NULL; - } -#endif - return native_rw_destroy(&that->m_rwlock); -} - -#ifndef DISABLE_MYSQL_PRLOCK_H -static inline int inline_mysql_prlock_destroy( - mysql_prlock_t *that) -{ -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - PSI_RWLOCK_CALL(destroy_rwlock)(that->m_psi); - that->m_psi= NULL; - } -#endif - return rw_pr_destroy(&that->m_prlock); -} -#endif - -static inline int inline_mysql_rwlock_rdlock( - mysql_rwlock_t *that -#ifdef HAVE_PSI_RWLOCK_INTERFACE - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_rwlock_locker *locker; - PSI_rwlock_locker_state state; - locker= PSI_RWLOCK_CALL(start_rwlock_rdwait)(&state, that->m_psi, - PSI_RWLOCK_READLOCK, src_file, src_line); - - /* Instrumented code */ - result= native_rw_rdlock(&that->m_rwlock); - - /* Instrumentation end */ - if (locker != NULL) - PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= native_rw_rdlock(&that->m_rwlock); - - return result; -} - -#ifndef DISABLE_MYSQL_PRLOCK_H -static inline int inline_mysql_prlock_rdlock( - mysql_prlock_t *that -#ifdef HAVE_PSI_RWLOCK_INTERFACE - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_rwlock_locker *locker; - PSI_rwlock_locker_state state; - locker= PSI_RWLOCK_CALL(start_rwlock_rdwait)(&state, that->m_psi, - PSI_RWLOCK_READLOCK, src_file, src_line); - - /* Instrumented code */ - result= rw_pr_rdlock(&that->m_prlock); - - /* Instrumentation end */ - if (locker != NULL) - PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= rw_pr_rdlock(&that->m_prlock); - - return result; -} -#endif - -static inline int inline_mysql_rwlock_wrlock( - mysql_rwlock_t *that -#ifdef HAVE_PSI_RWLOCK_INTERFACE - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_rwlock_locker *locker; - PSI_rwlock_locker_state state; - locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)(&state, that->m_psi, - PSI_RWLOCK_WRITELOCK, src_file, src_line); - - /* Instrumented code */ - result= native_rw_wrlock(&that->m_rwlock); - - /* Instrumentation end */ - if (locker != NULL) - PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= native_rw_wrlock(&that->m_rwlock); - - return result; -} - -#ifndef DISABLE_MYSQL_PRLOCK_H -static inline int inline_mysql_prlock_wrlock( - mysql_prlock_t *that -#ifdef HAVE_PSI_RWLOCK_INTERFACE - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_rwlock_locker *locker; - PSI_rwlock_locker_state state; - locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)(&state, that->m_psi, - PSI_RWLOCK_WRITELOCK, src_file, src_line); - - /* Instrumented code */ - result= rw_pr_wrlock(&that->m_prlock); - - /* Instrumentation end */ - if (locker != NULL) - PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= rw_pr_wrlock(&that->m_prlock); - - return result; -} -#endif - -static inline int inline_mysql_rwlock_tryrdlock( - mysql_rwlock_t *that -#ifdef HAVE_PSI_RWLOCK_INTERFACE - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_rwlock_locker *locker; - PSI_rwlock_locker_state state; - locker= PSI_RWLOCK_CALL(start_rwlock_rdwait)(&state, that->m_psi, - PSI_RWLOCK_TRYREADLOCK, src_file, src_line); - - /* Instrumented code */ - result= native_rw_tryrdlock(&that->m_rwlock); - - /* Instrumentation end */ - if (locker != NULL) - PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= native_rw_tryrdlock(&that->m_rwlock); - - return result; -} - -static inline int inline_mysql_rwlock_trywrlock( - mysql_rwlock_t *that -#ifdef HAVE_PSI_RWLOCK_INTERFACE - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_rwlock_locker *locker; - PSI_rwlock_locker_state state; - locker= PSI_RWLOCK_CALL(start_rwlock_wrwait)(&state, that->m_psi, - PSI_RWLOCK_TRYWRITELOCK, src_file, src_line); - - /* Instrumented code */ - result= native_rw_trywrlock(&that->m_rwlock); - - /* Instrumentation end */ - if (locker != NULL) - PSI_RWLOCK_CALL(end_rwlock_wrwait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= native_rw_trywrlock(&that->m_rwlock); - - return result; -} - -static inline int inline_mysql_rwlock_unlock( - mysql_rwlock_t *that) -{ - int result; -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - PSI_RWLOCK_CALL(unlock_rwlock)(that->m_psi); -#endif - result= native_rw_unlock(&that->m_rwlock); - return result; -} - -#ifndef DISABLE_MYSQL_PRLOCK_H -static inline int inline_mysql_prlock_unlock( - mysql_prlock_t *that) -{ - int result; -#ifdef HAVE_PSI_RWLOCK_INTERFACE - if (that->m_psi != NULL) - PSI_RWLOCK_CALL(unlock_rwlock)(that->m_psi); -#endif - result= rw_pr_unlock(&that->m_prlock); - return result; -} -#endif - -static inline void inline_mysql_cond_register( -#ifdef HAVE_PSI_COND_INTERFACE - const char *category, - PSI_cond_info *info, - int count -#else - const char *category MY_ATTRIBUTE ((unused)), - void *info MY_ATTRIBUTE ((unused)), - int count MY_ATTRIBUTE ((unused)) -#endif -) -{ -#ifdef HAVE_PSI_COND_INTERFACE - PSI_COND_CALL(register_cond)(category, info, count); -#endif -} - -static inline int inline_mysql_cond_init( -#ifdef HAVE_PSI_COND_INTERFACE - PSI_cond_key key, -#endif - mysql_cond_t *that) -{ -#ifdef HAVE_PSI_COND_INTERFACE - that->m_psi= PSI_COND_CALL(init_cond)(key, &that->m_cond); -#else - that->m_psi= NULL; -#endif - return native_cond_init(&that->m_cond); -} - -static inline int inline_mysql_cond_destroy( - mysql_cond_t *that) -{ -#ifdef HAVE_PSI_COND_INTERFACE - if (that->m_psi != NULL) - { - PSI_COND_CALL(destroy_cond)(that->m_psi); - that->m_psi= NULL; - } -#endif - return native_cond_destroy(&that->m_cond); -} - -static inline int inline_mysql_cond_wait( - mysql_cond_t *that, - mysql_mutex_t *mutex -#if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_COND_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_cond_locker *locker; - PSI_cond_locker_state state; - locker= PSI_COND_CALL(start_cond_wait)(&state, that->m_psi, mutex->m_psi, - PSI_COND_WAIT, src_file, src_line); - - /* Instrumented code */ - result= my_cond_wait(&that->m_cond, &mutex->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - /* Instrumentation end */ - if (locker != NULL) - PSI_COND_CALL(end_cond_wait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= my_cond_wait(&that->m_cond, &mutex->m_mutex -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - return result; -} - -static inline int inline_mysql_cond_timedwait( - mysql_cond_t *that, - mysql_mutex_t *mutex, - const struct timespec *abstime -#if defined(SAFE_MUTEX) || defined(HAVE_PSI_COND_INTERFACE) - , const char *src_file, uint src_line -#endif - ) -{ - int result; - -#ifdef HAVE_PSI_COND_INTERFACE - if (that->m_psi != NULL) - { - /* Instrumentation start */ - PSI_cond_locker *locker; - PSI_cond_locker_state state; - locker= PSI_COND_CALL(start_cond_wait)(&state, that->m_psi, mutex->m_psi, - PSI_COND_TIMEDWAIT, src_file, src_line); - - /* Instrumented code */ - result= my_cond_timedwait(&that->m_cond, &mutex->m_mutex, abstime -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - /* Instrumentation end */ - if (locker != NULL) - PSI_COND_CALL(end_cond_wait)(locker, result); - - return result; - } -#endif - - /* Non instrumented code */ - result= my_cond_timedwait(&that->m_cond, &mutex->m_mutex, abstime -#ifdef SAFE_MUTEX - , src_file, src_line -#endif - ); - - return result; -} - -static inline int inline_mysql_cond_signal( - mysql_cond_t *that) -{ - int result; -#ifdef HAVE_PSI_COND_INTERFACE - if (that->m_psi != NULL) - PSI_COND_CALL(signal_cond)(that->m_psi); -#endif - result= native_cond_signal(&that->m_cond); - return result; -} - -static inline int inline_mysql_cond_broadcast( - mysql_cond_t *that) -{ - int result; -#ifdef HAVE_PSI_COND_INTERFACE - if (that->m_psi != NULL) - PSI_COND_CALL(broadcast_cond)(that->m_psi); -#endif - result= native_cond_broadcast(&that->m_cond); - return result; -} - -static inline void inline_mysql_thread_register( -#ifdef HAVE_PSI_THREAD_INTERFACE - const char *category, - PSI_thread_info *info, - int count -#else - const char *category MY_ATTRIBUTE ((unused)), - void *info MY_ATTRIBUTE ((unused)), - int count MY_ATTRIBUTE ((unused)) -#endif -) -{ -#ifdef HAVE_PSI_THREAD_INTERFACE - PSI_THREAD_CALL(register_thread)(category, info, count); -#endif -} - -#ifdef HAVE_PSI_THREAD_INTERFACE -static inline int inline_mysql_thread_create( - PSI_thread_key key, - my_thread_handle *thread, const my_thread_attr_t *attr, - my_start_routine start_routine, void *arg) -{ - int result; - result= PSI_THREAD_CALL(spawn_thread)(key, thread, attr, start_routine, arg); - return result; -} - -static inline void inline_mysql_thread_set_psi_id(my_thread_id id) -{ - struct PSI_thread *psi= PSI_THREAD_CALL(get_thread)(); - PSI_THREAD_CALL(set_thread_id)(psi, id); -} - -#ifdef __cplusplus -class THD; -static inline void inline_mysql_thread_set_psi_THD(THD *thd) -{ - struct PSI_thread *psi= PSI_THREAD_CALL(get_thread)(); - PSI_THREAD_CALL(set_thread_THD)(psi, thd); -} -#endif /* __cplusplus */ - -#endif - -#endif /* DISABLE_MYSQL_THREAD_H */ - -/** @} (end of group Thread_instrumentation) */ - -#endif - diff --git a/mysql/mysql/psi/psi.h b/mysql/mysql/psi/psi.h deleted file mode 100644 index 9fb6286..0000000 --- a/mysql/mysql/psi/psi.h +++ /dev/null @@ -1,2980 +0,0 @@ -/* Copyright (c) 2008, 2015, 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, - 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ - -#ifndef MYSQL_PERFORMANCE_SCHEMA_INTERFACE_H -#define MYSQL_PERFORMANCE_SCHEMA_INTERFACE_H - -#ifdef EMBEDDED_LIBRARY -#define DISABLE_ALL_PSI -#endif /* EMBEDDED_LIBRARY */ - -#ifndef MY_GLOBAL_INCLUDED -/* - Make sure a .c or .cc file contains an include to my_global.h first. - When this include is missing, all the #ifdef HAVE_XXX have no effect, - and the resulting binary won't build, or won't link, - or will crash at runtime - since various structures will have different binary definitions. -*/ -#error "You must include my_global.h in the code for the build to be correct." -#endif - -#include "psi_base.h" -#include "psi_memory.h" - -/* - MAINTAINER: - The following pattern: - typedef struct XYZ XYZ; - is not needed in C++, but required for C. -*/ - -C_MODE_START - -/** @sa MDL_key. */ -struct MDL_key; -typedef struct MDL_key MDL_key; - -/** @sa enum_mdl_type. */ -typedef int opaque_mdl_type; - -/** @sa enum_mdl_duration. */ -typedef int opaque_mdl_duration; - -/** @sa MDL_wait::enum_wait_status. */ -typedef int opaque_mdl_status; - -/** @sa enum_vio_type. */ -typedef int opaque_vio_type; - -struct TABLE_SHARE; - -struct sql_digest_storage; - -#ifdef __cplusplus - class THD; -#else - /* - Phony declaration when compiling C code. - This is ok, because the C code will never have a THD anyway. - */ - struct opaque_THD - { - int dummy; - }; - typedef struct opaque_THD THD; -#endif - -/** - @file mysql/psi/psi.h - Performance schema instrumentation interface. - - @defgroup Instrumentation_interface Instrumentation Interface - @ingroup Performance_schema - @{ -*/ - -/** - Interface for an instrumented mutex. - This is an opaque structure. -*/ -struct PSI_mutex; -typedef struct PSI_mutex PSI_mutex; - -/** - Interface for an instrumented rwlock. - This is an opaque structure. -*/ -struct PSI_rwlock; -typedef struct PSI_rwlock PSI_rwlock; - -/** - Interface for an instrumented condition. - This is an opaque structure. -*/ -struct PSI_cond; -typedef struct PSI_cond PSI_cond; - -/** - Interface for an instrumented table share. - This is an opaque structure. -*/ -struct PSI_table_share; -typedef struct PSI_table_share PSI_table_share; - -/** - Interface for an instrumented table handle. - This is an opaque structure. -*/ -struct PSI_table; -typedef struct PSI_table PSI_table; - -/** - Interface for an instrumented thread. - This is an opaque structure. -*/ -struct PSI_thread; -typedef struct PSI_thread PSI_thread; - -/** - Interface for an instrumented file handle. - This is an opaque structure. -*/ -struct PSI_file; -typedef struct PSI_file PSI_file; - -/** - Interface for an instrumented socket descriptor. - This is an opaque structure. -*/ -struct PSI_socket; -typedef struct PSI_socket PSI_socket; - -/** - Interface for an instrumented prepared statement. - This is an opaque structure. -*/ -struct PSI_prepared_stmt; -typedef struct PSI_prepared_stmt PSI_prepared_stmt; - -/** - Interface for an instrumented table operation. - This is an opaque structure. -*/ -struct PSI_table_locker; -typedef struct PSI_table_locker PSI_table_locker; - -/** - Interface for an instrumented statement. - This is an opaque structure. -*/ -struct PSI_statement_locker; -typedef struct PSI_statement_locker PSI_statement_locker; - -/** - Interface for an instrumented transaction. - This is an opaque structure. -*/ -struct PSI_transaction_locker; -typedef struct PSI_transaction_locker PSI_transaction_locker; - -/** - Interface for an instrumented idle operation. - This is an opaque structure. -*/ -struct PSI_idle_locker; -typedef struct PSI_idle_locker PSI_idle_locker; - -/** - Interface for an instrumented statement digest operation. - This is an opaque structure. -*/ -struct PSI_digest_locker; -typedef struct PSI_digest_locker PSI_digest_locker; - -/** - Interface for an instrumented stored procedure share. - This is an opaque structure. -*/ -struct PSI_sp_share; -typedef struct PSI_sp_share PSI_sp_share; - -/** - Interface for an instrumented stored program. - This is an opaque structure. -*/ -struct PSI_sp_locker; -typedef struct PSI_sp_locker PSI_sp_locker; - -/** - Interface for an instrumented metadata lock. - This is an opaque structure. -*/ -struct PSI_metadata_lock; -typedef struct PSI_metadata_lock PSI_metadata_lock; - -/** - Interface for an instrumented stage progress. - This is a public structure, for efficiency. -*/ -struct PSI_stage_progress -{ - ulonglong m_work_completed; - ulonglong m_work_estimated; -}; -typedef struct PSI_stage_progress PSI_stage_progress; - -/** IO operation performed on an instrumented table. */ -enum PSI_table_io_operation -{ - /** Row fetch. */ - PSI_TABLE_FETCH_ROW= 0, - /** Row write. */ - PSI_TABLE_WRITE_ROW= 1, - /** Row update. */ - PSI_TABLE_UPDATE_ROW= 2, - /** Row delete. */ - PSI_TABLE_DELETE_ROW= 3 -}; -typedef enum PSI_table_io_operation PSI_table_io_operation; - -/** - State data storage for @c start_table_io_wait_v1_t, - @c start_table_lock_wait_v1_t. - This structure provide temporary storage to a table locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa start_table_io_wait_v1_t - @sa start_table_lock_wait_v1_t -*/ -struct PSI_table_locker_state -{ - /** Internal state. */ - uint m_flags; - /** Current io operation. */ - enum PSI_table_io_operation m_io_operation; - /** Current table handle. */ - struct PSI_table *m_table; - /** Current table share. */ - struct PSI_table_share *m_table_share; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_wait; - /** - Implementation specific. - For table io, the table io index. - For table lock, the lock type. - */ - uint m_index; -}; -typedef struct PSI_table_locker_state PSI_table_locker_state; - -/** Entry point for the performance schema interface. */ -struct PSI_bootstrap -{ - /** - ABI interface finder. - Calling this method with an interface version number returns either - an instance of the ABI for this version, or NULL. - @param version the interface version number to find - @return a versioned interface (PSI_v1, PSI_v2 or PSI) - @sa PSI_VERSION_1 - @sa PSI_v1 - @sa PSI_VERSION_2 - @sa PSI_v2 - @sa PSI_CURRENT_VERSION - @sa PSI - */ - void* (*get_interface)(int version); -}; -typedef struct PSI_bootstrap PSI_bootstrap; - -#ifdef HAVE_PSI_INTERFACE - -#ifdef DISABLE_ALL_PSI - -#ifndef DISABLE_PSI_THREAD -#define DISABLE_PSI_THREAD -#endif - -#ifndef DISABLE_PSI_MUTEX -#define DISABLE_PSI_MUTEX -#endif - -#ifndef DISABLE_PSI_RWLOCK -#define DISABLE_PSI_RWLOCK -#endif - -#ifndef DISABLE_PSI_COND -#define DISABLE_PSI_COND -#endif - -#ifndef DISABLE_PSI_FILE -#define DISABLE_PSI_FILE -#endif - -#ifndef DISABLE_PSI_TABLE -#define DISABLE_PSI_TABLE -#endif - -#ifndef DISABLE_PSI_SOCKET -#define DISABLE_PSI_SOCKET -#endif - -#ifndef DISABLE_PSI_STAGE -#define DISABLE_PSI_STAGE -#endif - -#ifndef DISABLE_PSI_STATEMENT -#define DISABLE_PSI_STATEMENT -#endif - -#ifndef DISABLE_PSI_SP -#define DISABLE_PSI_SP -#endif - -#ifndef DISABLE_PSI_IDLE -#define DISABLE_PSI_IDLE -#endif - -#ifndef DISABLE_PSI_STATEMENT_DIGEST -#define DISABLE_PSI_STATEMENT_DIGEST -#endif - -#ifndef DISABLE_PSI_METADATA -#define DISABLE_PSI_METADATA -#endif - -#ifndef DISABLE_PSI_MEMORY -#define DISABLE_PSI_MEMORY -#endif - -#ifndef DISABLE_PSI_TRANSACTION -#define DISABLE_PSI_TRANSACTION -#endif - -#ifndef DISABLE_PSI_SP -#define DISABLE_PSI_SP -#endif - -#ifndef DISABLE_PSI_PS -#define DISABLE_PSI_PS -#endif - -#endif - -/** - @def DISABLE_PSI_MUTEX - Compiling option to disable the mutex instrumentation. - This option is mostly intended to be used during development, - when doing special builds with only a subset of the performance schema instrumentation, - for code analysis / profiling / performance tuning of a specific instrumentation alone. - @sa DISABLE_PSI_RWLOCK - @sa DISABLE_PSI_COND - @sa DISABLE_PSI_FILE - @sa DISABLE_PSI_THREAD - @sa DISABLE_PSI_TABLE - @sa DISABLE_PSI_STAGE - @sa DISABLE_PSI_STATEMENT - @sa DISABLE_PSI_SP - @sa DISABLE_PSI_STATEMENT_DIGEST - @sa DISABLE_PSI_SOCKET - @sa DISABLE_PSI_MEMORY - @sa DISABLE_PSI_IDLE - @sa DISABLE_PSI_METADATA - @sa DISABLE PSI_TRANSACTION -*/ - -#ifndef DISABLE_PSI_MUTEX -#define HAVE_PSI_MUTEX_INTERFACE -#endif - -/** - @def DISABLE_PSI_RWLOCK - Compiling option to disable the rwlock instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_RWLOCK -#define HAVE_PSI_RWLOCK_INTERFACE -#endif - -/** - @def DISABLE_PSI_COND - Compiling option to disable the cond instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_COND -#define HAVE_PSI_COND_INTERFACE -#endif - -/** - @def DISABLE_PSI_FILE - Compiling option to disable the file instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_FILE -#define HAVE_PSI_FILE_INTERFACE -#endif - -/** - @def DISABLE_PSI_THREAD - Compiling option to disable the thread instrumentation. - @sa DISABLE_PSI_MUTEX -*/ -#ifndef DISABLE_PSI_THREAD -#define HAVE_PSI_THREAD_INTERFACE -#endif - -/** - @def DISABLE_PSI_TABLE - Compiling option to disable the table instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_TABLE -#define HAVE_PSI_TABLE_INTERFACE -#endif - -/** - @def DISABLE_PSI_STAGE - Compiling option to disable the stage instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_STAGE -#define HAVE_PSI_STAGE_INTERFACE -#endif - -/** - @def DISABLE_PSI_STATEMENT - Compiling option to disable the statement instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_STATEMENT -#define HAVE_PSI_STATEMENT_INTERFACE -#endif - -/** - @def DISABLE_PSI_SP - Compiling option to disable the stored program instrumentation. - @sa DISABLE_PSI_MUTEX -*/ -#ifndef DISABLE_PSI_SP -#define HAVE_PSI_SP_INTERFACE -#endif - -/** - @def DISABLE_PSI_PS - Compiling option to disable the prepared statement instrumentation. - @sa DISABLE_PSI_MUTEX -*/ -#ifndef DISABLE_PSI_STATEMENT -#ifndef DISABLE_PSI_PS -#define HAVE_PSI_PS_INTERFACE -#endif -#endif - -/** - @def DISABLE_PSI_STATEMENT_DIGEST - Compiling option to disable the statement digest instrumentation. -*/ - -#ifndef DISABLE_PSI_STATEMENT -#ifndef DISABLE_PSI_STATEMENT_DIGEST -#define HAVE_PSI_STATEMENT_DIGEST_INTERFACE -#endif -#endif - -/** - @def DISABLE_PSI_TRANSACTION - Compiling option to disable the transaction instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_TRANSACTION -#define HAVE_PSI_TRANSACTION_INTERFACE -#endif - -/** - @def DISABLE_PSI_SOCKET - Compiling option to disable the statement instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_SOCKET -#define HAVE_PSI_SOCKET_INTERFACE -#endif - -/** - @def DISABLE_PSI_MEMORY - Compiling option to disable the memory instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_MEMORY -#define HAVE_PSI_MEMORY_INTERFACE -#endif - -/** - @def DISABLE_PSI_IDLE - Compiling option to disable the idle instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_IDLE -#define HAVE_PSI_IDLE_INTERFACE -#endif - -/** - @def DISABLE_PSI_METADATA - Compiling option to disable the metadata instrumentation. - @sa DISABLE_PSI_MUTEX -*/ - -#ifndef DISABLE_PSI_METADATA -#define HAVE_PSI_METADATA_INTERFACE -#endif - -/** - @def PSI_VERSION_1 - Performance Schema Interface number for version 1. - This version is supported. -*/ -#define PSI_VERSION_1 1 - -/** - @def PSI_VERSION_2 - Performance Schema Interface number for version 2. - This version is not implemented, it's a placeholder. -*/ -#define PSI_VERSION_2 2 - -/** - @def PSI_CURRENT_VERSION - Performance Schema Interface number for the most recent version. - The most current version is @c PSI_VERSION_1 -*/ -#define PSI_CURRENT_VERSION 1 - -#ifndef USE_PSI_2 -#ifndef USE_PSI_1 -#define USE_PSI_1 -#endif -#endif - -/** - Interface for an instrumented mutex operation. - This is an opaque structure. -*/ -struct PSI_mutex_locker; -typedef struct PSI_mutex_locker PSI_mutex_locker; - -/** - Interface for an instrumented rwlock operation. - This is an opaque structure. -*/ -struct PSI_rwlock_locker; -typedef struct PSI_rwlock_locker PSI_rwlock_locker; - -/** - Interface for an instrumented condition operation. - This is an opaque structure. -*/ -struct PSI_cond_locker; -typedef struct PSI_cond_locker PSI_cond_locker; - -/** - Interface for an instrumented file operation. - This is an opaque structure. -*/ -struct PSI_file_locker; -typedef struct PSI_file_locker PSI_file_locker; - -/** - Interface for an instrumented socket operation. - This is an opaque structure. -*/ -struct PSI_socket_locker; -typedef struct PSI_socket_locker PSI_socket_locker; - -/** - Interface for an instrumented MDL operation. - This is an opaque structure. -*/ -struct PSI_metadata_locker; -typedef struct PSI_metadata_locker PSI_metadata_locker; - -/** Operation performed on an instrumented mutex. */ -enum PSI_mutex_operation -{ - /** Lock. */ - PSI_MUTEX_LOCK= 0, - /** Lock attempt. */ - PSI_MUTEX_TRYLOCK= 1 -}; -typedef enum PSI_mutex_operation PSI_mutex_operation; - -/** - Operation performed on an instrumented rwlock. - For basic READ / WRITE lock, - operations are "READ" or "WRITE". - For SX-locks, operations are "SHARED", "SHARED-EXCLUSIVE" or "EXCLUSIVE". -*/ -enum PSI_rwlock_operation -{ - /** Read lock. */ - PSI_RWLOCK_READLOCK= 0, - /** Write lock. */ - PSI_RWLOCK_WRITELOCK= 1, - /** Read lock attempt. */ - PSI_RWLOCK_TRYREADLOCK= 2, - /** Write lock attempt. */ - PSI_RWLOCK_TRYWRITELOCK= 3, - - /** Shared lock. */ - PSI_RWLOCK_SHAREDLOCK= 4, - /** Shared Exclusive lock. */ - PSI_RWLOCK_SHAREDEXCLUSIVELOCK= 5, - /** Exclusive lock. */ - PSI_RWLOCK_EXCLUSIVELOCK= 6, - /** Shared lock attempt. */ - PSI_RWLOCK_TRYSHAREDLOCK= 7, - /** Shared Exclusive lock attempt. */ - PSI_RWLOCK_TRYSHAREDEXCLUSIVELOCK= 8, - /** Exclusive lock attempt. */ - PSI_RWLOCK_TRYEXCLUSIVELOCK= 9 - -}; -typedef enum PSI_rwlock_operation PSI_rwlock_operation; - -/** Operation performed on an instrumented condition. */ -enum PSI_cond_operation -{ - /** Wait. */ - PSI_COND_WAIT= 0, - /** Wait, with timeout. */ - PSI_COND_TIMEDWAIT= 1 -}; -typedef enum PSI_cond_operation PSI_cond_operation; - -/** Operation performed on an instrumented file. */ -enum PSI_file_operation -{ - /** File creation, as in @c create(). */ - PSI_FILE_CREATE= 0, - /** Temporary file creation, as in @c create_temp_file(). */ - PSI_FILE_CREATE_TMP= 1, - /** File open, as in @c open(). */ - PSI_FILE_OPEN= 2, - /** File open, as in @c fopen(). */ - PSI_FILE_STREAM_OPEN= 3, - /** File close, as in @c close(). */ - PSI_FILE_CLOSE= 4, - /** File close, as in @c fclose(). */ - PSI_FILE_STREAM_CLOSE= 5, - /** - Generic file read, such as @c fgets(), @c fgetc(), @c fread(), @c read(), - @c pread(). - */ - PSI_FILE_READ= 6, - /** - Generic file write, such as @c fputs(), @c fputc(), @c fprintf(), - @c vfprintf(), @c fwrite(), @c write(), @c pwrite(). - */ - PSI_FILE_WRITE= 7, - /** Generic file seek, such as @c fseek() or @c seek(). */ - PSI_FILE_SEEK= 8, - /** Generic file tell, such as @c ftell() or @c tell(). */ - PSI_FILE_TELL= 9, - /** File flush, as in @c fflush(). */ - PSI_FILE_FLUSH= 10, - /** File stat, as in @c stat(). */ - PSI_FILE_STAT= 11, - /** File stat, as in @c fstat(). */ - PSI_FILE_FSTAT= 12, - /** File chsize, as in @c my_chsize(). */ - PSI_FILE_CHSIZE= 13, - /** File delete, such as @c my_delete() or @c my_delete_with_symlink(). */ - PSI_FILE_DELETE= 14, - /** File rename, such as @c my_rename() or @c my_rename_with_symlink(). */ - PSI_FILE_RENAME= 15, - /** File sync, as in @c fsync() or @c my_sync(). */ - PSI_FILE_SYNC= 16 -}; -typedef enum PSI_file_operation PSI_file_operation; - -/** Lock operation performed on an instrumented table. */ -enum PSI_table_lock_operation -{ - /** Table lock, in the server layer. */ - PSI_TABLE_LOCK= 0, - /** Table lock, in the storage engine layer. */ - PSI_TABLE_EXTERNAL_LOCK= 1 -}; -typedef enum PSI_table_lock_operation PSI_table_lock_operation; - -/** State of an instrumented socket. */ -enum PSI_socket_state -{ - /** Idle, waiting for the next command. */ - PSI_SOCKET_STATE_IDLE= 1, - /** Active, executing a command. */ - PSI_SOCKET_STATE_ACTIVE= 2 -}; -typedef enum PSI_socket_state PSI_socket_state; - -/** Operation performed on an instrumented socket. */ -enum PSI_socket_operation -{ - /** Socket creation, as in @c socket() or @c socketpair(). */ - PSI_SOCKET_CREATE= 0, - /** Socket connection, as in @c connect(), @c listen() and @c accept(). */ - PSI_SOCKET_CONNECT= 1, - /** Socket bind, as in @c bind(), @c getsockname() and @c getpeername(). */ - PSI_SOCKET_BIND= 2, - /** Socket close, as in @c shutdown(). */ - PSI_SOCKET_CLOSE= 3, - /** Socket send, @c send(). */ - PSI_SOCKET_SEND= 4, - /** Socket receive, @c recv(). */ - PSI_SOCKET_RECV= 5, - /** Socket send, @c sendto(). */ - PSI_SOCKET_SENDTO= 6, - /** Socket receive, @c recvfrom). */ - PSI_SOCKET_RECVFROM= 7, - /** Socket send, @c sendmsg(). */ - PSI_SOCKET_SENDMSG= 8, - /** Socket receive, @c recvmsg(). */ - PSI_SOCKET_RECVMSG= 9, - /** Socket seek, such as @c fseek() or @c seek(). */ - PSI_SOCKET_SEEK= 10, - /** Socket options, as in @c getsockopt() and @c setsockopt(). */ - PSI_SOCKET_OPT= 11, - /** Socket status, as in @c sockatmark() and @c isfdtype(). */ - PSI_SOCKET_STAT= 12, - /** Socket shutdown, as in @c shutdown(). */ - PSI_SOCKET_SHUTDOWN= 13, - /** Socket select, as in @c select() and @c poll(). */ - PSI_SOCKET_SELECT= 14 -}; -typedef enum PSI_socket_operation PSI_socket_operation; - -/** - Instrumented mutex key. - To instrument a mutex, a mutex key must be obtained using @c register_mutex. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_mutex_key; - -/** - Instrumented rwlock key. - To instrument a rwlock, a rwlock key must be obtained - using @c register_rwlock. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_rwlock_key; - -/** - Instrumented cond key. - To instrument a condition, a condition key must be obtained - using @c register_cond. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_cond_key; - -/** - Instrumented thread key. - To instrument a thread, a thread key must be obtained - using @c register_thread. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_thread_key; - -/** - Instrumented file key. - To instrument a file, a file key must be obtained using @c register_file. - Using a zero key always disable the instrumentation. -*/ -#ifndef PSI_FILE_KEY_DEFINED -typedef unsigned int PSI_file_key; -#define PSI_FILE_KEY_DEFINED -#endif - -/** - Instrumented stage key. - To instrument a stage, a stage key must be obtained using @c register_stage. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_stage_key; - -/** - Instrumented statement key. - To instrument a statement, a statement key must be obtained using @c register_statement. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_statement_key; - -/** - Instrumented socket key. - To instrument a socket, a socket key must be obtained using @c register_socket. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_socket_key; - -#ifdef HAVE_PSI_1 - -/** - @defgroup Group_PSI_v1 Application Binary Interface, version 1 - @ingroup Instrumentation_interface - @{ -*/ - -/** - Mutex information. - @since PSI_VERSION_1 - This structure is used to register an instrumented mutex. -*/ -struct PSI_mutex_info_v1 -{ - /** - Pointer to the key assigned to the registered mutex. - */ - PSI_mutex_key *m_key; - /** - The name of the mutex to register. - */ - const char *m_name; - /** - The flags of the mutex to register. - @sa PSI_FLAG_GLOBAL - */ - int m_flags; -}; -typedef struct PSI_mutex_info_v1 PSI_mutex_info_v1; - -/** - Rwlock information. - @since PSI_VERSION_1 - This structure is used to register an instrumented rwlock. -*/ -struct PSI_rwlock_info_v1 -{ - /** - Pointer to the key assigned to the registered rwlock. - */ - PSI_rwlock_key *m_key; - /** - The name of the rwlock to register. - */ - const char *m_name; - /** - The flags of the rwlock to register. - @sa PSI_FLAG_GLOBAL - */ - int m_flags; -}; -typedef struct PSI_rwlock_info_v1 PSI_rwlock_info_v1; - -/** - Condition information. - @since PSI_VERSION_1 - This structure is used to register an instrumented cond. -*/ -struct PSI_cond_info_v1 -{ - /** - Pointer to the key assigned to the registered cond. - */ - PSI_cond_key *m_key; - /** - The name of the cond to register. - */ - const char *m_name; - /** - The flags of the cond to register. - @sa PSI_FLAG_GLOBAL - */ - int m_flags; -}; -typedef struct PSI_cond_info_v1 PSI_cond_info_v1; - -/** - Thread instrument information. - @since PSI_VERSION_1 - This structure is used to register an instrumented thread. -*/ -struct PSI_thread_info_v1 -{ - /** - Pointer to the key assigned to the registered thread. - */ - PSI_thread_key *m_key; - /** - The name of the thread instrument to register. - */ - const char *m_name; - /** - The flags of the thread to register. - @sa PSI_FLAG_GLOBAL - */ - int m_flags; -}; -typedef struct PSI_thread_info_v1 PSI_thread_info_v1; - -/** - File instrument information. - @since PSI_VERSION_1 - This structure is used to register an instrumented file. -*/ -struct PSI_file_info_v1 -{ - /** - Pointer to the key assigned to the registered file. - */ - PSI_file_key *m_key; - /** - The name of the file instrument to register. - */ - const char *m_name; - /** - The flags of the file instrument to register. - @sa PSI_FLAG_GLOBAL - */ - int m_flags; -}; -typedef struct PSI_file_info_v1 PSI_file_info_v1; - -/** - Stage instrument information. - @since PSI_VERSION_1 - This structure is used to register an instrumented stage. -*/ -struct PSI_stage_info_v1 -{ - /** The registered stage key. */ - PSI_stage_key m_key; - /** The name of the stage instrument to register. */ - const char *m_name; - /** The flags of the stage instrument to register. */ - int m_flags; -}; -typedef struct PSI_stage_info_v1 PSI_stage_info_v1; - -/** - Statement instrument information. - @since PSI_VERSION_1 - This structure is used to register an instrumented statement. -*/ -struct PSI_statement_info_v1 -{ - /** The registered statement key. */ - PSI_statement_key m_key; - /** The name of the statement instrument to register. */ - const char *m_name; - /** The flags of the statement instrument to register. */ - int m_flags; -}; -typedef struct PSI_statement_info_v1 PSI_statement_info_v1; - -/** - Socket instrument information. - @since PSI_VERSION_1 - This structure is used to register an instrumented socket. -*/ -struct PSI_socket_info_v1 -{ - /** - Pointer to the key assigned to the registered socket. - */ - PSI_socket_key *m_key; - /** - The name of the socket instrument to register. - */ - const char *m_name; - /** - The flags of the socket instrument to register. - @sa PSI_FLAG_GLOBAL - */ - int m_flags; -}; -typedef struct PSI_socket_info_v1 PSI_socket_info_v1; - -/** - State data storage for @c start_idle_wait_v1_t. - This structure provide temporary storage to an idle locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa start_idle_wait_v1_t. -*/ -struct PSI_idle_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_wait; -}; -typedef struct PSI_idle_locker_state_v1 PSI_idle_locker_state_v1; - -/** - State data storage for @c start_mutex_wait_v1_t. - This structure provide temporary storage to a mutex locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa start_mutex_wait_v1_t -*/ -struct PSI_mutex_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current operation. */ - enum PSI_mutex_operation m_operation; - /** Current mutex. */ - struct PSI_mutex *m_mutex; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_wait; -}; -typedef struct PSI_mutex_locker_state_v1 PSI_mutex_locker_state_v1; - -/** - State data storage for @c start_rwlock_rdwait_v1_t, @c start_rwlock_wrwait_v1_t. - This structure provide temporary storage to a rwlock locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa start_rwlock_rdwait_v1_t - @sa start_rwlock_wrwait_v1_t -*/ -struct PSI_rwlock_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current operation. */ - enum PSI_rwlock_operation m_operation; - /** Current rwlock. */ - struct PSI_rwlock *m_rwlock; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_wait; -}; -typedef struct PSI_rwlock_locker_state_v1 PSI_rwlock_locker_state_v1; - -/** - State data storage for @c start_cond_wait_v1_t. - This structure provide temporary storage to a condition locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa start_cond_wait_v1_t -*/ -struct PSI_cond_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current operation. */ - enum PSI_cond_operation m_operation; - /** Current condition. */ - struct PSI_cond *m_cond; - /** Current mutex. */ - struct PSI_mutex *m_mutex; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_wait; -}; -typedef struct PSI_cond_locker_state_v1 PSI_cond_locker_state_v1; - -/** - State data storage for @c get_thread_file_name_locker_v1_t. - This structure provide temporary storage to a file locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa get_thread_file_name_locker_v1_t - @sa get_thread_file_stream_locker_v1_t - @sa get_thread_file_descriptor_locker_v1_t -*/ -struct PSI_file_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current operation. */ - enum PSI_file_operation m_operation; - /** Current file. */ - struct PSI_file *m_file; - /** Current file name. */ - const char *m_name; - /** Current file class. */ - void *m_class; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Operation number of bytes. */ - size_t m_number_of_bytes; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_wait; -}; -typedef struct PSI_file_locker_state_v1 PSI_file_locker_state_v1; - -/** - State data storage for @c start_metadata_wait_v1_t. - This structure provide temporary storage to a metadata locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa start_metadata_wait_v1_t -*/ -struct PSI_metadata_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current metadata lock. */ - struct PSI_metadata_lock *m_metadata_lock; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_wait; -}; -typedef struct PSI_metadata_locker_state_v1 PSI_metadata_locker_state_v1; - -/* Duplicate of NAME_LEN, to avoid dependency on mysql_com.h */ -#define PSI_SCHEMA_NAME_LEN (64 * 3) - -/** - State data storage for @c get_thread_statement_locker_v1_t, - @c get_thread_statement_locker_v1_t. - This structure provide temporary storage to a statement locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa get_thread_statement_locker_v1_t -*/ -struct PSI_statement_locker_state_v1 -{ - /** Discarded flag. */ - my_bool m_discarded; - /** In prepare flag. */ - my_bool m_in_prepare; - /** Metric, no index used flag. */ - uchar m_no_index_used; - /** Metric, no good index used flag. */ - uchar m_no_good_index_used; - /** Internal state. */ - uint m_flags; - /** Instrumentation class. */ - void *m_class; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_statement; - /** Locked time. */ - ulonglong m_lock_time; - /** Rows sent. */ - ulonglong m_rows_sent; - /** Rows examined. */ - ulonglong m_rows_examined; - /** Metric, temporary tables created on disk. */ - ulong m_created_tmp_disk_tables; - /** Metric, temporary tables created. */ - ulong m_created_tmp_tables; - /** Metric, number of select full join. */ - ulong m_select_full_join; - /** Metric, number of select full range join. */ - ulong m_select_full_range_join; - /** Metric, number of select range. */ - ulong m_select_range; - /** Metric, number of select range check. */ - ulong m_select_range_check; - /** Metric, number of select scan. */ - ulong m_select_scan; - /** Metric, number of sort merge passes. */ - ulong m_sort_merge_passes; - /** Metric, number of sort merge. */ - ulong m_sort_range; - /** Metric, number of sort rows. */ - ulong m_sort_rows; - /** Metric, number of sort scans. */ - ulong m_sort_scan; - /** Statement digest. */ - const struct sql_digest_storage *m_digest; - /** Current schema name. */ - char m_schema_name[PSI_SCHEMA_NAME_LEN]; - /** Length in bytes of @c m_schema_name. */ - uint m_schema_name_length; - /** Statement character set number. */ - uint m_cs_number; - PSI_sp_share *m_parent_sp_share; - PSI_prepared_stmt *m_parent_prepared_stmt; -}; -typedef struct PSI_statement_locker_state_v1 PSI_statement_locker_state_v1; - -/** - State data storage for @c get_thread_transaction_locker_v1_t, - @c get_thread_transaction_locker_v1_t. - This structure provide temporary storage to a transaction locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa get_thread_transaction_locker_v1_t -*/ -struct PSI_transaction_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Instrumentation class. */ - void *m_class; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Internal data. */ - void *m_transaction; - /** True if read-only transaction, false if read-write. */ - my_bool m_read_only; - /** True if transaction is autocommit. */ - my_bool m_autocommit; - /** Number of statements. */ - ulong m_statement_count; - /** Total number of savepoints. */ - ulong m_savepoint_count; - /** Number of rollback_to_savepoint. */ - ulong m_rollback_to_savepoint_count; - /** Number of release_savepoint. */ - ulong m_release_savepoint_count; -}; - -typedef struct PSI_transaction_locker_state_v1 PSI_transaction_locker_state_v1; - -/** - State data storage for @c start_socket_wait_v1_t. - This structure provide temporary storage to a socket locker. - The content of this structure is considered opaque, - the fields are only hints of what an implementation - of the psi interface can use. - This memory is provided by the instrumented code for performance reasons. - @sa start_socket_wait_v1_t -*/ -struct PSI_socket_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current socket. */ - struct PSI_socket *m_socket; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Operation number of bytes. */ - size_t m_number_of_bytes; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Current operation. */ - enum PSI_socket_operation m_operation; - /** Source file. */ - const char* m_src_file; - /** Source line number. */ - int m_src_line; - /** Internal data. */ - void *m_wait; -}; -typedef struct PSI_socket_locker_state_v1 PSI_socket_locker_state_v1; - -struct PSI_sp_locker_state_v1 -{ - /** Internal state. */ - uint m_flags; - /** Current thread. */ - struct PSI_thread *m_thread; - /** Timer start. */ - ulonglong m_timer_start; - /** Timer function. */ - ulonglong (*m_timer)(void); - /** Stored Procedure share. */ - PSI_sp_share* m_sp_share; -}; -typedef struct PSI_sp_locker_state_v1 PSI_sp_locker_state_v1; - -/* Using typedef to make reuse between PSI_v1 and PSI_v2 easier later. */ - -/** - Mutex registration API. - @param category a category name (typically a plugin name) - @param info an array of mutex info to register - @param count the size of the info array -*/ -typedef void (*register_mutex_v1_t) - (const char *category, struct PSI_mutex_info_v1 *info, int count); - -/** - Rwlock registration API. - @param category a category name (typically a plugin name) - @param info an array of rwlock info to register - @param count the size of the info array -*/ -typedef void (*register_rwlock_v1_t) - (const char *category, struct PSI_rwlock_info_v1 *info, int count); - -/** - Cond registration API. - @param category a category name (typically a plugin name) - @param info an array of cond info to register - @param count the size of the info array -*/ -typedef void (*register_cond_v1_t) - (const char *category, struct PSI_cond_info_v1 *info, int count); - -/** - Thread registration API. - @param category a category name (typically a plugin name) - @param info an array of thread info to register - @param count the size of the info array -*/ -typedef void (*register_thread_v1_t) - (const char *category, struct PSI_thread_info_v1 *info, int count); - -/** - File registration API. - @param category a category name (typically a plugin name) - @param info an array of file info to register - @param count the size of the info array -*/ -typedef void (*register_file_v1_t) - (const char *category, struct PSI_file_info_v1 *info, int count); - -/** - Stage registration API. - @param category a category name - @param info an array of stage info to register - @param count the size of the info array -*/ -typedef void (*register_stage_v1_t) - (const char *category, struct PSI_stage_info_v1 **info, int count); - -/** - Statement registration API. - @param category a category name - @param info an array of stage info to register - @param count the size of the info array -*/ -typedef void (*register_statement_v1_t) - (const char *category, struct PSI_statement_info_v1 *info, int count); - -/** - Socket registration API. - @param category a category name (typically a plugin name) - @param info an array of socket info to register - @param count the size of the info array -*/ -typedef void (*register_socket_v1_t) - (const char *category, struct PSI_socket_info_v1 *info, int count); - -/** - Mutex instrumentation initialisation API. - @param key the registered mutex key - @param identity the address of the mutex itself - @return an instrumented mutex -*/ -typedef struct PSI_mutex* (*init_mutex_v1_t) - (PSI_mutex_key key, const void *identity); - -/** - Mutex instrumentation destruction API. - @param mutex the mutex to destroy -*/ -typedef void (*destroy_mutex_v1_t)(struct PSI_mutex *mutex); - -/** - Rwlock instrumentation initialisation API. - @param key the registered rwlock key - @param identity the address of the rwlock itself - @return an instrumented rwlock -*/ -typedef struct PSI_rwlock* (*init_rwlock_v1_t) - (PSI_rwlock_key key, const void *identity); - -/** - Rwlock instrumentation destruction API. - @param rwlock the rwlock to destroy -*/ -typedef void (*destroy_rwlock_v1_t)(struct PSI_rwlock *rwlock); - -/** - Cond instrumentation initialisation API. - @param key the registered key - @param identity the address of the rwlock itself - @return an instrumented cond -*/ -typedef struct PSI_cond* (*init_cond_v1_t) - (PSI_cond_key key, const void *identity); - -/** - Cond instrumentation destruction API. - @param cond the rcond to destroy -*/ -typedef void (*destroy_cond_v1_t)(struct PSI_cond *cond); - -/** - Socket instrumentation initialisation API. - @param key the registered mutex key - @param socket descriptor - @param addr the socket ip address - @param addr_len length of socket ip address - @return an instrumented socket -*/ -typedef struct PSI_socket* (*init_socket_v1_t) - (PSI_socket_key key, const my_socket *fd, - const struct sockaddr *addr, socklen_t addr_len); - -/** - socket instrumentation destruction API. - @param socket the socket to destroy -*/ -typedef void (*destroy_socket_v1_t)(struct PSI_socket *socket); - -/** - Acquire a table share instrumentation. - @param temporary True for temporary tables - @param share The SQL layer table share - @return a table share instrumentation, or NULL -*/ -typedef struct PSI_table_share* (*get_table_share_v1_t) - (my_bool temporary, struct TABLE_SHARE *share); - -/** - Release a table share. - @param info the table share to release -*/ -typedef void (*release_table_share_v1_t)(struct PSI_table_share *share); - -/** - Drop a table share. - @param temporary True for temporary tables - @param schema_name the table schema name - @param schema_name_length the table schema name length - @param table_name the table name - @param table_name_length the table name length -*/ -typedef void (*drop_table_share_v1_t) - (my_bool temporary, const char *schema_name, int schema_name_length, - const char *table_name, int table_name_length); - -/** - Open an instrumentation table handle. - @param share the table to open - @param identity table handle identity - @return a table handle, or NULL -*/ -typedef struct PSI_table* (*open_table_v1_t) - (struct PSI_table_share *share, const void *identity); - -/** - Unbind a table handle from the current thread. - This operation happens when an opened table is added to the open table cache. - @param table the table to unbind -*/ -typedef void (*unbind_table_v1_t) - (struct PSI_table *table); - -/** - Rebind a table handle to the current thread. - This operation happens when a table from the open table cache - is reused for a thread. - @param table the table to unbind -*/ -typedef PSI_table* (*rebind_table_v1_t) - (PSI_table_share *share, const void *identity, PSI_table *table); - -/** - Close an instrumentation table handle. - Note that the table handle is invalid after this call. - @param table the table handle to close -*/ -typedef void (*close_table_v1_t)(struct TABLE_SHARE *server_share, - struct PSI_table *table); - -/** - Create a file instrumentation for a created file. - This method does not create the file itself, but is used to notify the - instrumentation interface that a file was just created. - @param key the file instrumentation key for this file - @param name the file name - @param file the file handle -*/ -typedef void (*create_file_v1_t)(PSI_file_key key, const char *name, - File file); - -/** - Spawn a thread. - This method creates a new thread, with instrumentation. - @param key the instrumentation key for this thread - @param thread the resulting thread - @param attr the thread attributes - @param start_routine the thread start routine - @param arg the thread start routine argument -*/ -typedef int (*spawn_thread_v1_t)(PSI_thread_key key, - my_thread_handle *thread, - const my_thread_attr_t *attr, - void *(*start_routine)(void*), void *arg); - -/** - Create instrumentation for a thread. - @param key the registered key - @param identity an address typical of the thread - @return an instrumented thread -*/ -typedef struct PSI_thread* (*new_thread_v1_t) - (PSI_thread_key key, const void *identity, ulonglong thread_id); - -/** - Assign a THD to an instrumented thread. - @param thread the instrumented thread - @param THD the sql layer THD to assign -*/ -typedef void (*set_thread_THD_v1_t)(struct PSI_thread *thread, - THD *thd); - -/** - Assign an id to an instrumented thread. - @param thread the instrumented thread - @param id the id to assign -*/ -typedef void (*set_thread_id_v1_t)(struct PSI_thread *thread, - ulonglong id); - -/** - Assign the current operating system thread id to an instrumented thread. - The operating system task id is obtained from @c gettid() - @param thread the instrumented thread -*/ -typedef void (*set_thread_os_id_v1_t)(struct PSI_thread *thread); - -/** - Get the instrumentation for the running thread. - For this function to return a result, - the thread instrumentation must have been attached to the - running thread using @c set_thread() - @return the instrumentation for the running thread -*/ -typedef struct PSI_thread* (*get_thread_v1_t)(void); - -/** - Assign a user name to the instrumented thread. - @param user the user name - @param user_len the user name length -*/ -typedef void (*set_thread_user_v1_t)(const char *user, int user_len); - -/** - Assign a user name and host name to the instrumented thread. - @param user the user name - @param user_len the user name length - @param host the host name - @param host_len the host name length -*/ -typedef void (*set_thread_account_v1_t)(const char *user, int user_len, - const char *host, int host_len); - -/** - Assign a current database to the instrumented thread. - @param db the database name - @param db_len the database name length -*/ -typedef void (*set_thread_db_v1_t)(const char* db, int db_len); - -/** - Assign a current command to the instrumented thread. - @param command the current command -*/ -typedef void (*set_thread_command_v1_t)(int command); - -/** - Assign a connection type to the instrumented thread. - @param conn_type the connection type -*/ -typedef void (*set_connection_type_v1_t)(opaque_vio_type conn_type); - - -/** - Assign a start time to the instrumented thread. - @param start_time the thread start time -*/ -typedef void (*set_thread_start_time_v1_t)(time_t start_time); - -/** - Assign a state to the instrumented thread. - @param state the thread state -*/ -typedef void (*set_thread_state_v1_t)(const char* state); - -/** - Assign a process info to the instrumented thread. - @param info the process into string - @param info_len the process into string length -*/ -typedef void (*set_thread_info_v1_t)(const char* info, uint info_len); - -/** - Attach a thread instrumentation to the running thread. - In case of thread pools, this method should be called when - a worker thread picks a work item and runs it. - Also, this method should be called if the instrumented code does not - keep the pointer returned by @c new_thread() and relies on @c get_thread() - instead. - @param thread the thread instrumentation -*/ -typedef void (*set_thread_v1_t)(struct PSI_thread *thread); - -/** Delete the current thread instrumentation. */ -typedef void (*delete_current_thread_v1_t)(void); - -/** Delete a thread instrumentation. */ -typedef void (*delete_thread_v1_t)(struct PSI_thread *thread); - -/** - Get a file instrumentation locker, for opening or creating a file. - @param state data storage for the locker - @param key the file instrumentation key - @param op the operation to perform - @param name the file name - @param identity a pointer representative of this file. - @return a file locker, or NULL -*/ -typedef struct PSI_file_locker* (*get_thread_file_name_locker_v1_t) - (struct PSI_file_locker_state_v1 *state, - PSI_file_key key, enum PSI_file_operation op, const char *name, - const void *identity); - -/** - Get a file stream instrumentation locker. - @param state data storage for the locker - @param file the file stream to access - @param op the operation to perform - @return a file locker, or NULL -*/ -typedef struct PSI_file_locker* (*get_thread_file_stream_locker_v1_t) - (struct PSI_file_locker_state_v1 *state, - struct PSI_file *file, enum PSI_file_operation op); - -/** - Get a file instrumentation locker. - @param state data storage for the locker - @param file the file descriptor to access - @param op the operation to perform - @return a file locker, or NULL -*/ -typedef struct PSI_file_locker* (*get_thread_file_descriptor_locker_v1_t) - (struct PSI_file_locker_state_v1 *state, - File file, enum PSI_file_operation op); - -/** - Record a mutex instrumentation unlock event. - @param mutex the mutex instrumentation -*/ -typedef void (*unlock_mutex_v1_t) - (struct PSI_mutex *mutex); - -/** - Record a rwlock instrumentation unlock event. - @param rwlock the rwlock instrumentation -*/ -typedef void (*unlock_rwlock_v1_t) - (struct PSI_rwlock *rwlock); - -/** - Record a condition instrumentation signal event. - @param cond the cond instrumentation -*/ -typedef void (*signal_cond_v1_t) - (struct PSI_cond *cond); - -/** - Record a condition instrumentation broadcast event. - @param cond the cond instrumentation -*/ -typedef void (*broadcast_cond_v1_t) - (struct PSI_cond *cond); - -/** - Record an idle instrumentation wait start event. - @param state data storage for the locker - @param file the source file name - @param line the source line number - @return an idle locker, or NULL -*/ -typedef struct PSI_idle_locker* (*start_idle_wait_v1_t) - (struct PSI_idle_locker_state_v1 *state, const char *src_file, uint src_line); - -/** - Record an idle instrumentation wait end event. - @param locker a thread locker for the running thread -*/ -typedef void (*end_idle_wait_v1_t) - (struct PSI_idle_locker *locker); - -/** - Record a mutex instrumentation wait start event. - @param state data storage for the locker - @param mutex the instrumented mutex to lock - @param op the operation to perform - @param file the source file name - @param line the source line number - @return a mutex locker, or NULL -*/ -typedef struct PSI_mutex_locker* (*start_mutex_wait_v1_t) - (struct PSI_mutex_locker_state_v1 *state, - struct PSI_mutex *mutex, - enum PSI_mutex_operation op, - const char *src_file, uint src_line); - -/** - Record a mutex instrumentation wait end event. - @param locker a thread locker for the running thread - @param rc the wait operation return code -*/ -typedef void (*end_mutex_wait_v1_t) - (struct PSI_mutex_locker *locker, int rc); - -/** - Record a rwlock instrumentation read wait start event. - @param locker a thread locker for the running thread - @param must must block: 1 for lock, 0 for trylock -*/ -typedef struct PSI_rwlock_locker* (*start_rwlock_rdwait_v1_t) - (struct PSI_rwlock_locker_state_v1 *state, - struct PSI_rwlock *rwlock, - enum PSI_rwlock_operation op, - const char *src_file, uint src_line); - -/** - Record a rwlock instrumentation read wait end event. - @param locker a thread locker for the running thread - @param rc the wait operation return code -*/ -typedef void (*end_rwlock_rdwait_v1_t) - (struct PSI_rwlock_locker *locker, int rc); - -/** - Record a rwlock instrumentation write wait start event. - @param locker a thread locker for the running thread - @param must must block: 1 for lock, 0 for trylock -*/ -typedef struct PSI_rwlock_locker* (*start_rwlock_wrwait_v1_t) - (struct PSI_rwlock_locker_state_v1 *state, - struct PSI_rwlock *rwlock, - enum PSI_rwlock_operation op, - const char *src_file, uint src_line); - -/** - Record a rwlock instrumentation write wait end event. - @param locker a thread locker for the running thread - @param rc the wait operation return code -*/ -typedef void (*end_rwlock_wrwait_v1_t) - (struct PSI_rwlock_locker *locker, int rc); - -/** - Record a condition instrumentation wait start event. - @param locker a thread locker for the running thread - @param must must block: 1 for wait, 0 for timedwait -*/ -typedef struct PSI_cond_locker* (*start_cond_wait_v1_t) - (struct PSI_cond_locker_state_v1 *state, - struct PSI_cond *cond, - struct PSI_mutex *mutex, - enum PSI_cond_operation op, - const char *src_file, uint src_line); - -/** - Record a condition instrumentation wait end event. - @param locker a thread locker for the running thread - @param rc the wait operation return code -*/ -typedef void (*end_cond_wait_v1_t) - (struct PSI_cond_locker *locker, int rc); - -/** - Record a table instrumentation io wait start event. - @param locker a table locker for the running thread - @param file the source file name - @param line the source line number -*/ -typedef struct PSI_table_locker* (*start_table_io_wait_v1_t) - (struct PSI_table_locker_state *state, - struct PSI_table *table, - enum PSI_table_io_operation op, - uint index, - const char *src_file, uint src_line); - -/** - Record a table instrumentation io wait end event. - @param locker a table locker for the running thread - @param numrows the number of rows involved in io -*/ -typedef void (*end_table_io_wait_v1_t) - (struct PSI_table_locker *locker, - ulonglong numrows); - -/** - Record a table instrumentation lock wait start event. - @param locker a table locker for the running thread - @param file the source file name - @param line the source line number -*/ -typedef struct PSI_table_locker* (*start_table_lock_wait_v1_t) - (struct PSI_table_locker_state *state, - struct PSI_table *table, - enum PSI_table_lock_operation op, - ulong flags, - const char *src_file, uint src_line); - -/** - Record a table instrumentation lock wait end event. - @param locker a table locker for the running thread -*/ -typedef void (*end_table_lock_wait_v1_t)(struct PSI_table_locker *locker); - -typedef void (*unlock_table_v1_t)(struct PSI_table *table); - -/** - Start a file instrumentation open operation. - @param locker the file locker - @param op the operation to perform - @param src_file the source file name - @param src_line the source line number -*/ -typedef void (*start_file_open_wait_v1_t) - (struct PSI_file_locker *locker, const char *src_file, uint src_line); - -/** - End a file instrumentation open operation, for file streams. - @param locker the file locker. - @param result the opened file (NULL indicates failure, non NULL success). - @return an instrumented file handle -*/ -typedef struct PSI_file* (*end_file_open_wait_v1_t) - (struct PSI_file_locker *locker, void *result); - -/** - End a file instrumentation open operation, for non stream files. - @param locker the file locker. - @param file the file number assigned by open() or create() for this file. -*/ -typedef void (*end_file_open_wait_and_bind_to_descriptor_v1_t) - (struct PSI_file_locker *locker, File file); - -/** - End a file instrumentation open operation, for non stream temporary files. - @param locker the file locker. - @param file the file number assigned by open() or create() for this file. - @param filename the file name generated during temporary file creation. -*/ -typedef void (*end_temp_file_open_wait_and_bind_to_descriptor_v1_t) - (struct PSI_file_locker *locker, File file, const char *filename); - -/** - Record a file instrumentation start event. - @param locker a file locker for the running thread - @param op file operation to be performed - @param count the number of bytes requested, or 0 if not applicable - @param src_file the source file name - @param src_line the source line number -*/ -typedef void (*start_file_wait_v1_t) - (struct PSI_file_locker *locker, size_t count, - const char *src_file, uint src_line); - -/** - Record a file instrumentation end event. - Note that for file close operations, the instrumented file handle - associated with the file (which was provided to obtain a locker) - is invalid after this call. - @param locker a file locker for the running thread - @param count the number of bytes actually used in the operation, - or 0 if not applicable, or -1 if the operation failed - @sa get_thread_file_name_locker - @sa get_thread_file_stream_locker - @sa get_thread_file_descriptor_locker -*/ -typedef void (*end_file_wait_v1_t) - (struct PSI_file_locker *locker, size_t count); - -/** - Start a file instrumentation close operation. - @param locker the file locker - @param op the operation to perform - @param src_file the source file name - @param src_line the source line number -*/ -typedef void (*start_file_close_wait_v1_t) - (struct PSI_file_locker *locker, const char *src_file, uint src_line); - -/** - End a file instrumentation close operation. - @param locker the file locker. - @param rc the close operation return code (0 for success). - @return an instrumented file handle -*/ -typedef void (*end_file_close_wait_v1_t) - (struct PSI_file_locker *locker, int rc); - -/** - Start a new stage, and implicitly end the previous stage. - @param key the key of the new stage - @param src_file the source file name - @param src_line the source line number - @return the new stage progress -*/ -typedef PSI_stage_progress* (*start_stage_v1_t) - (PSI_stage_key key, const char *src_file, int src_line); - -typedef PSI_stage_progress* (*get_current_stage_progress_v1_t)(void); - -/** End the current stage. */ -typedef void (*end_stage_v1_t) (void); - -/** - Get a statement instrumentation locker. - @param state data storage for the locker - @param key the statement instrumentation key - @param charset client character set - @return a statement locker, or NULL -*/ -typedef struct PSI_statement_locker* (*get_thread_statement_locker_v1_t) - (struct PSI_statement_locker_state_v1 *state, - PSI_statement_key key, const void *charset, PSI_sp_share *sp_share); - -/** - Refine a statement locker to a more specific key. - Note that only events declared mutable can be refined. - @param the statement locker for the current event - @param key the new key for the event - @sa PSI_FLAG_MUTABLE -*/ -typedef struct PSI_statement_locker* (*refine_statement_v1_t) - (struct PSI_statement_locker *locker, - PSI_statement_key key); - -/** - Start a new statement event. - @param locker the statement locker for this event - @param db the active database name for this statement - @param db_length the active database name length for this statement - @param src_file source file name - @param src_line source line number -*/ -typedef void (*start_statement_v1_t) - (struct PSI_statement_locker *locker, - const char *db, uint db_length, - const char *src_file, uint src_line); - -/** - Set the statement text for a statement event. - @param locker the current statement locker - @param text the statement text - @param text_len the statement text length -*/ -typedef void (*set_statement_text_v1_t) - (struct PSI_statement_locker *locker, - const char *text, uint text_len); - -/** - Set a statement event lock time. - @param locker the statement locker - @param lock_time the locked time, in microseconds -*/ -typedef void (*set_statement_lock_time_t) - (struct PSI_statement_locker *locker, ulonglong lock_time); - -/** - Set a statement event rows sent metric. - @param locker the statement locker - @param count the number of rows sent -*/ -typedef void (*set_statement_rows_sent_t) - (struct PSI_statement_locker *locker, ulonglong count); - -/** - Set a statement event rows examined metric. - @param locker the statement locker - @param count the number of rows examined -*/ -typedef void (*set_statement_rows_examined_t) - (struct PSI_statement_locker *locker, ulonglong count); - -/** - Increment a statement event "created tmp disk tables" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_created_tmp_disk_tables_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "created tmp tables" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_created_tmp_tables_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "select full join" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_select_full_join_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "select full range join" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_select_full_range_join_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "select range join" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_select_range_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "select range check" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_select_range_check_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "select scan" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_select_scan_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "sort merge passes" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_sort_merge_passes_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "sort range" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_sort_range_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "sort rows" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_sort_rows_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Increment a statement event "sort scan" metric. - @param locker the statement locker - @param count the metric increment value -*/ -typedef void (*inc_statement_sort_scan_t) - (struct PSI_statement_locker *locker, ulong count); - -/** - Set a statement event "no index used" metric. - @param locker the statement locker - @param count the metric value -*/ -typedef void (*set_statement_no_index_used_t) - (struct PSI_statement_locker *locker); - -/** - Set a statement event "no good index used" metric. - @param locker the statement locker - @param count the metric value -*/ -typedef void (*set_statement_no_good_index_used_t) - (struct PSI_statement_locker *locker); - -/** - End a statement event. - @param locker the statement locker - @param stmt_da the statement diagnostics area. - @sa Diagnostics_area -*/ -typedef void (*end_statement_v1_t) - (struct PSI_statement_locker *locker, void *stmt_da); - -/** - Get a transaction instrumentation locker. - @param state data storage for the locker - @param xid the xid for this transaction - @param trxid the InnoDB transaction id - @param iso_level isolation level for this transaction - @param read_only true if transaction access mode is read-only - @param autocommit true if transaction is autocommit - @return a transaction locker, or NULL -*/ -typedef struct PSI_transaction_locker* (*get_thread_transaction_locker_v1_t) - (struct PSI_transaction_locker_state_v1 *state, const void *xid, - const ulonglong *trxid, int isolation_level, my_bool read_only, - my_bool autocommit); - -/** - Start a new transaction event. - @param locker the transaction locker for this event - @param src_file source file name - @param src_line source line number -*/ -typedef void (*start_transaction_v1_t) - (struct PSI_transaction_locker *locker, - const char *src_file, uint src_line); - -/** - Set the transaction xid. - @param locker the transaction locker for this event - @param xid the id of the XA transaction - #param xa_state is the state of the XA transaction -*/ -typedef void (*set_transaction_xid_v1_t) - (struct PSI_transaction_locker *locker, - const void *xid, int xa_state); - -/** - Set the state of the XA transaction. - @param locker the transaction locker for this event - @param xa_state the new state of the xa transaction -*/ -typedef void (*set_transaction_xa_state_v1_t) - (struct PSI_transaction_locker *locker, - int xa_state); - -/** - Set the transaction gtid. - @param locker the transaction locker for this event - @param sid the source id for the transaction, mapped from sidno - @param gtid_spec the gtid specifier for the transaction -*/ -typedef void (*set_transaction_gtid_v1_t) - (struct PSI_transaction_locker *locker, - const void *sid, const void *gtid_spec); - -/** - Set the transaction trx_id. - @param locker the transaction locker for this event - @param trxid the storage engine transaction ID -*/ -typedef void (*set_transaction_trxid_v1_t) - (struct PSI_transaction_locker *locker, - const ulonglong *trxid); - -/** - Increment a transaction event savepoint count. - @param locker the transaction locker - @param count the increment value -*/ -typedef void (*inc_transaction_savepoints_v1_t) - (struct PSI_transaction_locker *locker, ulong count); - -/** - Increment a transaction event rollback to savepoint count. - @param locker the transaction locker - @param count the increment value -*/ -typedef void (*inc_transaction_rollback_to_savepoint_v1_t) - (struct PSI_transaction_locker *locker, ulong count); - -/** - Increment a transaction event release savepoint count. - @param locker the transaction locker - @param count the increment value -*/ -typedef void (*inc_transaction_release_savepoint_v1_t) - (struct PSI_transaction_locker *locker, ulong count); - -/** - Commit or rollback the transaction. - @param locker the transaction locker for this event - @param commit true if transaction was committed, false if rolled back -*/ -typedef void (*end_transaction_v1_t) - (struct PSI_transaction_locker *locker, - my_bool commit); - -/** - Record a socket instrumentation start event. - @param locker a socket locker for the running thread - @param op socket operation to be performed - @param count the number of bytes requested, or 0 if not applicable - @param src_file the source file name - @param src_line the source line number -*/ -typedef struct PSI_socket_locker* (*start_socket_wait_v1_t) - (struct PSI_socket_locker_state_v1 *state, - struct PSI_socket *socket, - enum PSI_socket_operation op, - size_t count, - const char *src_file, uint src_line); - -/** - Record a socket instrumentation end event. - Note that for socket close operations, the instrumented socket handle - associated with the socket (which was provided to obtain a locker) - is invalid after this call. - @param locker a socket locker for the running thread - @param count the number of bytes actually used in the operation, - or 0 if not applicable, or -1 if the operation failed - @sa get_thread_socket_locker -*/ -typedef void (*end_socket_wait_v1_t) - (struct PSI_socket_locker *locker, size_t count); - -/** - Set the socket state for an instrumented socket. - @param socket the instrumented socket - @param state socket state - */ -typedef void (*set_socket_state_v1_t)(struct PSI_socket *socket, - enum PSI_socket_state state); - -/** - Set the socket info for an instrumented socket. - @param socket the instrumented socket - @param fd the socket descriptor - @param addr the socket ip address - @param addr_len length of socket ip address - @param thread_id associated thread id -*/ -typedef void (*set_socket_info_v1_t)(struct PSI_socket *socket, - const my_socket *fd, - const struct sockaddr *addr, - socklen_t addr_len); - -/** - Bind a socket to the thread that owns it. - @param socket instrumented socket -*/ -typedef void (*set_socket_thread_owner_v1_t)(struct PSI_socket *socket); - -/** - Get a prepare statement. - @param locker a statement locker for the running thread. -*/ -typedef PSI_prepared_stmt* (*create_prepared_stmt_v1_t) - (void *identity, uint stmt_id, PSI_statement_locker *locker, - const char *stmt_name, size_t stmt_name_length, - const char *name, size_t length); - -/** - destroy a prepare statement. - @param prepared_stmt prepared statement. -*/ -typedef void (*destroy_prepared_stmt_v1_t) - (PSI_prepared_stmt *prepared_stmt); - -/** - repreare a prepare statement. - @param prepared_stmt prepared statement. -*/ -typedef void (*reprepare_prepared_stmt_v1_t) - (PSI_prepared_stmt *prepared_stmt); - -/** - Record a prepare statement instrumentation execute event. - @param locker a statement locker for the running thread. - @param prepared_stmt prepared statement. -*/ -typedef void (*execute_prepared_stmt_v1_t) - (PSI_statement_locker *locker, PSI_prepared_stmt* prepared_stmt); - -/** - Get a digest locker for the current statement. - @param locker a statement locker for the running thread -*/ -typedef struct PSI_digest_locker * (*digest_start_v1_t) - (struct PSI_statement_locker *locker); - -/** - Add a token to the current digest instrumentation. - @param locker a digest locker for the current statement - @param token the lexical token to add - @param yylval the lexical token attributes -*/ -typedef void (*digest_end_v1_t) - (struct PSI_digest_locker *locker, const struct sql_digest_storage *digest); - -typedef PSI_sp_locker* (*start_sp_v1_t) - (struct PSI_sp_locker_state_v1 *state, struct PSI_sp_share* sp_share); - -typedef void (*end_sp_v1_t) - (struct PSI_sp_locker *locker); - -typedef void (*drop_sp_v1_t) - (uint object_type, - const char *schema_name, uint schema_name_length, - const char *object_name, uint object_name_length); - -/** - Acquire a sp share instrumentation. - @param type of stored program - @param schema name of stored program - @param name of stored program - @return a stored program share instrumentation, or NULL -*/ -typedef struct PSI_sp_share* (*get_sp_share_v1_t) - (uint object_type, - const char *schema_name, uint schema_name_length, - const char *object_name, uint object_name_length); - -/** - Release a stored program share. - @param info the stored program share to release -*/ -typedef void (*release_sp_share_v1_t)(struct PSI_sp_share *share); - -typedef PSI_metadata_lock* (*create_metadata_lock_v1_t) - (void *identity, - const MDL_key *key, - opaque_mdl_type mdl_type, - opaque_mdl_duration mdl_duration, - opaque_mdl_status mdl_status, - const char *src_file, - uint src_line); - -typedef void (*set_metadata_lock_status_v1_t)(PSI_metadata_lock *lock, - opaque_mdl_status mdl_status); - -typedef void (*destroy_metadata_lock_v1_t)(PSI_metadata_lock *lock); - -typedef struct PSI_metadata_locker* (*start_metadata_wait_v1_t) - (struct PSI_metadata_locker_state_v1 *state, - struct PSI_metadata_lock *mdl, - const char *src_file, uint src_line); - -typedef void (*end_metadata_wait_v1_t) - (struct PSI_metadata_locker *locker, int rc); - -/** - Stores an array of connection attributes - @param buffer char array of length encoded connection attributes - in network format - @param length length of the data in buffer - @param from_cs charset in which @c buffer is encoded - @return state - @retval non_0 attributes truncated - @retval 0 stored the attribute -*/ -typedef int (*set_thread_connect_attrs_v1_t)(const char *buffer, uint length, - const void *from_cs); - -/** - Performance Schema Interface, version 1. - @since PSI_VERSION_1 -*/ -struct PSI_v1 -{ - /** @sa register_mutex_v1_t. */ - register_mutex_v1_t register_mutex; - /** @sa register_rwlock_v1_t. */ - register_rwlock_v1_t register_rwlock; - /** @sa register_cond_v1_t. */ - register_cond_v1_t register_cond; - /** @sa register_thread_v1_t. */ - register_thread_v1_t register_thread; - /** @sa register_file_v1_t. */ - register_file_v1_t register_file; - /** @sa register_stage_v1_t. */ - register_stage_v1_t register_stage; - /** @sa register_statement_v1_t. */ - register_statement_v1_t register_statement; - /** @sa register_socket_v1_t. */ - register_socket_v1_t register_socket; - /** @sa init_mutex_v1_t. */ - init_mutex_v1_t init_mutex; - /** @sa destroy_mutex_v1_t. */ - destroy_mutex_v1_t destroy_mutex; - /** @sa init_rwlock_v1_t. */ - init_rwlock_v1_t init_rwlock; - /** @sa destroy_rwlock_v1_t. */ - destroy_rwlock_v1_t destroy_rwlock; - /** @sa init_cond_v1_t. */ - init_cond_v1_t init_cond; - /** @sa destroy_cond_v1_t. */ - destroy_cond_v1_t destroy_cond; - /** @sa init_socket_v1_t. */ - init_socket_v1_t init_socket; - /** @sa destroy_socket_v1_t. */ - destroy_socket_v1_t destroy_socket; - - /** @sa get_table_share_v1_t. */ - get_table_share_v1_t get_table_share; - /** @sa release_table_share_v1_t. */ - release_table_share_v1_t release_table_share; - /** @sa drop_table_share_v1_t. */ - drop_table_share_v1_t drop_table_share; - /** @sa open_table_v1_t. */ - open_table_v1_t open_table; - /** @sa unbind_table_v1_t. */ - unbind_table_v1_t unbind_table; - /** @sa rebind_table_v1_t. */ - rebind_table_v1_t rebind_table; - /** @sa close_table_v1_t. */ - close_table_v1_t close_table; - /** @sa create_file_v1_t. */ - create_file_v1_t create_file; - /** @sa spawn_thread_v1_t. */ - spawn_thread_v1_t spawn_thread; - /** @sa new_thread_v1_t. */ - new_thread_v1_t new_thread; - /** @sa set_thread_id_v1_t. */ - set_thread_id_v1_t set_thread_id; - /** @sa set_thread_THD_v1_t. */ - set_thread_THD_v1_t set_thread_THD; - /** @sa set_thread_os_id_v1_t. */ - set_thread_os_id_v1_t set_thread_os_id; - /** @sa get_thread_v1_t. */ - get_thread_v1_t get_thread; - /** @sa set_thread_user_v1_t. */ - set_thread_user_v1_t set_thread_user; - /** @sa set_thread_account_v1_t. */ - set_thread_account_v1_t set_thread_account; - /** @sa set_thread_db_v1_t. */ - set_thread_db_v1_t set_thread_db; - /** @sa set_thread_command_v1_t. */ - set_thread_command_v1_t set_thread_command; - /** @sa set_connection_type_v1_t. */ - set_connection_type_v1_t set_connection_type; - /** @sa set_thread_start_time_v1_t. */ - set_thread_start_time_v1_t set_thread_start_time; - /** @sa set_thread_state_v1_t. */ - set_thread_state_v1_t set_thread_state; - /** @sa set_thread_info_v1_t. */ - set_thread_info_v1_t set_thread_info; - /** @sa set_thread_v1_t. */ - set_thread_v1_t set_thread; - /** @sa delete_current_thread_v1_t. */ - delete_current_thread_v1_t delete_current_thread; - /** @sa delete_thread_v1_t. */ - delete_thread_v1_t delete_thread; - /** @sa get_thread_file_name_locker_v1_t. */ - get_thread_file_name_locker_v1_t get_thread_file_name_locker; - /** @sa get_thread_file_stream_locker_v1_t. */ - get_thread_file_stream_locker_v1_t get_thread_file_stream_locker; - /** @sa get_thread_file_descriptor_locker_v1_t. */ - get_thread_file_descriptor_locker_v1_t get_thread_file_descriptor_locker; - /** @sa unlock_mutex_v1_t. */ - unlock_mutex_v1_t unlock_mutex; - /** @sa unlock_rwlock_v1_t. */ - unlock_rwlock_v1_t unlock_rwlock; - /** @sa signal_cond_v1_t. */ - signal_cond_v1_t signal_cond; - /** @sa broadcast_cond_v1_t. */ - broadcast_cond_v1_t broadcast_cond; - /** @sa start_idle_wait_v1_t. */ - start_idle_wait_v1_t start_idle_wait; - /** @sa end_idle_wait_v1_t. */ - end_idle_wait_v1_t end_idle_wait; - /** @sa start_mutex_wait_v1_t. */ - start_mutex_wait_v1_t start_mutex_wait; - /** @sa end_mutex_wait_v1_t. */ - end_mutex_wait_v1_t end_mutex_wait; - /** @sa start_rwlock_rdwait_v1_t. */ - start_rwlock_rdwait_v1_t start_rwlock_rdwait; - /** @sa end_rwlock_rdwait_v1_t. */ - end_rwlock_rdwait_v1_t end_rwlock_rdwait; - /** @sa start_rwlock_wrwait_v1_t. */ - start_rwlock_wrwait_v1_t start_rwlock_wrwait; - /** @sa end_rwlock_wrwait_v1_t. */ - end_rwlock_wrwait_v1_t end_rwlock_wrwait; - /** @sa start_cond_wait_v1_t. */ - start_cond_wait_v1_t start_cond_wait; - /** @sa end_cond_wait_v1_t. */ - end_cond_wait_v1_t end_cond_wait; - /** @sa start_table_io_wait_v1_t. */ - start_table_io_wait_v1_t start_table_io_wait; - /** @sa end_table_io_wait_v1_t. */ - end_table_io_wait_v1_t end_table_io_wait; - /** @sa start_table_lock_wait_v1_t. */ - start_table_lock_wait_v1_t start_table_lock_wait; - /** @sa end_table_lock_wait_v1_t. */ - end_table_lock_wait_v1_t end_table_lock_wait; - /** @sa start_file_open_wait_v1_t. */ - start_file_open_wait_v1_t start_file_open_wait; - /** @sa end_file_open_wait_v1_t. */ - end_file_open_wait_v1_t end_file_open_wait; - /** @sa end_file_open_wait_and_bind_to_descriptor_v1_t. */ - end_file_open_wait_and_bind_to_descriptor_v1_t - end_file_open_wait_and_bind_to_descriptor; - /** @sa end_temp_file_open_wait_and_bind_to_descriptor_v1_t. */ - end_temp_file_open_wait_and_bind_to_descriptor_v1_t - end_temp_file_open_wait_and_bind_to_descriptor; - /** @sa start_file_wait_v1_t. */ - start_file_wait_v1_t start_file_wait; - /** @sa end_file_wait_v1_t. */ - end_file_wait_v1_t end_file_wait; - /** @sa start_file_close_wait_v1_t. */ - start_file_close_wait_v1_t start_file_close_wait; - /** @sa end_file_close_wait_v1_t. */ - end_file_close_wait_v1_t end_file_close_wait; - /** @sa start_stage_v1_t. */ - start_stage_v1_t start_stage; - /** @sa get_current_stage_progress_v1_t. */ - get_current_stage_progress_v1_t get_current_stage_progress; - /** @sa end_stage_v1_t. */ - end_stage_v1_t end_stage; - /** @sa get_thread_statement_locker_v1_t. */ - get_thread_statement_locker_v1_t get_thread_statement_locker; - /** @sa refine_statement_v1_t. */ - refine_statement_v1_t refine_statement; - /** @sa start_statement_v1_t. */ - start_statement_v1_t start_statement; - /** @sa set_statement_text_v1_t. */ - set_statement_text_v1_t set_statement_text; - /** @sa set_statement_lock_time_t. */ - set_statement_lock_time_t set_statement_lock_time; - /** @sa set_statement_rows_sent_t. */ - set_statement_rows_sent_t set_statement_rows_sent; - /** @sa set_statement_rows_examined_t. */ - set_statement_rows_examined_t set_statement_rows_examined; - /** @sa inc_statement_created_tmp_disk_tables. */ - inc_statement_created_tmp_disk_tables_t inc_statement_created_tmp_disk_tables; - /** @sa inc_statement_created_tmp_tables. */ - inc_statement_created_tmp_tables_t inc_statement_created_tmp_tables; - /** @sa inc_statement_select_full_join. */ - inc_statement_select_full_join_t inc_statement_select_full_join; - /** @sa inc_statement_select_full_range_join. */ - inc_statement_select_full_range_join_t inc_statement_select_full_range_join; - /** @sa inc_statement_select_range. */ - inc_statement_select_range_t inc_statement_select_range; - /** @sa inc_statement_select_range_check. */ - inc_statement_select_range_check_t inc_statement_select_range_check; - /** @sa inc_statement_select_scan. */ - inc_statement_select_scan_t inc_statement_select_scan; - /** @sa inc_statement_sort_merge_passes. */ - inc_statement_sort_merge_passes_t inc_statement_sort_merge_passes; - /** @sa inc_statement_sort_range. */ - inc_statement_sort_range_t inc_statement_sort_range; - /** @sa inc_statement_sort_rows. */ - inc_statement_sort_rows_t inc_statement_sort_rows; - /** @sa inc_statement_sort_scan. */ - inc_statement_sort_scan_t inc_statement_sort_scan; - /** @sa set_statement_no_index_used. */ - set_statement_no_index_used_t set_statement_no_index_used; - /** @sa set_statement_no_good_index_used. */ - set_statement_no_good_index_used_t set_statement_no_good_index_used; - /** @sa end_statement_v1_t. */ - end_statement_v1_t end_statement; - /** @sa get_thread_transaction_locker_v1_t. */ - get_thread_transaction_locker_v1_t get_thread_transaction_locker; - /** @sa start_transaction_v1_t. */ - start_transaction_v1_t start_transaction; - /** @sa set_transaction_xid_v1_t. */ - set_transaction_xid_v1_t set_transaction_xid; - /** @sa set_transaction_xa_state_v1_t. */ - set_transaction_xa_state_v1_t set_transaction_xa_state; - /** @sa set_transaction_gtid_v1_t. */ - set_transaction_gtid_v1_t set_transaction_gtid; - /** @sa set_transaction_trxid_v1_t. */ - set_transaction_trxid_v1_t set_transaction_trxid; - /** @sa inc_transaction_savepoints_v1_t. */ - inc_transaction_savepoints_v1_t inc_transaction_savepoints; - /** @sa inc_transaction_rollback_to_savepoint_v1_t. */ - inc_transaction_rollback_to_savepoint_v1_t inc_transaction_rollback_to_savepoint; - /** @sa inc_transaction_release_savepoint_v1_t. */ - inc_transaction_release_savepoint_v1_t inc_transaction_release_savepoint; - /** @sa end_transaction_v1_t. */ - end_transaction_v1_t end_transaction; - /** @sa start_socket_wait_v1_t. */ - start_socket_wait_v1_t start_socket_wait; - /** @sa end_socket_wait_v1_t. */ - end_socket_wait_v1_t end_socket_wait; - /** @sa set_socket_state_v1_t. */ - set_socket_state_v1_t set_socket_state; - /** @sa set_socket_info_v1_t. */ - set_socket_info_v1_t set_socket_info; - /** @sa set_socket_thread_owner_v1_t. */ - set_socket_thread_owner_v1_t set_socket_thread_owner; - /** @sa create_prepared_stmt_v1_t. */ - create_prepared_stmt_v1_t create_prepared_stmt; - /** @sa destroy_prepared_stmt_v1_t. */ - destroy_prepared_stmt_v1_t destroy_prepared_stmt; - /** @sa reprepare_prepared_stmt_v1_t. */ - reprepare_prepared_stmt_v1_t reprepare_prepared_stmt; - /** @sa execute_prepared_stmt_v1_t. */ - execute_prepared_stmt_v1_t execute_prepared_stmt; - /** @sa digest_start_v1_t. */ - digest_start_v1_t digest_start; - /** @sa digest_end_v1_t. */ - digest_end_v1_t digest_end; - /** @sa set_thread_connect_attrs_v1_t. */ - set_thread_connect_attrs_v1_t set_thread_connect_attrs; - /** @sa start_sp_v1_t. */ - start_sp_v1_t start_sp; - /** @sa start_sp_v1_t. */ - end_sp_v1_t end_sp; - /** @sa drop_sp_v1_t. */ - drop_sp_v1_t drop_sp; - /** @sa get_sp_share_v1_t. */ - get_sp_share_v1_t get_sp_share; - /** @sa release_sp_share_v1_t. */ - release_sp_share_v1_t release_sp_share; - /** @sa register_memory_v1_t. */ - register_memory_v1_t register_memory; - /** @sa memory_alloc_v1_t. */ - memory_alloc_v1_t memory_alloc; - /** @sa memory_realloc_v1_t. */ - memory_realloc_v1_t memory_realloc; - /** @sa memory_claim_v1_t. */ - memory_claim_v1_t memory_claim; - /** @sa memory_free_v1_t. */ - memory_free_v1_t memory_free; - - unlock_table_v1_t unlock_table; - - create_metadata_lock_v1_t create_metadata_lock; - set_metadata_lock_status_v1_t set_metadata_lock_status; - destroy_metadata_lock_v1_t destroy_metadata_lock; - - start_metadata_wait_v1_t start_metadata_wait; - end_metadata_wait_v1_t end_metadata_wait; -}; - -/** @} (end of group Group_PSI_v1) */ - -#endif /* HAVE_PSI_1 */ - -#ifdef USE_PSI_2 -#define HAVE_PSI_2 -#endif - -#ifdef HAVE_PSI_2 - -/** - @defgroup Group_PSI_v2 Application Binary Interface, version 2 - @ingroup Instrumentation_interface - @{ -*/ - -/** - Performance Schema Interface, version 2. - This is a placeholder, this interface is not defined yet. - @since PSI_VERSION_2 -*/ -struct PSI_v2 -{ - /** Placeholder */ - int placeholder; - /* ... extended interface ... */ -}; - -/** Placeholder */ -struct PSI_mutex_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_rwlock_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_cond_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_thread_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_file_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_stage_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_statement_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_transaction_info_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_idle_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_mutex_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_rwlock_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_cond_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_file_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_statement_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_transaction_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -/** Placeholder */ -struct PSI_socket_locker_state_v2 -{ - /** Placeholder */ - int placeholder; -}; - -struct PSI_metadata_locker_state_v2 -{ - int placeholder; -}; - -/** @} (end of group Group_PSI_v2) */ - -#endif /* HAVE_PSI_2 */ - -/** - @typedef PSI - The instrumentation interface for the current version. - @sa PSI_CURRENT_VERSION -*/ - -/** - @typedef PSI_mutex_info - The mutex information structure for the current version. -*/ - -/** - @typedef PSI_rwlock_info - The rwlock information structure for the current version. -*/ - -/** - @typedef PSI_cond_info - The cond information structure for the current version. -*/ - -/** - @typedef PSI_thread_info - The thread information structure for the current version. -*/ - -/** - @typedef PSI_file_info - The file information structure for the current version. -*/ - -/* Export the required version */ -#ifdef USE_PSI_1 -typedef struct PSI_v1 PSI; -typedef struct PSI_mutex_info_v1 PSI_mutex_info; -typedef struct PSI_rwlock_info_v1 PSI_rwlock_info; -typedef struct PSI_cond_info_v1 PSI_cond_info; -typedef struct PSI_thread_info_v1 PSI_thread_info; -typedef struct PSI_file_info_v1 PSI_file_info; -typedef struct PSI_stage_info_v1 PSI_stage_info; -typedef struct PSI_statement_info_v1 PSI_statement_info; -typedef struct PSI_transaction_info_v1 PSI_transaction_info; -typedef struct PSI_socket_info_v1 PSI_socket_info; -typedef struct PSI_idle_locker_state_v1 PSI_idle_locker_state; -typedef struct PSI_mutex_locker_state_v1 PSI_mutex_locker_state; -typedef struct PSI_rwlock_locker_state_v1 PSI_rwlock_locker_state; -typedef struct PSI_cond_locker_state_v1 PSI_cond_locker_state; -typedef struct PSI_file_locker_state_v1 PSI_file_locker_state; -typedef struct PSI_statement_locker_state_v1 PSI_statement_locker_state; -typedef struct PSI_transaction_locker_state_v1 PSI_transaction_locker_state; -typedef struct PSI_socket_locker_state_v1 PSI_socket_locker_state; -typedef struct PSI_sp_locker_state_v1 PSI_sp_locker_state; -typedef struct PSI_metadata_locker_state_v1 PSI_metadata_locker_state; -#endif - -#ifdef USE_PSI_2 -typedef struct PSI_v2 PSI; -typedef struct PSI_mutex_info_v2 PSI_mutex_info; -typedef struct PSI_rwlock_info_v2 PSI_rwlock_info; -typedef struct PSI_cond_info_v2 PSI_cond_info; -typedef struct PSI_thread_info_v2 PSI_thread_info; -typedef struct PSI_file_info_v2 PSI_file_info; -typedef struct PSI_stage_info_v2 PSI_stage_info; -typedef struct PSI_statement_info_v2 PSI_statement_info; -typedef struct PSI_transaction_info_v2 PSI_transaction_info; -typedef struct PSI_socket_info_v2 PSI_socket_info; -typedef struct PSI_idle_locker_state_v2 PSI_idle_locker_state; -typedef struct PSI_mutex_locker_state_v2 PSI_mutex_locker_state; -typedef struct PSI_rwlock_locker_state_v2 PSI_rwlock_locker_state; -typedef struct PSI_cond_locker_state_v2 PSI_cond_locker_state; -typedef struct PSI_file_locker_state_v2 PSI_file_locker_state; -typedef struct PSI_statement_locker_state_v2 PSI_statement_locker_state; -typedef struct PSI_transaction_locker_state_v2 PSI_transaction_locker_state; -typedef struct PSI_socket_locker_state_v2 PSI_socket_locker_state; -typedef struct PSI_sp_locker_state_v2 PSI_sp_locker_state; -typedef struct PSI_metadata_locker_state_v2 PSI_metadata_locker_state; -#endif - -#else /* HAVE_PSI_INTERFACE */ - -/** - Dummy structure, used to declare PSI_server when no instrumentation - is available. - The content does not matter, since PSI_server will be NULL. -*/ -struct PSI_none -{ - int opaque; -}; -typedef struct PSI_none PSI; - -/** - Stage instrument information. - @since PSI_VERSION_1 - This structure is used to register an instrumented stage. -*/ -struct PSI_stage_info_none -{ - /** Unused stage key. */ - unsigned int m_key; - /** The name of the stage instrument. */ - const char *m_name; - /** Unused stage flags. */ - int m_flags; -}; - -/** - The stage instrumentation has to co exist with the legacy - THD::set_proc_info instrumentation. - To avoid duplication of the instrumentation in the server, - the common PSI_stage_info structure is used, - so we export it here, even when not building - with HAVE_PSI_INTERFACE. -*/ -typedef struct PSI_stage_info_none PSI_stage_info; - -#endif /* HAVE_PSI_INTERFACE */ - -extern MYSQL_PLUGIN_IMPORT PSI *PSI_server; - -/* - Allow to override PSI_XXX_CALL at compile time - with more efficient implementations, if available. - If nothing better is available, - make a dynamic call using the PSI_server function pointer. -*/ - -#define PSI_DYNAMIC_CALL(M) PSI_server->M - -/** @} */ - -C_MODE_END -#endif /* MYSQL_PERFORMANCE_SCHEMA_INTERFACE_H */ - diff --git a/mysql/mysql/psi/psi_base.h b/mysql/mysql/psi/psi_base.h deleted file mode 100644 index 94cb5c9..0000000 --- a/mysql/mysql/psi/psi_base.h +++ /dev/null @@ -1,155 +0,0 @@ -/* Copyright (c) 2008, 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, - 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ - -#ifndef MYSQL_PSI_BASE_H -#define MYSQL_PSI_BASE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - @file mysql/psi/psi_base.h - Performance schema instrumentation interface. - - @defgroup Instrumentation_interface Instrumentation Interface - @ingroup Performance_schema - @{ -*/ - -#define PSI_INSTRUMENT_ME 0 - -#define PSI_NOT_INSTRUMENTED 0 - -/** - Global flag. - This flag indicate that an instrumentation point is a global variable, - or a singleton. -*/ -#define PSI_FLAG_GLOBAL (1 << 0) - -/** - Mutable flag. - This flag indicate that an instrumentation point is a general placeholder, - that can mutate into a more specific instrumentation point. -*/ -#define PSI_FLAG_MUTABLE (1 << 1) - -#define PSI_FLAG_THREAD (1 << 2) - -/** - Stage progress flag. - This flag apply to the stage instruments only. - It indicates the instrumentation provides progress data. -*/ -#define PSI_FLAG_STAGE_PROGRESS (1 << 3) - -/** - Shared Exclusive flag. - Indicates that rwlock support the shared exclusive state. -*/ -#define PSI_RWLOCK_FLAG_SX (1 << 4) - -/** - Transferable flag. - This flag indicate that an instrumented object can - be created by a thread and destroyed by another thread. -*/ -#define PSI_FLAG_TRANSFER (1 << 5) - -/** - Volatility flag. - This flag indicate that an instrumented object - has a volatility (life cycle) comparable - to the volatility of a session. -*/ -#define PSI_FLAG_VOLATILITY_SESSION (1 << 6) - -#ifdef HAVE_PSI_INTERFACE - -/** - @def PSI_VERSION_1 - Performance Schema Interface number for version 1. - This version is supported. -*/ -#define PSI_VERSION_1 1 - -/** - @def PSI_VERSION_2 - Performance Schema Interface number for version 2. - This version is not implemented, it's a placeholder. -*/ -#define PSI_VERSION_2 2 - -/** - @def PSI_CURRENT_VERSION - Performance Schema Interface number for the most recent version. - The most current version is @c PSI_VERSION_1 -*/ -#define PSI_CURRENT_VERSION 1 - -/** - @def USE_PSI_1 - Define USE_PSI_1 to use the interface version 1. -*/ - -/** - @def USE_PSI_2 - Define USE_PSI_2 to use the interface version 2. -*/ - -/** - @def HAVE_PSI_1 - Define HAVE_PSI_1 if the interface version 1 needs to be compiled in. -*/ - -/** - @def HAVE_PSI_2 - Define HAVE_PSI_2 if the interface version 2 needs to be compiled in. -*/ - -#ifndef USE_PSI_2 -#ifndef USE_PSI_1 -#define USE_PSI_1 -#endif -#endif - -#ifdef USE_PSI_1 -#define HAVE_PSI_1 -#endif - -#ifdef USE_PSI_2 -#define HAVE_PSI_2 -#endif - -/* - Allow to override PSI_XXX_CALL at compile time - with more efficient implementations, if available. - If nothing better is available, - make a dynamic call using the PSI_server function pointer. -*/ - -#define PSI_DYNAMIC_CALL(M) PSI_server->M - -#endif /* HAVE_PSI_INTERFACE */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* MYSQL_PSI_BASE_H */ - diff --git a/mysql/mysql/psi/psi_memory.h b/mysql/mysql/psi/psi_memory.h deleted file mode 100644 index 725b3ed..0000000 --- a/mysql/mysql/psi/psi_memory.h +++ /dev/null @@ -1,155 +0,0 @@ -/* Copyright (c) 2013, 2015, 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, - 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ - -#ifndef MYSQL_PSI_MEMORY_H -#define MYSQL_PSI_MEMORY_H - -#include "psi_base.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - @file mysql/psi/psi_memory.h - Performance schema instrumentation interface. - - @defgroup Instrumentation_interface Instrumentation Interface - @ingroup Performance_schema - @{ -*/ - -#ifdef HAVE_PSI_INTERFACE -#ifndef DISABLE_ALL_PSI -#ifndef DISABLE_PSI_MEMORY -#define HAVE_PSI_MEMORY_INTERFACE -#endif /* DISABLE_PSI_MEMORY */ -#endif /* DISABLE_ALL_PSI */ -#endif /* HAVE_PSI_INTERFACE */ - -struct PSI_thread; - -/** - Instrumented memory key. - To instrument memory, a memory key must be obtained using @c register_memory. - Using a zero key always disable the instrumentation. -*/ -typedef unsigned int PSI_memory_key; - -#ifdef HAVE_PSI_1 - -/** - @defgroup Group_PSI_v1 Application Binary Interface, version 1 - @ingroup Instrumentation_interface - @{ -*/ - -/** - Memory instrument information. - @since PSI_VERSION_1 - This structure is used to register instrumented memory. -*/ -struct PSI_memory_info_v1 -{ - /** Pointer to the key assigned to the registered memory. */ - PSI_memory_key *m_key; - /** The name of the memory instrument to register. */ - const char *m_name; - /** - The flags of the socket instrument to register. - @sa PSI_FLAG_GLOBAL - */ - int m_flags; -}; -typedef struct PSI_memory_info_v1 PSI_memory_info_v1; - -/** - Memory registration API. - @param category a category name (typically a plugin name) - @param info an array of memory info to register - @param count the size of the info array -*/ -typedef void (*register_memory_v1_t) - (const char *category, struct PSI_memory_info_v1 *info, int count); - -/** - Instrument memory allocation. - @param key the memory instrument key - @param size the size of memory allocated - @param[out] owner the memory owner - @return the effective memory instrument key -*/ -typedef PSI_memory_key (*memory_alloc_v1_t) - (PSI_memory_key key, size_t size, struct PSI_thread ** owner); - -/** - Instrument memory re allocation. - @param key the memory instrument key - @param old_size the size of memory previously allocated - @param new_size the size of memory re allocated - @param[in, out] owner the memory owner - @return the effective memory instrument key -*/ -typedef PSI_memory_key (*memory_realloc_v1_t) - (PSI_memory_key key, size_t old_size, size_t new_size, struct PSI_thread ** owner); - -/** - Instrument memory claim. - @param key the memory instrument key - @param size the size of memory allocated - @param[in, out] owner the memory owner - @return the effective memory instrument key -*/ -typedef PSI_memory_key (*memory_claim_v1_t) - (PSI_memory_key key, size_t size, struct PSI_thread ** owner); - -/** - Instrument memory free. - @param key the memory instrument key - @param size the size of memory allocated - @param owner the memory owner -*/ -typedef void (*memory_free_v1_t) - (PSI_memory_key key, size_t size, struct PSI_thread * owner); - -/** @} (end of group Group_PSI_v1) */ - -#endif /* HAVE_PSI_1 */ - -#ifdef HAVE_PSI_2 -struct PSI_memory_info_v2 -{ - int placeholder; -}; - -#endif /* HAVE_PSI_2 */ - -#ifdef USE_PSI_1 -typedef struct PSI_memory_info_v1 PSI_memory_info; -#endif - -#ifdef USE_PSI_2 -typedef struct PSI_memory_info_v2 PSI_memory_info; -#endif - -/** @} (end of group Instrumentation_interface) */ - -#ifdef __cplusplus -} -#endif - - -#endif /* MYSQL_PSI_MEMORY_H */ - diff --git a/mysql/mysql/service_command.h b/mysql/mysql/service_command.h deleted file mode 100644 index 7b90b8f..0000000 --- a/mysql/mysql/service_command.h +++ /dev/null @@ -1,436 +0,0 @@ -#ifndef MYSQL_SERVICE_COMMAND_INCLUDED -#define MYSQL_SERVICE_COMMAND_INCLUDED -/* Copyright (c) 2015, 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 */ - -/** - @file - Header file for the Command service. This service is to provide means - of executing different commands, like COM_QUERY, COM_STMT_PREPARE, - in the server. -*/ - -#include "mysql/service_srv_session.h" -#include "mysql/com_data.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#include "mysql_time.h" -#include "decimal.h" -#ifndef MYSQL_ABI_CHECK -#include "m_ctype.h" -#include /* uint32_t */ -#endif - -/* POD structure for the field metadata from the server */ -struct st_send_field -{ - const char *db_name; - const char *table_name; - const char *org_table_name; - const char *col_name; - const char *org_col_name; - unsigned long length; - unsigned int charsetnr; - unsigned int flags; - unsigned int decimals; - enum_field_types type; -}; - - -struct st_command_service_cbs -{ - /* - For a statement that returns a result, the flow of called callbacks will be: - - start_result_metadata() - field_metadata() - .... - end_result_metadata() (in the classic protocol this generates an EOF packet) - start_row() - get_xxx() - ... - end_row() - start_row() - get_xxx() - ... - end_row() - handle_ok() (with data for an EOF packet) - - For a statement that does NOT return a result, but only status, like - INSERT, UPDATE, DELETE, REPLACE, TRUNCATE, CREATE, DROP, ALTER, etc. only - handle_ok() will be invoked, in case of success. - - All statements that result in an error will invoke handle_error(). - - For statements that return a result set, handle_error() might be invoked - even after metadata was sent. This will indicate an error during the - execution of the statement. - */ - - /*** Getting metadata ***/ - /** - Indicates beginning of metadata for the result set - - @param ctx Plugin's context - @param num_cols Number of fields being sent - @param flags Flags to alter the metadata sending - @param resultcs Charset of the result set - - @note resultcs is the charset in which the data should be encoded before - sent to the client. This is the value of the session variable - character_set_results. The implementor most probably will need to save - this value in the context and use it as "to" charset in get_string(). - - In case of CS_BINARY_REPRESENTATION, get_string() receives as a parameter - the charset of the string, as it is stored on disk. - - In case of CS_TEXT_REPRESENTATION, the string value might be already a - stringified value or non-string data, which is in character_set_results. - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*start_result_metadata)(void *ctx, uint num_cols, uint flags, - const CHARSET_INFO *resultcs); - - /** - Field metadata is provided via this callback - - @param ctx Plugin's context - @param field Field's metadata (see field.h) - @param charset Field's charset - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*field_metadata)(void *ctx, struct st_send_field *field, - const CHARSET_INFO *charset); - - /** - Indicates end of metadata for the result set - - @param ctx Plugin's context - @param server_status Status of server (see mysql_com.h, SERVER_STATUS_*) - @param warn_count Number of warnings generated during execution to the - moment when the metadata is sent. - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*end_result_metadata)(void *ctx, uint server_status, - uint warn_count); - - /** - Indicates the beginning of a new row in the result set/metadata - - @param ctx Plugin's context - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*start_row)(void *ctx); - - /** - Indicates the end of the current row in the result set/metadata - - @param ctx Plugin's context - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*end_row)(void *ctx); - - /** - An error occured during execution - - @details This callback indicates that an error occured during command - execution and the partial row should be dropped. Server will raise error - and return. - - @param ctx Plugin's context - - @returns - true an error occured, server will abort the command - false ok - - */ - void (*abort_row)(void *ctx); - - /** - Return client's capabilities (see mysql_com.h, CLIENT_*) - - @param ctx Plugin's context - - @return Bitmap of client's capabilities - */ - ulong (*get_client_capabilities)(void *ctx); - - /****** Getting data ******/ - /** - Receive NULL value from server - - @param ctx Plugin's context - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*get_null)(void * ctx); - - /** - Receive TINY/SHORT/LONG value from server - - @param ctx Plugin's context - @param value Value received - - @note In order to know which type exactly was received, the plugin must - track the metadata that was sent just prior to the result set. - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*get_integer)(void * ctx, longlong value); - - /** - Get LONGLONG value from server - - @param ctx Plugin's context - @param value Value received - @param is_unsigned TRUE <=> value is unsigned - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*get_longlong)(void * ctx, longlong value, uint is_unsigned); - - /** - Receive DECIMAL value from server - - @param ctx Plugin's context - @param value Value received - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*get_decimal)(void * ctx, const decimal_t * value); - - /** - Receive FLOAT/DOUBLE from server - - @param ctx Plugin's context - @param value Value received - @param decimals Number of decimals - - @note In order to know which type exactly was received, the plugin must - track the metadata that was sent just prior to the result set. - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*get_double)(void * ctx, double value, uint32_t decimals); - - /** - Get DATE value from server - - @param ctx Plugin's context - @param value Value received - - @returns - 1 an error occured during storing, server will abort the command - 0 ok - */ - int (*get_date)(void * ctx, const MYSQL_TIME * value); - - /** - Receive TIME value from server - - @param ctx Plugin's context - @param value Value received - @param decimals Number of decimals - - @returns - 1 an error occured during storing, server will abort the command - 0 ok - */ - int (*get_time)(void * ctx, const MYSQL_TIME * value, uint decimals); - - /** - Receive DATETIME value from server - - @param ctx Plugin's context - @param value Value received - @param decimals Number of decimals - - @returns - 1 an error occured during storing, server will abort the command - 0 ok - */ - int (*get_datetime)(void * ctx, const MYSQL_TIME * value, uint decimals); - - /** - Get STRING value from server - - @param ctx Plugin's context - @param value Data - @param length Data length - @param valuecs Data charset - - @note In case of CS_BINARY_REPRESENTATION, get_string() receives as - a parameter the charset of the string, as it is stored on disk. - - In case of CS_TEXT_REPRESENTATION, the string value might be already a - stringified value or non-string data, which is in character_set_results. - - @see start_result_metadata() - - @returns - 1 an error occured, server will abort the command - 0 ok - */ - int (*get_string)(void * ctx, const char * value, size_t length, - const CHARSET_INFO * valuecs); - - /****** Getting execution status ******/ - /** - Command ended with success - - @param ctx Plugin's context - @param server_status Status of server (see mysql_com.h, - SERVER_STATUS_*) - @param statement_warn_count Number of warnings thrown during execution - @param affected_rows Number of rows affected by the command - @param last_insert_id Last insert id being assigned during execution - @param message A message from server - */ - void (*handle_ok)(void * ctx, - uint server_status, uint statement_warn_count, - ulonglong affected_rows, ulonglong last_insert_id, - const char * message); - - /** - Command ended with ERROR - - @param ctx Plugin's context - @param sql_errno Error code - @param err_msg Error message - @param sqlstate SQL state correspongin to the error code - */ - void (*handle_error)(void * ctx, uint sql_errno, const char * err_msg, - const char * sqlstate); - - /** - Callback for shutdown notification from the server. - - @param ctx Plugin's context - @param server_shutdown Whether this is a normal connection shutdown (0) or - server shutdown (1). - */ - void (*shutdown)(void *ctx, int server_shutdown); -}; - -enum cs_text_or_binary -{ - CS_TEXT_REPRESENTATION= 1, /* Let the server convert everything to string */ - CS_BINARY_REPRESENTATION= 2, /* Let the server use native types */ -}; - -extern struct command_service_st { - int (*run_command)(MYSQL_SESSION session, - enum enum_server_command command, - const union COM_DATA * data, - const CHARSET_INFO * client_cs, - const struct st_command_service_cbs * callbacks, - enum cs_text_or_binary text_or_binary, - void * service_callbacks_ctx); -} *command_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define command_service_run_command(t, command, data, cset, cbs, t_or_b, ctx) \ - command_service->run_command((t), (command), (data), (cset), \ - (cbs), (t_or_b), (ctx)) -#else - - -/** - Executes a server command in a session. - - - There are two cases. Execution in a physical thread : - 1. initialized by the srv_session service - 2. NOT initialized by the srv_session service - - In case of 1, if there is currently attached session, and it is - different from the passed one, the former will be automatically - detached. The session to be used for the execution will then be - attached. After the command is executed, the attached session will - not be detached. It will be detached by a next call to run_command() - with another session as parameter. In other words, for all sessions - used in a physical thread, there will be at most one in attached - state. - - In case of 2, the current state (current_thd) will be - preserved. Then the given session will move to attached state and - the command will be executed. After the execution the state of the - session will be changed to detached and the preserved state - (current_thd) will be restored. - - The client charset is used for commands like COM_QUERY and - COM_STMT_PREPARE to know how to threat the char* fields. This - charset will be used until the next call of run_command when it may - be changed again. - - @param session The session - @param command The command to be executed. - @param data The data needed for the command to be executed - @param client_cs The charset for the string data input(COM_QUERY for example) - @param callbacks Callbacks to be used by the server to encode data and - to communicate with the client (plugin) side. - @param text_or_binary Select which representation the server will use for the - data passed to the callbacks. For more information - @see cs_text_or_binary enum - @param service_callbacks_ctx Context passed to the command service callbacks - - @return - 0 success - 1 failure -*/ -int command_service_run_command(MYSQL_SESSION session, - enum enum_server_command command, - const union COM_DATA * data, - const CHARSET_INFO * client_cs, - const struct st_command_service_cbs * callbacks, - enum cs_text_or_binary text_or_binary, - void * service_callbacks_ctx); - -#endif /* MYSQL_DYNAMIC_PLUGIN */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mysql/mysql/service_locking.h b/mysql/mysql/service_locking.h deleted file mode 100644 index 06f02d2..0000000 --- a/mysql/mysql/service_locking.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - Copyright (c) 2015, 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 -*/ - -#ifndef SERVICE_LOCKING_INCLUDED -#define SERVICE_LOCKING_INCLUDED - -/* - This service provides support for taking read/write locks. - It is intended for use with fabric, but it is still a general - service. The locks are in a separate namespace from other - locks in the server, and there is also no interactions with - transactions (i.e. locks are not released on commit/abort). - - These locks are implemented using the metadata lock (MDL) subsystem - and thus deadlocks involving locking service locks and other types - of metadata will be detected using the MDL deadlock detector. -*/ - -#ifdef __cplusplus -class THD; -#define MYSQL_THD THD* -#else -#define MYSQL_THD void* -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - Types of locking service locks. - LOCKING_SERVICE_READ is compatible with LOCKING_SERVICE_READ. - All other combinations are incompatible. -*/ -enum enum_locking_service_lock_type -{ LOCKING_SERVICE_READ, LOCKING_SERVICE_WRITE }; - -extern struct mysql_locking_service_st { - /** - Acquire locking service locks. - - @param opaque_thd Thread handle. If NULL, current_thd will be used. - @param lock_namespace Namespace of the locks to acquire. - @param lock_names Array of names of the locks to acquire. - @param lock_num Number of elements in 'lock_names'. - @param lock_type Lock type to acquire. LOCKING_SERVICE_READ or _WRITE. - @param lock_timeout Number of seconds to wait before giving up. - - @retval 1 Acquisition failed, error has been reported. - @retval 0 Acquisition successful, all locks acquired. - - @note both lock_namespace and lock_names are limited to 64 characters max. - Names are compared using binary comparison. - */ - int (*mysql_acquire_locks)(MYSQL_THD opaque_thd, const char* lock_namespace, - const char**lock_names, size_t lock_num, - enum enum_locking_service_lock_type lock_type, - unsigned long lock_timeout); - - /** - Release all lock service locks taken by the given connection - in the given namespace. - - @param opaque_thd Thread handle. If NULL, current_thd will be used. - @param lock_namespace Namespace of the locks to release. - - @retval 1 Release failed, error has been reported. - @retval 0 Release successful, all locks acquired. - */ - int (*mysql_release_locks)(MYSQL_THD opaque_thd, const char* lock_namespace); -} *mysql_locking_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define mysql_acquire_locking_service_locks(_THD, _NAMESPACE, _NAMES, _NUM, \ - _TYPE, _TIMEOUT) \ - mysql_locking_service->mysql_acquire_locks(_THD, _NAMESPACE, _NAMES, _NUM, \ - _TYPE, _TIMEOUT) -#define mysql_release_locking_service_locks(_THD, _NAMESPACE) \ - mysql_locking_service->mysql_release_locks(_THD, _NAMESPACE) - -#else - -int mysql_acquire_locking_service_locks(MYSQL_THD opaque_thd, - const char* lock_namespace, - const char**lock_names, - size_t lock_num, - enum enum_locking_service_lock_type lock_type, - unsigned long lock_timeout); - -int mysql_release_locking_service_locks(MYSQL_THD opaque_thd, - const char* lock_namespace); - -#endif /* MYSQL_DYNAMIC_PLUGIN */ - -#ifdef __cplusplus -} -#endif - -#endif /* SERVICE_LOCKING_INCLUDED */ diff --git a/mysql/mysql/service_my_plugin_log.h b/mysql/mysql/service_my_plugin_log.h deleted file mode 100644 index 0cf7817..0000000 --- a/mysql/mysql/service_my_plugin_log.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 2011, 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 */ - -/** - @file - This service provides functions to report error conditions and log to - mysql error log. -*/ - -#ifndef MYSQL_SERVICE_MY_PLUGIN_LOG_INCLUDED -#define MYSQL_SERVICE_MY_PLUGIN_LOG_INCLUDED - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -/* keep in sync with the loglevel enum in my_sys.h */ -enum plugin_log_level -{ - MY_ERROR_LEVEL, - MY_WARNING_LEVEL, - MY_INFORMATION_LEVEL -}; - - -#ifdef __cplusplus -extern "C" { -#endif - -extern struct my_plugin_log_service -{ - /** write a message to the log */ - int (*my_plugin_log_message)(MYSQL_PLUGIN *, enum plugin_log_level, const char *, ...); -} *my_plugin_log_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define my_plugin_log_message my_plugin_log_service->my_plugin_log_message - -#else - -int my_plugin_log_message(MYSQL_PLUGIN *plugin, enum plugin_log_level level, - const char *format, ...); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mysql/mysql/service_my_snprintf.h b/mysql/mysql/service_my_snprintf.h deleted file mode 100644 index d734ae1..0000000 --- a/mysql/mysql/service_my_snprintf.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef MYSQL_SERVICE_MY_SNPRINTF_INCLUDED -#define MYSQL_SERVICE_MY_SNPRINTF_INCLUDED -/* Copyright (c) 2009, 2015, 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 */ - -/** - @file - my_snprintf service - - Portable and limited vsnprintf() implementation. - - This is a portable, limited vsnprintf() implementation, with some - extra features. "Portable" means that it'll produce identical result - on all platforms (for example, on Windows and Linux system printf %e - formats the exponent differently, on different systems %p either - prints leading 0x or not, %s may accept null pointer or crash on - it). "Limited" means that it does not support all the C89 features. - But it supports few extensions, not in any standard. - - my_vsnprintf(to, n, fmt, ap) - - @param[out] to A buffer to store the result in - @param[in] n Store up to n-1 characters, followed by an end 0 - @param[in] fmt printf-like format string - @param[in] ap Arguments - - @return a number of bytes written to a buffer *excluding* terminating '\0' - - @post - The syntax of a format string is generally the same: - % - where everithing but the format is optional. - - Three one-character flags are recognized: - '0' has the standard zero-padding semantics; - '-' is parsed, but silently ignored; - '`' (backtick) is only supported for strings (%s) and means that the - string will be quoted according to MySQL identifier quoting rules. - - Both and can be specified as numbers or '*'. - If an asterisk is used, an argument of type int is consumed. - - can be 'l', 'll', or 'z'. - - Supported formats are 's' (null pointer is accepted, printed as - "(null)"), 'b' (extension, see below), 'c', 'd', 'i', 'u', 'x', 'o', - 'X', 'p' (works as 0x%x). - - Standard syntax for positional arguments $n is supported. - - Extensions: - - Flag '`' (backtick): see above. - - Format 'b': binary buffer, prints exactly bytes from the - argument, without stopping at '\0'. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef MYSQL_ABI_CHECK -#include -#include -#endif - -extern struct my_snprintf_service_st { - size_t (*my_snprintf_type)(char*, size_t, const char*, ...); - size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); -} *my_snprintf_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define my_vsnprintf my_snprintf_service->my_vsnprintf_type -#define my_snprintf my_snprintf_service->my_snprintf_type - -#else - -size_t my_snprintf(char* to, size_t n, const char* fmt, ...); -size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* #define MYSQL_SERVICE_MY_SNPRINTF_INCLUDED */ diff --git a/mysql/mysql/service_mysql_alloc.h b/mysql/mysql/service_mysql_alloc.h deleted file mode 100644 index a43a169..0000000 --- a/mysql/mysql/service_mysql_alloc.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (c) 2012, 2015, 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 */ - -#ifndef MYSQL_SERVICE_MYSQL_ALLOC_INCLUDED -#define MYSQL_SERVICE_MYSQL_ALLOC_INCLUDED - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -/* PSI_memory_key */ -#include "mysql/psi/psi_memory.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* myf */ -typedef int myf_t; - -typedef void * (*mysql_malloc_t)(PSI_memory_key key, size_t size, myf_t flags); -typedef void * (*mysql_realloc_t)(PSI_memory_key key, void *ptr, size_t size, myf_t flags); -typedef void (*mysql_claim_t)(void *ptr); -typedef void (*mysql_free_t)(void *ptr); -typedef void * (*my_memdup_t)(PSI_memory_key key, const void *from, size_t length, myf_t flags); -typedef char * (*my_strdup_t)(PSI_memory_key key, const char *from, myf_t flags); -typedef char * (*my_strndup_t)(PSI_memory_key key, const char *from, size_t length, myf_t flags); - -struct mysql_malloc_service_st -{ - mysql_malloc_t mysql_malloc; - mysql_realloc_t mysql_realloc; - mysql_claim_t mysql_claim; - mysql_free_t mysql_free; - my_memdup_t my_memdup; - my_strdup_t my_strdup; - my_strndup_t my_strndup; -}; - -extern struct mysql_malloc_service_st *mysql_malloc_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define my_malloc mysql_malloc_service->mysql_malloc -#define my_realloc mysql_malloc_service->mysql_realloc -#define my_claim mysql_malloc_service->mysql_claim -#define my_free mysql_malloc_service->mysql_free -#define my_memdup mysql_malloc_service->my_memdup -#define my_strdup mysql_malloc_service->my_strdup -#define my_strndup mysql_malloc_service->my_strndup - -#else - -extern void * my_malloc(PSI_memory_key key, size_t size, myf_t flags); -extern void * my_realloc(PSI_memory_key key, void *ptr, size_t size, myf_t flags); -extern void my_claim(void *ptr); -extern void my_free(void *ptr); -extern void * my_memdup(PSI_memory_key key, const void *from, size_t length, myf_t flags); -extern char * my_strdup(PSI_memory_key key, const char *from, myf_t flags); -extern char * my_strndup(PSI_memory_key key, const char *from, size_t length, myf_t flags); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/mysql/mysql/service_mysql_keyring.h b/mysql/mysql/service_mysql_keyring.h deleted file mode 100644 index 991d5fd..0000000 --- a/mysql/mysql/service_mysql_keyring.h +++ /dev/null @@ -1,62 +0,0 @@ -/* 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 */ - -#ifndef MYSQL_SERVICE_MYSQL_PLUGIN_KEYRING_INCLUDED -#define MYSQL_SERVICE_MYSQL_PLUGIN_KEYRING_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif - -extern struct mysql_keyring_service_st -{ - int (*my_key_store_func)(const char *, const char *, const char *, - const void *, size_t); - int (*my_key_fetch_func)(const char *, char **, const char *, void **, - size_t *); - int (*my_key_remove_func)(const char *, const char *); - int (*my_key_generate_func)(const char *, const char *, const char *, - size_t); -} *mysql_keyring_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define my_key_store(key_id, key_type, user_id, key, key_len) \ - mysql_keyring_service->my_key_store_func(key_id, key_type, user_id, key, \ - key_len) -#define my_key_fetch(key_id, key_type, user_id, key, key_len) \ - mysql_keyring_service->my_key_fetch_func(key_id, key_type, user_id, key, \ - key_len) -#define my_key_remove(key_id, user_id) \ - mysql_keyring_service->my_key_remove_func(key_id, user_id) -#define my_key_generate(key_id, key_type, user_id, key_len) \ - mysql_keyring_service->my_key_generate_func(key_id, key_type, user_id, \ - key_len) -#else - -int my_key_store(const char *, const char *, const char *, const void *, size_t); -int my_key_fetch(const char *, char **, const char *, void **, - size_t *); -int my_key_remove(const char *, const char *); -int my_key_generate(const char *, const char *, const char *, size_t); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif //MYSQL_SERVICE_MYSQL_PLUGIN_KEYRING_INCLUDED - diff --git a/mysql/mysql/service_mysql_password_policy.h b/mysql/mysql/service_mysql_password_policy.h deleted file mode 100644 index 09f121d..0000000 --- a/mysql/mysql/service_mysql_password_policy.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (c) 2014, 2015 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 */ - -#ifndef MYSQL_SERVICE_MYSQL_PLUGIN_AUTH_INCLUDED -#define MYSQL_SERVICE_MYSQL_PLUGIN_AUTH_INCLUDED - -/** - @file include/mysql/service_mysql_plugin_auth.h - This service provides functions to validatete password, check for strength - of password based on common policy. - - SYNOPSIS - my_validate_password_policy() - function to validate password - based on defined policy - const char* buffer holding the password value - unsigned int buffer length - - my_calculate_password_strength() - function to calculate strength - of the password based on the policies defined. - const char* buffer holding the password value - unsigned int buffer length - - Both the service function returns 0 on SUCCESS and 1 incase input password does not - match against the policy rules defined. -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -extern struct mysql_password_policy_service_st { - int (*my_validate_password_policy_func)(const char *, unsigned int); - int (*my_calculate_password_strength_func)(const char *, unsigned int); -} *mysql_password_policy_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define my_validate_password_policy(buffer, length) \ - mysql_password_policy_service->my_validate_password_policy_func(buffer, length) -#define my_calculate_password_strength(buffer, length) \ - mysql_password_policy_service->my_calculate_password_strength_func(buffer, length) - -#else - -int my_validate_password_policy(const char *, unsigned int); -int my_calculate_password_strength(const char *, unsigned int); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mysql/mysql/service_mysql_string.h b/mysql/mysql/service_mysql_string.h deleted file mode 100644 index c8cde97..0000000 --- a/mysql/mysql/service_mysql_string.h +++ /dev/null @@ -1,133 +0,0 @@ -/* Copyright (c) 2012, 2014, 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 */ - -/* This service provides functions to parse mysql String */ - -#ifndef MYSQL_SERVICE_MYSQL_STRING_INCLUDED -#define MYSQL_SERVICE_MYSQL_STRING_INCLUDED - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void *mysql_string_iterator_handle; -typedef void *mysql_string_handle; - -extern struct mysql_string_service_st { - int (*mysql_string_convert_to_char_ptr_type) - (mysql_string_handle, const char *, char *, unsigned int, int *); - mysql_string_iterator_handle (*mysql_string_get_iterator_type) - (mysql_string_handle); - int (*mysql_string_iterator_next_type)(mysql_string_iterator_handle); - int (*mysql_string_iterator_isupper_type)(mysql_string_iterator_handle); - int (*mysql_string_iterator_islower_type)(mysql_string_iterator_handle); - int (*mysql_string_iterator_isdigit_type)(mysql_string_iterator_handle); - mysql_string_handle (*mysql_string_to_lowercase_type)(mysql_string_handle); - void (*mysql_string_free_type)(mysql_string_handle); - void (*mysql_string_iterator_free_type)(mysql_string_iterator_handle); -} *mysql_string_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define mysql_string_convert_to_char_ptr(string_handle, charset_name, \ - buffer, buffer_size, error) \ - mysql_string_service->mysql_string_convert_to_char_ptr_type \ - (string_handle, charset_name, buffer, \ - buffer_size, error) - -#define mysql_string_get_iterator(string_handle) \ - mysql_string_service->mysql_string_get_iterator_type(string_handle) - -#define mysql_string_iterator_next(iterator_handle) \ - mysql_string_service->mysql_string_iterator_next_type(iterator_handle) - -#define mysql_string_iterator_isupper(iterator_handle) \ - mysql_string_service->mysql_string_iterator_isupper_type \ - (iterator_handle) - -#define mysql_string_iterator_islower(iterator_handle) \ - mysql_string_service->mysql_string_iterator_islower_type \ - (iterator_handle) - -#define mysql_string_iterator_isdigit(iterator_handle) \ - mysql_string_service->mysql_string_iterator_isdigit_type \ - (iterator_handle) - -#define mysql_string_to_lowercase(string_handle) \ - mysql_string_service->mysql_string_to_lowercase_type(string_handle) - -#define mysql_string_free(mysql_string_handle) \ - mysql_string_service->mysql_string_free_type(mysql_string_handle) - -#define mysql_string_iterator_free(mysql_string_iterator_handle) \ - mysql_string_service->mysql_string_iterator_free_type \ - (mysql_string_iterator_handle) -#else - -/* This service function convert string into given character set */ -int mysql_string_convert_to_char_ptr(mysql_string_handle string_handle, - const char *charset_name, char *buffer, - unsigned int buffer_size, int *error); - -/* This service function returns the beginning of the iterator handle */ -mysql_string_iterator_handle mysql_string_get_iterator(mysql_string_handle - string_handle); -/* - This service function gets the next iterator handle - returns 0 if reached the end else return 1 -*/ -int mysql_string_iterator_next(mysql_string_iterator_handle iterator_handle); - -/* - This service function return 1 if current iterator handle points to a - uppercase character else return 0 for client character set. -*/ -int mysql_string_iterator_isupper(mysql_string_iterator_handle iterator_handle); - -/* - This service function return 1 if current iterator handle points to a - lowercase character else return 0 for client character set. -*/ -int mysql_string_iterator_islower(mysql_string_iterator_handle iterator_handle); - -/* - This service function return 1 if current iterator handle points to a digit - else return 0 for client character sets. -*/ -int mysql_string_iterator_isdigit(mysql_string_iterator_handle iterator_handle); - -/* convert string_handle into lowercase */ -mysql_string_handle mysql_string_to_lowercase(mysql_string_handle - string_handle); - -/* It deallocates the string created on server side during plugin operations */ -void mysql_string_free(mysql_string_handle); - -/* - It deallocates the string iterator created on server side - during plugin operations -*/ -void mysql_string_iterator_free(mysql_string_iterator_handle); - -#endif -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mysql/mysql/service_parser.h b/mysql/mysql/service_parser.h deleted file mode 100644 index 3cf7c8b..0000000 --- a/mysql/mysql/service_parser.h +++ /dev/null @@ -1,286 +0,0 @@ -#ifndef MYSQL_SERVICE_PARSER_INCLUDED -#define MYSQL_SERVICE_PARSER_INCLUDED -/* Copyright (c) 2015, 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 */ - -#include "my_md5_size.h" -#include - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -#ifdef __cplusplus -class THD; -class Item; -#define MYSQL_THD THD* -typedef Item* MYSQL_ITEM; -#else -#define MYSQL_THD void* -typedef void* MYSQL_ITEM; -#endif /* __cplusplus */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - @file service_parser - - Plugin service that provides access to the parser and some operations on the - parse tree. -*/ - -#define PARSER_SERVICE_DIGEST_LENGTH MD5_HASH_SIZE - -#define STATEMENT_TYPE_SELECT 1 -#define STATEMENT_TYPE_OTHER 2 - -typedef -int (*parse_node_visit_function)(MYSQL_ITEM item, unsigned char* arg); - - -typedef -int (*sql_condition_handler_function)(int sql_errno, - const char* sqlstate, - const char* msg, - void *state); - -struct st_my_thread_handle; - -extern struct mysql_parser_service_st { - - MYSQL_THD (*mysql_current_session)(); - - MYSQL_THD (*mysql_open_session)(); - - void (*mysql_start_thread)(MYSQL_THD thd, void *(*callback_fun)(void*), - void *arg, - struct st_my_thread_handle *thread_handle); - - void (*mysql_join_thread)(struct st_my_thread_handle *thread_handle); - - void (*mysql_set_current_database)(MYSQL_THD thd, const MYSQL_LEX_STRING db); - - /** - Parses the query. - - @param thd The session in which to parse. - - @param query The query to parse. - - @param is_prepared If non-zero, the query will be parsed as a prepared - statement and won't throw errors when the query string contains '?'. - - @param handle_condition Callback function that is called if a condition is - raised during the preparation, parsing or cleanup after parsing. If this - argument is non-NULL, the diagnostics area will be cleared before this - function returns. - - @param condition_handler_state Will be passed to handle_condition when - called. Otherwise ignored. - - @retval 0 Success. - @retval 1 Parse error. - */ - int (*mysql_parse)(MYSQL_THD thd, const MYSQL_LEX_STRING query, - unsigned char is_prepared, - sql_condition_handler_function handle_condition, - void *condition_handler_state); - - int (*mysql_get_statement_type)(MYSQL_THD thd); - - /** - Returns the digest of the last parsed statement in the session. - - @param thd The session in which the statement was parsed. - - @param digest[out] An area of at least size PARSER_SERVICE_DIGEST_LENGTH, - where the digest is written. - - @retval 0 Success. - @retval 1 Parse error. - */ - int (*mysql_get_statement_digest)(MYSQL_THD thd, unsigned char *digest); - - - /** - Returns the number of parameters ('?') in the parsed query. - This works only if the last query was parsed as a prepared statement. - - @param thd The session in which the query was parsed. - - @return The number of parameter markers. - */ - int (*mysql_get_number_params)(MYSQL_THD thd); - - - /** - Stores in 'positions' the positions in the last parsed query of each - parameter marker('?'). Positions must be an already allocated array of at - least mysql_parser_service_st::mysql_get_number_params() size. This works - only if the last query was parsed as a prepared statement. - - @param thd The session in which the query was parsed. - - @param positions An already allocated array of at least - mysql_parser_service_st::mysql_get_number_params() size. - - @return The number of parameter markers and hence number of written - positions. - */ - int (*mysql_extract_prepared_params)(MYSQL_THD thd, int *positions); - - - /** - Walks the tree depth first and applies a user defined function on each - literal. - - @param thd The session in which the query was parsed. - - @param processor Will be called for each literal in the parse tree. - - @param arg Will be passed as argument to each call to 'processor'. - */ - int (*mysql_visit_tree)(MYSQL_THD thd, parse_node_visit_function processor, - unsigned char* arg); - - - /** - Renders the MYSQL_ITEM as a string and returns a reference in the form of - a MYSQL_LEX_STRING. The string buffer is allocated by the server and must - be freed by mysql_free_string(). - - @param item The literal to print. - - @return The result of printing the literal. - - @see mysql_parser_service_st::mysql_free_string(). - */ - MYSQL_LEX_STRING (*mysql_item_string)(MYSQL_ITEM item); - - - /** - Frees a string buffer allocated by the server. - - @param The string whose buffer will be freed. - */ - void (*mysql_free_string)(MYSQL_LEX_STRING string); - - - /** - Returns the current query string. This string is managed by the server and - should @b not be freed by a plugin. - - @param thd The session in which the query was submitted. - - @return The query string. - */ - MYSQL_LEX_STRING (*mysql_get_query)(MYSQL_THD thd); - - - /** - Returns the current query in normalized form. This string is managed by - the server and should @b not be freed by a plugin. - - @param thd The session in which the query was submitted. - - @return The query string normalized. - */ - MYSQL_LEX_STRING (*mysql_get_normalized_query)(MYSQL_THD thd); -} *mysql_parser_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define mysql_parser_current_session() \ - mysql_parser_service->mysql_current_session() - -#define mysql_parser_open_session() \ - mysql_parser_service->mysql_open_session() - -#define mysql_parser_start_thread(thd, func, arg, thread_handle) \ - mysql_parser_service->mysql_start_thread(thd, func, arg, thread_handle) - -#define mysql_parser_join_thread(thread_handle) \ - mysql_parser_service->mysql_join_thread(thread_handle) - -#define mysql_parser_set_current_database(thd, db) \ - mysql_parser_service->mysql_set_current_database(thd, db) - -#define mysql_parser_parse(thd, query, is_prepared, \ - condition_handler, condition_handler_state) \ - mysql_parser_service->mysql_parse(thd, query, is_prepared, \ - condition_handler, \ - condition_handler_state) - -#define mysql_parser_get_statement_type(thd) \ - mysql_parser_service->mysql_get_statement_type(thd) - -#define mysql_parser_get_statement_digest(thd, digest) \ - mysql_parser_service->mysql_get_statement_digest(thd, digest) - -#define mysql_parser_get_number_params(thd) \ - mysql_parser_service->mysql_get_number_params(thd) - -#define mysql_parser_extract_prepared_params(thd, positions) \ - mysql_parser_service->mysql_extract_prepared_params(thd, positions) - -#define mysql_parser_visit_tree(thd, processor, arg) \ - mysql_parser_service->mysql_visit_tree(thd, processor, arg) - -#define mysql_parser_item_string(item) \ - mysql_parser_service->mysql_item_string(item) - -#define mysql_parser_free_string(string) \ - mysql_parser_service->mysql_free_string(string) - -#define mysql_parser_get_query(thd) \ - mysql_parser_service->mysql_get_query(thd) - -#define mysql_parser_get_normalized_query(thd) \ - mysql_parser_service->mysql_get_normalized_query(thd) - -#else -typedef void *(*callback_function)(void*); -MYSQL_THD mysql_parser_current_session(); -MYSQL_THD mysql_parser_open_session(); -void mysql_parser_start_thread(MYSQL_THD thd, callback_function fun, void *arg, - struct st_my_thread_handle *thread_handle); -void mysql_parser_join_thread(struct st_my_thread_handle *thread_handle); -void mysql_parser_set_current_database(MYSQL_THD thd, - const MYSQL_LEX_STRING db); -int mysql_parser_parse(MYSQL_THD thd, const MYSQL_LEX_STRING query, - unsigned char is_prepared, - sql_condition_handler_function handle_condition, - void *condition_handler_state); -int mysql_parser_get_statement_type(MYSQL_THD thd); -int mysql_parser_get_statement_digest(MYSQL_THD thd, unsigned char *digest); -int mysql_parser_get_number_params(MYSQL_THD thd); -int mysql_parser_extract_prepared_params(MYSQL_THD thd, int *positions); -int mysql_parser_visit_tree(MYSQL_THD thd, parse_node_visit_function processor, - unsigned char* arg); -MYSQL_LEX_STRING mysql_parser_item_string(MYSQL_ITEM item); -void mysql_parser_free_string(MYSQL_LEX_STRING string); -MYSQL_LEX_STRING mysql_parser_get_query(MYSQL_THD thd); -MYSQL_LEX_STRING mysql_parser_get_normalized_query(MYSQL_THD thd); - -#endif /* MYSQL_DYNAMIC_PLUGIN */ - -#ifdef __cplusplus -} -#endif - -#endif /* MYSQL_SERVICE_PARSER_INCLUDED */ diff --git a/mysql/mysql/service_rpl_transaction_ctx.h b/mysql/mysql/service_rpl_transaction_ctx.h deleted file mode 100644 index e25b22f..0000000 --- a/mysql/mysql/service_rpl_transaction_ctx.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (c) 2014, 2015, 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 */ - -#ifndef MYSQL_SERVICE_RPL_TRANSACTION_CTX_INCLUDED - -/** - @file include/mysql/service_rpl_transaction_ctx.h - This service provides a function for plugins to report if a transaction of a - given THD should continue or be aborted. - - SYNOPSIS - set_transaction_ctx() - should be called during RUN_HOOK macro, on which we know that thread is - on plugin context and it is before - Rpl_transaction_ctx::is_transaction_rollback() check. -*/ - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -struct st_transaction_termination_ctx -{ - unsigned long m_thread_id; - unsigned int m_flags; // reserved - - /* - If the instruction is to rollback the transaction, - then this flag is set to false. - Note: type is char like on my_bool. - */ - char m_rollback_transaction; - - /* - If the plugin has generated a GTID, then the follwoing - fields MUST be set. - Note: type is char like on my_bool. - */ - char m_generated_gtid; - int m_sidno; - long long int m_gno; -}; -typedef struct st_transaction_termination_ctx Transaction_termination_ctx; - -extern struct rpl_transaction_ctx_service_st { - int (*set_transaction_ctx)(Transaction_termination_ctx transaction_termination_ctx); -} *rpl_transaction_ctx_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define set_transaction_ctx(transaction_termination_ctx) \ - (rpl_transaction_ctx_service->set_transaction_ctx((transaction_termination_ctx))) - -#else - -int set_transaction_ctx(Transaction_termination_ctx transaction_termination_ctx); - -#endif - -#ifdef __cplusplus -} -#endif - -#define MYSQL_SERVICE_RPL_TRANSACTION_CTX_INCLUDED -#endif diff --git a/mysql/mysql/service_rpl_transaction_write_set.h b/mysql/mysql/service_rpl_transaction_write_set.h deleted file mode 100644 index 7f849c2..0000000 --- a/mysql/mysql/service_rpl_transaction_write_set.h +++ /dev/null @@ -1,80 +0,0 @@ -/* 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 */ - -#ifndef MYSQL_SERVICE_TRANSACTION_WRITE_SET_INCLUDED - -/** - @file include/mysql/service_rpl_transaction_write_set.h - This service provides a function for plugins to get the write set of a given - transaction. - - SYNOPSIS - get_transaction_write_set() - This service is used to fetch the write_set extracted for the currently - executing transaction by passing the thread_id as an input parameter for - the method. - - @param [in] - thread_id - It is the thread identifier of the currently - executing thread. - - In the current implementation it is being called during RUN_HOOK macro, - on which we know that thread is on plugin context. - - Cleanup : - The service caller must take of the memory allocated during the service - call to prevent memory leaks. -*/ - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - This structure is used to keep the list of the hash values of the records - changed in the transaction. -*/ -struct st_trans_write_set -{ - unsigned int m_flags; // reserved - unsigned long write_set_size; // Size of the PKE set of the transaction. - unsigned long long* write_set; // A pointer to the PKE set. -}; -typedef struct st_trans_write_set Transaction_write_set; - -extern struct transaction_write_set_service_st { - Transaction_write_set* (*get_transaction_write_set)(unsigned long m_thread_id); -} *transaction_write_set_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define get_transaction_write_set(m_thread_id) \ - (transaction_write_set_service->get_transaction_write_set((m_thread_id))) - -#else - -Transaction_write_set* get_transaction_write_set(unsigned long m_thread_id); - -#endif - -#ifdef __cplusplus -} -#endif - -#define MYSQL_SERVICE_TRANSACTION_WRITE_SET_INCLUDED -#endif diff --git a/mysql/mysql/service_rules_table.h b/mysql/mysql/service_rules_table.h deleted file mode 100644 index aca3926..0000000 --- a/mysql/mysql/service_rules_table.h +++ /dev/null @@ -1,192 +0,0 @@ -#ifdef __cplusplus -#ifndef SERVICE_RULES_TABLE_INCLUDED -#define SERVICE_RULES_TABLE_INCLUDED - -/* Copyright (c) 2015, 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 */ - -#include -#include -#include - -#ifndef MYSQL_ABI_CHECK -#include -#endif - - -/** - @file service_rules_table.h - - Plugin service that provides access to the rewrite rules table that is used - by the Rewriter plugin. No other use intended. -*/ - -class THD; -struct TABLE_LIST; -class Field; - -namespace rules_table_service -{ - - -/** - There must be one function of this kind in order for the symbols in the - server's dynamic library to be visible to plugins. -*/ -int dummy_function_to_ensure_we_are_linked_into_the_server(); - - -/** - Frees a const char pointer allocated in the server's dynamic library using - new[]. -*/ -void free_string(const char *str); - - -/** - Writable cursor that allows reading and updating of rows in a persistent - table. -*/ -class Cursor -{ -public: - typedef int column_id; - - static const column_id ILLEGAL_COLUMN_ID= -1; - - /** - Creates a cursor to an already-opened table. The constructor is kept - explicit because of implicit conversions from void*. - */ - explicit Cursor(THD *thd); - - /// Creates a past-the-end cursor. - Cursor() : - m_thd(NULL), m_table_list(NULL), m_is_finished(true) - {} - - column_id pattern_column() const { return m_pattern_column; } - column_id pattern_database_column() const - { - return m_pattern_database_column; - } - column_id replacement_column() const { return m_replacement_column; } - column_id enabled_column() const { return m_enabled_column; } - column_id message_column() const { return m_message_column; } - column_id pattern_digest_column() const { return m_pattern_digest_column; } - column_id normalized_pattern_column() const { - return m_normalized_pattern_column; - } - - /** - True if the table does not contain columns named 'pattern', 'replacement', - 'enabled' and 'message'. In this case the cursor is equal to any - past-the-end Cursor. - */ - bool table_is_malformed() { return m_table_is_malformed; } - - /** - Fetches the value of the column with the given number as a C string. - - This interface is meant for crossing dynamic library boundaries, hence the - use of C-style const char*. The function casts a column value to a C - string and returns a copy, allocated in the callee's DL. The pointer - must be freed using free_string(). - - @param fieldno One of PATTERN_COLUMN, REPLACEMENT_COLUMN, ENABLED_COLUMN - or MESSAGE_COLUMN. - */ - const char *fetch_string(int fieldno); - - /** - Equality operator. The only cursors that are equal are past-the-end - cursors. - */ - bool operator== (const Cursor &other) - { - return (m_is_finished == other.m_is_finished); - } - - /** - Inequality operator. All cursors are considered different except - past-the-end cursors. - */ - bool operator!= (const Cursor &other) { return !(*this == other); } - - /** - Advances this Cursor. Read errors are kept, and had_serious_read_error() - will tell if there was an unexpected error (e.g. not EOF) while reading. - */ - Cursor &operator++ () - { - if (!m_is_finished) - read(); - return *this; - } - - /// Prepares the write buffer for updating the current row. - void make_writeable(); - - /** - Sets the value of column colno to a string value. - - @param colno The column number. - @param str The string. - @param length The string's length. - */ - void set(int colno, const char* str, size_t length); - - /// Writes the row in the write buffer to the table at the current row. - int write(); - - /// True if there was an unexpected error while reading, e.g. other than EOF. - bool had_serious_read_error() const; - - /// Closes the table scan if initiated and commits the transaction. - ~Cursor(); - -private: - int field_index(const char *field_name); - - int m_pattern_column; - int m_pattern_database_column; - int m_replacement_column; - int m_enabled_column; - int m_message_column; - int m_pattern_digest_column; - int m_normalized_pattern_column; - - THD *m_thd; - TABLE_LIST *m_table_list; - - bool m_is_finished; - bool m_table_is_malformed; - int m_last_read_status; - - int read(); -}; - - -/** - A past-the-end Cursor. All past-the-end cursors are considered equal - when compared with operator ==. -*/ -Cursor end(); - -} - -#endif // SERVICE_RULES_TABLE_INCLUDED -#endif // __cplusplus diff --git a/mysql/mysql/service_security_context.h b/mysql/mysql/service_security_context.h deleted file mode 100644 index 2efa747..0000000 --- a/mysql/mysql/service_security_context.h +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (c) 2015, 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 */ - -#ifndef MYSQL_SERVICE_SECURITY_CONTEXT -#define MYSQL_SERVICE_SECURITY_CONTEXT - -/** - @file include/mysql/service_security_context.h - - This service provides functions for plugins and storage engines to - manipulate the thread's security context. -*/ - -#ifdef __cplusplus -class Security_context; -#define MYSQL_SECURITY_CONTEXT Security_context* -#else -#define MYSQL_SECURITY_CONTEXT void* -#endif -typedef char my_svc_bool; - -#ifdef __cplusplus -extern "C" { -#endif - -extern struct security_context_service_st { - my_svc_bool (*thd_get_security_context)(MYSQL_THD, MYSQL_SECURITY_CONTEXT *out_ctx); - my_svc_bool (*thd_set_security_context)(MYSQL_THD, MYSQL_SECURITY_CONTEXT in_ctx); - - my_svc_bool (*security_context_create)(MYSQL_SECURITY_CONTEXT *out_ctx); - my_svc_bool (*security_context_destroy)(MYSQL_SECURITY_CONTEXT); - my_svc_bool (*security_context_copy)(MYSQL_SECURITY_CONTEXT in_ctx, MYSQL_SECURITY_CONTEXT *out_ctx); - - my_svc_bool (*security_context_lookup)(MYSQL_SECURITY_CONTEXT ctx, - const char *user, const char *host, - const char *ip, const char *db); - - my_svc_bool (*security_context_get_option)(MYSQL_SECURITY_CONTEXT, const char *name, void *inout_pvalue); - my_svc_bool (*security_context_set_option)(MYSQL_SECURITY_CONTEXT, const char *name, void *pvalue); -} *security_context_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define thd_get_security_context(_THD, _CTX) \ - security_context_service->thd_get_security_context(_THD, _CTX) -#define thd_set_security_context(_THD, _CTX) \ - security_context_service->thd_set_security_context(_THD, _CTX) - -#define security_context_create(_CTX) \ - security_context_service->security_context_create(_CTX) -#define security_context_destroy(_CTX) \ - security_context_service->security_context_destroy(_CTX) -#define security_context_copy(_CTX1, _CTX2) \ - security_context_service->security_context_copy(_CTX1,_CTX2) - -#define security_context_lookup(_CTX, _U, _H, _IP, _DB) \ - security_context_service->security_context_lookup(_CTX, _U, _H, _IP, _DB) - -#define security_context_get_option(_SEC_CTX, _NAME, _VALUE) \ - security_context_service->security_context_get_option(_SEC_CTX, _NAME, _VALUE) -#define security_context_set_option(_SEC_CTX, _NAME, _VALUE) \ - security_context_service->security_context_set_option(_SEC_CTX, _NAME, _VALUE) -#else - my_svc_bool thd_get_security_context(MYSQL_THD, MYSQL_SECURITY_CONTEXT *out_ctx); - my_svc_bool thd_set_security_context(MYSQL_THD, MYSQL_SECURITY_CONTEXT in_ctx); - - my_svc_bool security_context_create(MYSQL_SECURITY_CONTEXT *out_ctx); - my_svc_bool security_context_destroy(MYSQL_SECURITY_CONTEXT ctx); - my_svc_bool security_context_copy(MYSQL_SECURITY_CONTEXT in_ctx, MYSQL_SECURITY_CONTEXT *out_ctx); - - my_svc_bool security_context_lookup(MYSQL_SECURITY_CONTEXT ctx, - const char *user, const char *host, - const char *ip, const char *db); - - my_svc_bool security_context_get_option(MYSQL_SECURITY_CONTEXT, const char *name, void *inout_pvalue); - my_svc_bool security_context_set_option(MYSQL_SECURITY_CONTEXT, const char *name, void *pvalue); -#endif /* !MYSQL_DYNAMIC_PLUGIN */ - -#ifdef __cplusplus -} -#endif /* _cplusplus */ - -#endif /* !MYSQL_SERVICE_SECURITY_CONTEXT */ diff --git a/mysql/mysql/service_srv_session.h b/mysql/mysql/service_srv_session.h deleted file mode 100644 index e6c83c8..0000000 --- a/mysql/mysql/service_srv_session.h +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright (c) 2015, 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 */ -#ifndef MYSQL_SRV_SESSION_SERVICE_INCLUDED -#define MYSQL_SRV_SESSION_SERVICE_INCLUDED - -/** - @file - Header file for the Server session service. This service is to provide - of creating sessions with the server. These sessions can be furtherly used - together with the Command service to execute commands in the server. -*/ - - -#ifdef __cplusplus -class Srv_session; -typedef class Srv_session* MYSQL_SESSION; -#else -struct Srv_session; -typedef struct Srv_session* MYSQL_SESSION; -#endif - -#ifndef MYSQL_ABI_CHECK -#include "mysql/plugin.h" /* MYSQL_THD */ -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (*srv_session_error_cb)(void *ctx, - unsigned int sql_errno, - const char *err_msg); - -extern struct srv_session_service_st -{ - int (*init_session_thread)(const void *plugin); - - void (*deinit_session_thread)(); - - MYSQL_SESSION (*open_session)(srv_session_error_cb error_cb, - void *plugix_ctx); - - int (*detach_session)(MYSQL_SESSION session); - - int (*close_session)(MYSQL_SESSION session); - - int (*server_is_available)(); -} *srv_session_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define srv_session_init_thread(plugin) \ - srv_session_service->init_session_thread((plugin)) - -#define srv_session_deinit_thread() \ - srv_session_service->deinit_session_thread() - -#define srv_session_open(cb, ctx) \ - srv_session_service->open_session((cb), (ctx)) - -#define srv_session_detach(session) \ - srv_session_service->detach_session((session)) - -#define srv_session_close(session) \ - srv_session_service->close_session((session)) - -#define srv_session_server_is_available() \ - srv_session_service->server_is_available() - -#else - -/** - Initializes the current physical thread to use with session service. - - Call this function ONLY in physical threads which are not initialized in - any way by the server. - - @param plugin Pointer to the plugin structure, passed to the plugin over - the plugin init function. - - @return - 0 success - 1 failure -*/ -int srv_session_init_thread(const void *plugin); - -/** - Deinitializes the current physical thread to use with session service. - - - Call this function ONLY in physical threads which were initialized using - srv_session_init_thread(). -*/ -void srv_session_deinit_thread(); - -/** - Opens a server session. - - In a thread not initialized by the server itself, this function should be - called only after srv_session_init_thread() has already been called. - - @param error_cb Default completion callback - @param plugin_ctx Plugin's context, opaque pointer that would - be provided to callbacks. Might be NULL. - @return - session on success - NULL on failure -*/ -MYSQL_SESSION srv_session_open(srv_session_error_cb cb, void *plugix_ctx); - -/** - Detaches a session from current physical thread. - - Detaches a previously attached session. Sessions are automatically attached - when they are used with the Command service (command_service_run_command()). - If the session is opened in a spawned thread, then it will stay attached - after command_service_run_command() until another session is used in the - same physical thread. The command services will detach the previously used - session and attach the one to be used for execution. - - This function should be called in case the session has to be used in - different physical thread. It will unbound the session from the current - physical thread. After that the session can be used in a different thread. - - @param session Session to detach - - @returns - 0 success - 1 failure -*/ -int srv_session_detach(MYSQL_SESSION session); - -/** - Closes a previously opened session. - - @param session Session to close - - @return - 0 success - 1 failure -*/ -int srv_session_close(MYSQL_SESSION session); - -/** - Returns if the server is available (not booting or shutting down) - - @return - 0 not available - 1 available -*/ -int srv_session_server_is_available(); - - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* MYSQL_SRV_SESSION_SERVICE_INCLUDED */ diff --git a/mysql/mysql/service_srv_session_info.h b/mysql/mysql/service_srv_session_info.h deleted file mode 100644 index 366529d..0000000 --- a/mysql/mysql/service_srv_session_info.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef MYSQL_SERVICE_SRV_SESSION_INFO_INCLUDED -#define MYSQL_SERVICE_SRV_SESSION_INFO_INCLUDED -/* Copyright (c) 2015, 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 */ - -/** - @file - Service providing setters and getters for some properties of a session -*/ - - -#include "mysql/service_srv_session.h" -#ifndef MYSQL_ABI_CHECK -#include "my_thread.h" /* my_thread_id */ -#include "m_string.h" /* LEX_CSTRING */ -#include "plugin.h" /* MYSQL_THD */ -#include "mysql_com.h" /* Vio for violite.h */ -#include "violite.h" /* enum_vio_type */ -#include /* uint16_t */ -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -extern struct srv_session_info_service_st { - MYSQL_THD (*get_thd)(MYSQL_SESSION session); - - my_thread_id (*get_session_id)(MYSQL_SESSION session); - - LEX_CSTRING (*get_current_db)(MYSQL_SESSION session); - - uint16_t (*get_client_port)(MYSQL_SESSION session); - int (*set_client_port)(MYSQL_SESSION session, uint16_t port); - - int (*set_connection_type)(MYSQL_SESSION session, enum enum_vio_type type); - - int (*killed)(MYSQL_SESSION session); - - unsigned int (*session_count)(); - unsigned int (*thread_count)(const void *plugin); -} *srv_session_info_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define srv_session_info_get_thd(session) srv_session_info_service->get_thd((session)) -#define srv_session_info_get_session_id(sess) srv_session_info_service->get_session_id((sess)) -#define srv_session_info_get_current_db(sess) srv_session_info_service->get_current_db((sess)) -#define srv_session_info_get_client_port(sess) srv_session_info_service->get_client_port((sess)) -#define srv_session_info_set_client_port(sess, port) srv_session_info_service->set_client_port((sess), (port)) -#define srv_session_info_set_connection_type(sess, type) srv_session_info_service->set_connection_type((sess), (type)) -#define srv_session_info_killed(sess) srv_session_info_service->killed((sess)) -#define srv_session_info_session_count(sess) srv_session_info_service->session_count(sess) -#define srv_session_info_thread_count(plugin) srv_session_info_service->thread_count(plugin) - -#else - -/** - Returns the THD of a session. - - @param session Session - - @returns - address of the THD -*/ -MYSQL_THD srv_session_info_get_thd(MYSQL_SESSION session); - -/** - Returns the ID of a session. - - @param session Session -*/ -my_thread_id srv_session_info_get_session_id(MYSQL_SESSION session); - -/** - Returns the current database of a session. - - @note {NULL, 0} is returned case of no current database or session is NULL - - - @param session Session -*/ -LEX_CSTRING srv_session_info_get_current_db(MYSQL_SESSION session); - -/** - Returns the client port of a session. - - @note The client port in SHOW PROCESSLIST, INFORMATION_SCHEMA.PROCESSLIST. - This port is NOT shown in PERFORMANCE_SCHEMA.THREADS. - - @param session Session -*/ -uint16_t srv_session_info_get_client_port(MYSQL_SESSION session); - -/** - Sets the client port of a session. - - @note The client port in SHOW PROCESSLIST, INFORMATION_SCHEMA.PROCESSLIST. - This port is NOT shown in PERFORMANCE_SCHEMA.THREADS. - - @param session Session - @param port Port number - - @return - 0 success - 1 failure -*/ -int srv_session_info_set_client_port(MYSQL_SESSION session, uint16_t port); - -/** - Sets the connection type of a session. - - @see enum_vio_type - - @note The type is shown in PERFORMANCE_SCHEMA.THREADS. The value is translated - from the enum to a string according to @see vio_type_names array - in vio/vio.c - - @note If NO_VIO_TYPE passed as type the call will fail. - - @return - 0 success - 1 failure -*/ -int srv_session_info_set_connection_type(MYSQL_SESSION session, - enum enum_vio_type type); - -/** - Returns whether the session was killed - - @param session Session - - @return - 0 not killed - 1 killed -*/ -int srv_session_info_killed(MYSQL_SESSION session); - -/** - Returns the number opened sessions in thread initialized by srv_session - service. -*/ -unsigned int srv_session_info_session_count(); - - -/** - Returns the number opened sessions in thread initialized by srv_session - service. - - @param plugin Pointer to the plugin structure, passed to the plugin over - the plugin init function. -*/ -unsigned int srv_session_info_thread_count(const void *plugin); - -#endif /* MYSQL_DYNAMIC_PLUGIN */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MYSQL_SERVICE_SRV_SESSION_INFO_INCLUDED */ diff --git a/mysql/mysql/service_thd_alloc.h b/mysql/mysql/service_thd_alloc.h deleted file mode 100644 index 5a89026..0000000 --- a/mysql/mysql/service_thd_alloc.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef MYSQL_SERVICE_THD_ALLOC_INCLUDED -/* Copyright (c) 2009, 2015, 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 */ - -/** - @file - This service provdes functions to allocate memory in a connection local - memory pool. The memory allocated there will be automatically freed at the - end of the statement, don't use it for allocations that should live longer - than that. For short living allocations this is more efficient than - using my_malloc and friends, and automatic "garbage collection" allows not - to think about memory leaks. - - The pool is best for small to medium objects, don't use it for large - allocations - they are better served with my_malloc. -*/ - -#ifndef MYSQL_ABI_CHECK -#include -#endif - -#ifdef __cplusplus -class THD; -#define MYSQL_THD THD* -#else -#define MYSQL_THD void* -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern struct thd_alloc_service_st { - void *(*thd_alloc_func)(MYSQL_THD, size_t); - void *(*thd_calloc_func)(MYSQL_THD, size_t); - char *(*thd_strdup_func)(MYSQL_THD, const char *); - char *(*thd_strmake_func)(MYSQL_THD, const char *, size_t); - void *(*thd_memdup_func)(MYSQL_THD, const void*, size_t); - MYSQL_LEX_STRING *(*thd_make_lex_string_func)(MYSQL_THD, MYSQL_LEX_STRING *, - const char *, size_t, int); -} *thd_alloc_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define thd_alloc(thd,size) (thd_alloc_service->thd_alloc_func((thd), (size))) - -#define thd_calloc(thd,size) (thd_alloc_service->thd_calloc_func((thd), (size))) - -#define thd_strdup(thd,str) (thd_alloc_service->thd_strdup_func((thd), (str))) - -#define thd_strmake(thd,str,size) \ - (thd_alloc_service->thd_strmake_func((thd), (str), (size))) - -#define thd_memdup(thd,str,size) \ - (thd_alloc_service->thd_memdup_func((thd), (str), (size))) - -#define thd_make_lex_string(thd, lex_str, str, size, allocate_lex_string) \ - (thd_alloc_service->thd_make_lex_string_func((thd), (lex_str), (str), \ - (size), (allocate_lex_string))) - -#else - -/** - Allocate memory in the connection's local memory pool - - @details - When properly used in place of @c my_malloc(), this can significantly - improve concurrency. Don't use this or related functions to allocate - large chunks of memory. Use for temporary storage only. The memory - will be freed automatically at the end of the statement; no explicit - code is required to prevent memory leaks. - - @see alloc_root() -*/ -void *thd_alloc(MYSQL_THD thd, size_t size); -/** - @see thd_alloc() -*/ -void *thd_calloc(MYSQL_THD thd, size_t size); -/** - @see thd_alloc() -*/ -char *thd_strdup(MYSQL_THD thd, const char *str); -/** - @see thd_alloc() -*/ -char *thd_strmake(MYSQL_THD thd, const char *str, size_t size); -/** - @see thd_alloc() -*/ -void *thd_memdup(MYSQL_THD thd, const void* str, size_t size); - -/** - Create a LEX_STRING in this connection's local memory pool - - @param thd user thread connection handle - @param lex_str pointer to LEX_STRING object to be initialized - @param str initializer to be copied into lex_str - @param size length of str, in bytes - @param allocate_lex_string flag: if TRUE, allocate new LEX_STRING object, - instead of using lex_str value - @return NULL on failure, or pointer to the LEX_STRING object - - @see thd_alloc() -*/ -MYSQL_LEX_STRING *thd_make_lex_string(MYSQL_THD thd, MYSQL_LEX_STRING *lex_str, - const char *str, size_t size, - int allocate_lex_string); - -#endif - -#ifdef __cplusplus -} -#endif - -#define MYSQL_SERVICE_THD_ALLOC_INCLUDED -#endif - diff --git a/mysql/mysql/service_thd_wait.h b/mysql/mysql/service_thd_wait.h deleted file mode 100644 index 62f2ea4..0000000 --- a/mysql/mysql/service_thd_wait.h +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 2010, 2015, 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 */ - -#ifndef MYSQL_SERVICE_THD_WAIT_INCLUDED -#define MYSQL_SERVICE_THD_WAIT_INCLUDED - -/** - @file include/mysql/service_thd_wait.h - This service provides functions for plugins and storage engines to report - when they are going to sleep/stall. - - SYNOPSIS - thd_wait_begin() - call just before a wait begins - thd Thread object - Use NULL if the thd is NOT known. - wait_type Type of wait - 1 -- short wait (e.g. for mutex) - 2 -- medium wait (e.g. for disk io) - 3 -- large wait (e.g. for locked row/table) - NOTES - This is used by the threadpool to have better knowledge of which - threads that currently are actively running on CPUs. When a thread - reports that it's going to sleep/stall, the threadpool scheduler is - free to start another thread in the pool most likely. The expected wait - time is simply an indication of how long the wait is expected to - become, the real wait time could be very different. - - thd_wait_end() called immediately after the wait is complete - - thd_wait_end() MUST be called if thd_wait_begin() was called. - - Using thd_wait_...() service is optional but recommended. Using it will - improve performance as the thread pool will be more active at managing the - thread workload. -*/ - -#ifdef __cplusplus -class THD; -#define MYSQL_THD THD* -#else -#define MYSQL_THD void* -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - One should only report wait events that could potentially block for a - long time. A mutex wait is too short of an event to report. The reason - is that an event which is reported leads to a new thread starts - executing a query and this has a negative impact of usage of CPU caches - and thus the expected gain of starting a new thread must be higher than - the expected cost of lost performance due to starting a new thread. - - Good examples of events that should be reported are waiting for row locks - that could easily be for many milliseconds or even seconds and the same - holds true for global read locks, table locks and other meta data locks. - Another event of interest is going to sleep for an extended time. - - Note that user-level locks no longer use THD_WAIT_USER_LOCK wait type. - Since their implementation relies on metadata locks manager it uses - THD_WAIT_META_DATA_LOCK instead. -*/ -typedef enum _thd_wait_type_e { - THD_WAIT_SLEEP= 1, - THD_WAIT_DISKIO= 2, - THD_WAIT_ROW_LOCK= 3, - THD_WAIT_GLOBAL_LOCK= 4, - THD_WAIT_META_DATA_LOCK= 5, - THD_WAIT_TABLE_LOCK= 6, - THD_WAIT_USER_LOCK= 7, - THD_WAIT_BINLOG= 8, - THD_WAIT_GROUP_COMMIT= 9, - THD_WAIT_SYNC= 10, - THD_WAIT_LAST= 11 -} thd_wait_type; - -extern struct thd_wait_service_st { - void (*thd_wait_begin_func)(MYSQL_THD, int); - void (*thd_wait_end_func)(MYSQL_THD); -} *thd_wait_service; - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define thd_wait_begin(_THD, _WAIT_TYPE) \ - thd_wait_service->thd_wait_begin_func(_THD, _WAIT_TYPE) -#define thd_wait_end(_THD) thd_wait_service->thd_wait_end_func(_THD) - -#else - -void thd_wait_begin(MYSQL_THD thd, int wait_type); -void thd_wait_end(MYSQL_THD thd); - -#endif - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/mysql/mysql/service_thread_scheduler.h b/mysql/mysql/service_thread_scheduler.h deleted file mode 100644 index 832aff0..0000000 --- a/mysql/mysql/service_thread_scheduler.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - Copyright (c) 2010, 2013, 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 -*/ - -#ifndef SERVICE_THREAD_SCHEDULER_INCLUDED -#define SERVICE_THREAD_SCHEDULER_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif - -struct Connection_handler_functions; -struct THD_event_functions; - -extern struct my_thread_scheduler_service { - int (*connection_handler_set)(struct Connection_handler_functions *, - struct THD_event_functions *); - int (*connection_handler_reset)(); -} *my_thread_scheduler_service; - - -#ifdef MYSQL_DYNAMIC_PLUGIN - -#define my_connection_handler_set(F, M) \ - my_thread_scheduler_service->connection_handler_set((F), (M)) -#define my_connection_handler_reset() \ - my_thread_scheduler_service->connection_handler_reset() - -#else - -/** - Instantiates Plugin_connection_handler based on the supplied - Conection_handler_functions and sets it as the current - connection handler. - - Also sets the THD_event_functions functions which will - be called by the server when e.g. begining a wait. - - Remembers the existing connection handler so that it can be restored later. - - @param chf struct with functions to be called when e.g. handling - new clients. - @param tef struct with functions to be called when events - (e.g. lock wait) happens. - - @note Both pointers (i.e. not the structs themselves) will be copied, - so the structs must not disappear. - - @note We don't support dynamically loading more than one connection handler. - - @retval 1 failure - @retval 0 success -*/ -int my_connection_handler_set(struct Connection_handler_functions *chf, - struct THD_event_functions *tef); - -/** - Destroys the current connection handler and restores the previous. - Should only be called after calling my_connection_handler_set(). - - @retval 1 failure - @retval 0 success -*/ -int my_connection_handler_reset(); - -#endif /* MYSQL_DYNAMIC_PLUGIN */ - -#ifdef __cplusplus -} -#endif - -#endif /* SERVICE_THREAD_SCHEDULER_INCLUDED */ diff --git a/mysql/mysql/services.h b/mysql/mysql/services.h deleted file mode 100644 index 8f3cca9..0000000 --- a/mysql/mysql/services.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef MYSQL_SERVICES_INCLUDED -/* Copyright (c) 2009, 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 */ - - -/* - Out of extern because of inclusion of files which include my_compiler.h - which in turn complains about C-linkage of templates. - service_srv_session.h and service_command.h use proper extern "C" for - their exported symbols. -*/ -#ifndef EMBEDDED_LIBRARY -#include -#include -#include -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -} -#endif - -#ifdef __cplusplus -#include -#endif - -#define MYSQL_SERVICES_INCLUDED -#endif /* MYSQL_SERVICES_INCLUDED */ -- cgit v1.1