@@ -752,7 +752,7 @@ pthread_attr_t connection_attrib;
752752mysql_mutex_t LOCK_server_started;
753753mysql_cond_t COND_server_started;
754754
755- int mysqld_server_started= 0 ;
755+ int mysqld_server_started= 0 , mysqld_server_initialized= 0 ;
756756
757757File_parser_dummy_hook file_parser_dummy_hook;
758758
@@ -3590,6 +3590,55 @@ SHOW_VAR com_status_vars[]= {
35903590 {NullS, NullS, SHOW_LONG}
35913591};
35923592
3593+ /* Thread Memory Used */
3594+ extern " C" {
3595+ /*
3596+ Callback Function for memory allocation.
3597+ flag = -1 mean malloc/free
3598+ flag = 0 mean MEM mem_root
3599+ flag = 1 mean EXTEND mem_root
3600+ */
3601+
3602+ void my_malloc_size_cb_func (size_t size, int flag, MEM_ROOT *root)
3603+ {
3604+ THD *thd= current_thd;
3605+
3606+ if (flag == -1 )
3607+ {
3608+ if (mysqld_server_initialized || thd)
3609+ {
3610+ /*
3611+ THD may not be set if we are called from my_net_init() before THD
3612+ thread has started.
3613+ However, this should never happen, so better to assert and
3614+ fix this.
3615+ */
3616+ // DBUG_ASSERT(thd);
3617+
3618+ if (thd)
3619+ {
3620+ DBUG_PRINT (" info" , (" memory_used: %lld size: %ld" ,
3621+ (longlong) thd->status_var .memory_used , size));
3622+ thd->status_var .memory_used += size;
3623+ }
3624+
3625+ }
3626+ int64 volatile *volatile ptr= &global_status_var.memory_used ;
3627+ my_atomic_add64 (ptr, size);
3628+ }
3629+ else
3630+ {
3631+ if (!thd || !thd->mem_root || root != thd->mem_root )
3632+ return ;
3633+ if (flag == 0 )
3634+ thd->status_var .query_memory_used = size;
3635+ else if (flag == 1 )
3636+ thd->status_var .query_memory_used += size;
3637+ }
3638+
3639+ }
3640+ }
3641+
35933642LEX_CSTRING sql_statement_names[(uint) SQLCOM_END + 1];
35943643
35953644void init_sql_statement_names ()
@@ -3720,6 +3769,10 @@ rpl_make_log_name(const char *opt,
37203769int init_common_variables ()
37213770{
37223771 umask (((~my_umask) & 0666 ));
3772+
3773+ // Set memory size callback function
3774+ set_thd_mem_size_cb (my_malloc_size_cb_func);
3775+ set_thd_query_size_cb (my_malloc_size_cb_func);
37233776 connection_errors_select= 0 ;
37243777 connection_errors_accept= 0 ;
37253778 connection_errors_tcpwrap= 0 ;
@@ -5233,6 +5286,8 @@ int mysqld_main(int argc, char **argv)
52335286 */
52345287 my_progname= argv[0 ];
52355288
5289+ mysqld_server_started= mysqld_server_initialized= 0 ;
5290+
52365291#ifndef _WIN32
52375292 // For windows, my_init() is called from the win specific mysqld_main
52385293 if (my_init ()) // init my_sys library & pthreads
@@ -5670,6 +5725,9 @@ int mysqld_main(int argc, char **argv)
56705725 unireg_abort (1 );
56715726 }
56725727
5728+ /* It is now safe to use thread specific memory */
5729+ mysqld_server_initialized= 1 ;
5730+
56735731 create_shutdown_thread ();
56745732 start_handle_manager ();
56755733
@@ -7978,6 +8036,8 @@ SHOW_VAR status_vars[]= {
79788036 {" Last_query_cost" , (char *) offsetof (STATUS_VAR, last_query_cost), SHOW_DOUBLE_STATUS},
79798037 {" Last_query_partial_plans" , (char *) offsetof (STATUS_VAR, last_query_partial_plans), SHOW_LONGLONG_STATUS},
79808038 {" Max_used_connections" , (char *) &max_used_connections, SHOW_LONG},
8039+ {" Memory_used" , (char *) offsetof (STATUS_VAR, memory_used), SHOW_LONGLONG_STATUS},
8040+ {" Query_memory_used" , (char *) offsetof (STATUS_VAR, query_memory_used), SHOW_LONGLONG_STATUS},
79818041 {" Not_flushed_delayed_rows" , (char *) &delayed_rows_in_use, SHOW_LONG_NOFLUSH},
79828042 {" Open_files" , (char *) &my_file_opened, SHOW_LONG_NOFLUSH},
79838043 {" Open_streams" , (char *) &my_stream_opened, SHOW_LONG_NOFLUSH},
0 commit comments