2009-09-23 23:32:31 +02:00
|
|
|
#ifndef SQL_ARRAY_INCLUDED
|
|
|
|
#define SQL_ARRAY_INCLUDED
|
|
|
|
|
2011-06-30 17:46:53 +02:00
|
|
|
/* Copyright (c) 2003, 2005-2007 MySQL AB, 2009 Sun Microsystems, Inc.
|
|
|
|
Use is subject to license terms.
|
2005-08-25 15:34:34 +02:00
|
|
|
|
|
|
|
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
|
2006-12-23 20:17:15 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2005-08-25 15:34:34 +02:00
|
|
|
|
|
|
|
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
|
2011-06-30 17:46:53 +02:00
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
2005-08-25 15:34:34 +02:00
|
|
|
|
|
|
|
#include <my_sys.h>
|
|
|
|
|
2012-09-01 23:21:59 +02:00
|
|
|
/**
|
|
|
|
A wrapper class which provides array bounds checking.
|
|
|
|
We do *not* own the array, we simply have a pointer to the first element,
|
|
|
|
and a length.
|
|
|
|
|
|
|
|
@remark
|
|
|
|
We want the compiler-generated versions of:
|
|
|
|
- the copy CTOR (memberwise initialization)
|
|
|
|
- the assignment operator (memberwise assignment)
|
|
|
|
|
|
|
|
@param Element_type The type of the elements of the container.
|
|
|
|
*/
|
|
|
|
template <typename Element_type> class Bounds_checked_array
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Bounds_checked_array() : m_array(NULL), m_size(0) {}
|
|
|
|
|
2015-07-06 19:24:14 +02:00
|
|
|
Bounds_checked_array(Element_type *el, size_t size_arg)
|
|
|
|
: m_array(el), m_size(size_arg)
|
2012-09-01 23:21:59 +02:00
|
|
|
{}
|
|
|
|
|
|
|
|
void reset() { m_array= NULL; m_size= 0; }
|
|
|
|
|
2015-07-06 19:24:14 +02:00
|
|
|
void reset(Element_type *array_arg, size_t size_arg)
|
2012-09-01 23:21:59 +02:00
|
|
|
{
|
2015-07-06 19:24:14 +02:00
|
|
|
m_array= array_arg;
|
|
|
|
m_size= size_arg;
|
2012-09-01 23:21:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Set a new bound on the array. Does not resize the underlying
|
|
|
|
array, so the new size must be smaller than or equal to the
|
|
|
|
current size.
|
|
|
|
*/
|
|
|
|
void resize(size_t new_size)
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(new_size <= m_size);
|
|
|
|
m_size= new_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
Element_type &operator[](size_t n)
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(n < m_size);
|
|
|
|
return m_array[n];
|
|
|
|
}
|
|
|
|
|
|
|
|
const Element_type &operator[](size_t n) const
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(n < m_size);
|
|
|
|
return m_array[n];
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t element_size() const { return sizeof(Element_type); }
|
|
|
|
size_t size() const { return m_size; }
|
|
|
|
|
|
|
|
bool is_null() const { return m_array == NULL; }
|
|
|
|
|
|
|
|
void pop_front()
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_size > 0);
|
|
|
|
m_array+= 1;
|
|
|
|
m_size-= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
Element_type *array() const { return m_array; }
|
|
|
|
|
2016-02-09 21:35:59 +01:00
|
|
|
bool operator==(const Bounds_checked_array<Element_type>&rhs) const
|
|
|
|
{
|
|
|
|
return m_array == rhs.m_array && m_size == rhs.m_size;
|
|
|
|
}
|
|
|
|
bool operator!=(const Bounds_checked_array<Element_type>&rhs) const
|
|
|
|
{
|
|
|
|
return m_array != rhs.m_array || m_size != rhs.m_size;
|
|
|
|
}
|
|
|
|
|
2012-09-01 23:21:59 +02:00
|
|
|
private:
|
|
|
|
Element_type *m_array;
|
|
|
|
size_t m_size;
|
|
|
|
};
|
|
|
|
|
2005-08-25 15:34:34 +02:00
|
|
|
/*
|
|
|
|
A typesafe wrapper around DYNAMIC_ARRAY
|
2013-06-20 13:49:25 +02:00
|
|
|
|
|
|
|
TODO: Change creator to take a THREAD_SPECIFIC option.
|
2005-08-25 15:34:34 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
template <class Elem> class Dynamic_array
|
|
|
|
{
|
|
|
|
DYNAMIC_ARRAY array;
|
|
|
|
public:
|
|
|
|
Dynamic_array(uint prealloc=16, uint increment=16)
|
2013-06-19 13:32:14 +02:00
|
|
|
{
|
|
|
|
init(prealloc, increment);
|
|
|
|
}
|
|
|
|
|
2014-12-04 14:35:55 +01:00
|
|
|
Dynamic_array(MEM_ROOT *root, uint prealloc=16, uint increment=16)
|
|
|
|
{
|
|
|
|
void *init_buffer= alloc_root(root, sizeof(Elem) * prealloc);
|
|
|
|
my_init_dynamic_array2(&array, sizeof(Elem), init_buffer,
|
|
|
|
prealloc, increment, MYF(0));
|
|
|
|
}
|
|
|
|
|
2013-06-19 13:32:14 +02:00
|
|
|
void init(uint prealloc=16, uint increment=16)
|
2005-08-25 15:34:34 +02:00
|
|
|
{
|
MDEV-4011 Added per thread memory counting and usage
Base code and idea from a patch from by plinux at Taobao.
The idea is that we mark all memory that are thread specific with MY_THREAD_SPECIFIC.
Memory counting is done per thread in the my_malloc_size_cb_func callback function from my_malloc().
There are plenty of new asserts to ensure that for a debug server the counting is correct.
Information_schema.processlist gets two new columns: MEMORY_USED and EXAMINED_ROWS.
- The later is there mainly to show how query is progressing.
The following changes in interfaces was needed to get this to work:
- init_alloc_root() amd init_sql_alloc() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- One now have to use alloc_root_set_min_malloc() to set min memory to be allocated by alloc_root()
- my_init_dynamic_array() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- my_net_init() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- Added flag for hash_init() so that one can mark hash table to be thread specific.
- Added flags to init_tree() so that one can mark tree to be thread specific.
- Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
- Added flag to Warning_info::Warning_info() if the structure should be fully initialized.
- String elements can now be marked as thread specific.
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Changed type of myf from int to ulong, as this is always a set of bit flags.
Other things:
- Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
- We now also show EXAMINED_ROWS in SHOW PROCESSLIST
- Added new variable 'memory_used'
- Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
- Removed calls to the obsoleted function init_dynamic_array()
- Use set_current_thd() instead of my_pthread_setspecific_ptr(THR_THD,...)
client/completion_hash.cc:
Updated call to init_alloc_root()
client/mysql.cc:
Updated call to init_alloc_root()
client/mysqlbinlog.cc:
init_dynamic_array() -> my_init_dynamic_array()
Updated call to init_alloc_root()
client/mysqlcheck.c:
Updated call to my_init_dynamic_array()
client/mysqldump.c:
Updated call to init_alloc_root()
client/mysqltest.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Fixed compiler warnings
extra/comp_err.c:
Updated call to my_init_dynamic_array()
extra/resolve_stack_dump.c:
Updated call to my_init_dynamic_array()
include/hash.h:
Added HASH_THREAD_SPECIFIC
include/heap.h:
Added flag is internal temporary table.
include/my_dir.h:
Safety fix: Ensure that MY_DONT_SORT and MY_WANT_STAT don't interfer with other mysys flags
include/my_global.h:
Changed type of myf from int to ulong, as this is always a set of bit flags.
include/my_sys.h:
Added MY_THREAD_SPECIFIC and MY_THREAD_MOVE
Added malloc_flags to DYNAMIC_ARRAY
Added extra mysys flag argument to my_init_dynamic_array()
Removed deprecated functions init_dynamic_array() and my_init_dynamic_array.._ci
Updated paramaters for init_alloc_root()
include/my_tree.h:
Added my_flags to allow one to use MY_THREAD_SPECIFIC with hash tables.
Removed with_delete. One should now instead use MY_TREE_WITH_DELETE_FLAG
Updated parameters to init_tree()
include/myisamchk.h:
Added malloc_flags to allow one to use MY_THREAD_SPECIFIC for checks.
include/mysql.h:
Added MYSQL_THREAD_SPECIFIC_MALLOC
Used 'unused1' to mark memory as thread specific.
include/mysql.h.pp:
Updated file
include/mysql_com.h:
Used 'unused1' to mark memory as thread specific.
Updated parameters for my_net_init()
libmysql/libmysql.c:
Updated call to init_alloc_root() to mark memory thread specific.
libmysqld/emb_qcache.cc:
Updated call to init_alloc_root()
libmysqld/lib_sql.cc:
Updated call to init_alloc_root()
mysql-test/r/create.result:
Updated results
mysql-test/r/user_var.result:
Updated results
mysql-test/suite/funcs_1/datadict/processlist_priv.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/datadict/processlist_val.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/is_columns_is.result:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result:
Updated results
mysql-test/suite/funcs_1/r/processlist_val_no_prot.result:
Updated results
mysql-test/t/show_explain.test:
Fixed usage of debug variable so that one can run test with --debug
mysql-test/t/user_var.test:
Added test of memory_usage variable.
mysys/array.c:
Added extra my_flags option to init_dynamic_array() and init_dynamic_array2() so that one can mark memory with MY_THREAD_SPECIFIC
All allocated memory is marked with the given my_flags.
Removed obsolete function init_dynamic_array()
mysys/default.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
mysys/hash.c:
Updated call to my_init_dynamic_array_ci().
Allocated memory is marked with MY_THREAD_SPECIFIC if HASH_THREAD_SPECIFIC is used.
mysys/ma_dyncol.c:
init_dynamic_array() -> my_init_dynamic_array()
Added #if to get rid of compiler warnings
mysys/mf_tempdir.c:
Updated call to my_init_dynamic_array()
mysys/my_alloc.c:
Added extra parameter to init_alloc_root() so that one can mark memory with MY_THREAD_SPECIFIC
Extend MEM_ROOT with a flag if memory is thread specific.
This is stored in block_size, to keep the size of the MEM_ROOT object identical as before.
Allocated memory is marked with MY_THREAD_SPECIFIC if used with init_alloc_root()
mysys/my_chmod.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_chsize.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_copy.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_create.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_delete.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_error.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fopen.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fstream.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_getwd.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_lib.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Updated DBUG_PRINT because of change of myf type
mysys/my_lock.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_malloc.c:
Store at start of each allocated memory block the size of the block and if the block is thread specific.
Call malloc_size_cb_func, if set, with the memory allocated/freed.
Updated DBUG_PRINT because of change of myf type
mysys/my_open.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_pread.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_read.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_redel.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_rename.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_seek.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_sync.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_thr_init.c:
Ensure that one can call my_thread_dbug_id() even if thread is not properly initialized.
mysys/my_write.c:
Updated DBUG_PRINT because of change of myf type
mysys/mysys_priv.h:
Updated parameters to sf_malloc and sf_realloc()
mysys/safemalloc.c:
Added checking that for memory marked with MY_THREAD_SPECIFIC that it's the same thread that is allocation and freeing the memory.
Added sf_malloc_dbug_id() to allow MariaDB to specify which THD is handling the memory.
Added my_flags arguments to sf_malloc() and sf_realloc() to be able to mark memory with MY_THREAD_SPECIFIC.
Added sf_report_leaked_memory() to get list of memory not freed by a thread.
mysys/tree.c:
Added flags to init_tree() so that one can mark tree to be thread specific.
Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
Updated call to init_alloc_root()
All allocated memory is marked with the given malloc flags
mysys/waiting_threads.c:
Updated call to my_init_dynamic_array()
sql-common/client.c:
Updated call to init_alloc_root() and my_net_init() to mark memory thread specific.
Updated call to my_init_dynamic_array().
Added MYSQL_THREAD_SPECIFIC_MALLOC so that client can mark memory as MY_THREAD_SPECIFIC.
sql-common/client_plugin.c:
Updated call to init_alloc_root()
sql/debug_sync.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/event_scheduler.cc:
Removed calls to net_end() as this is now done in ~THD()
Call set_current_thd() to ensure that memory is assigned to right thread.
sql/events.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/filesort.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/filesort_utils.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/ha_ndbcluster.cc:
Updated call to init_alloc_root()
Updated call to my_net_init()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_ndbcluster_binlog.cc:
Updated call to my_net_init()
Updated call to init_sql_alloc()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_partition.cc:
Updated call to init_alloc_root()
sql/handler.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
Added missing call to my_dir_end()
sql/item_func.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_subselect.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_sum.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/log.cc:
More DBUG
Updated call to init_alloc_root()
sql/mdl.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/mysqld.cc:
Added total_memory_used
Updated call to init_alloc_root()
Move mysql_cond_broadcast() before my_thread_end()
Added mariadb_dbug_id() to count memory per THD instead of per thread.
Added my_malloc_size_cb_func() callback function for my_malloc() to count memory.
Move initialization of mysqld_server_started and mysqld_server_initialized earlier.
Updated call to my_init_dynamic_array().
Updated call to my_net_init().
Call my_pthread_setspecific_ptr(THR_THD,...) to ensure that memory is assigned to right thread.
Added status variable 'memory_used'.
Updated call to init_alloc_root()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/mysqld.h:
Added set_current_thd()
sql/net_serv.cc:
Added new parameter to my_net_init() so that one can mark memory with MY_THREAD_SPECIFIC.
Store in net->thread_specific_malloc if memory is thread specific.
Mark memory to be thread specific if requested.
sql/opt_range.cc:
Updated call to my_init_dynamic_array()
Updated call to init_sql_alloc()
Added MY_THREAD_SPECIFIC to allocated memory.
sql/opt_subselect.cc:
Updated call to init_sql_alloc() to mark memory thread specific.
sql/protocol.cc:
Fixed compiler warning
sql/records.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/rpl_filter.cc:
Updated call to my_init_dynamic_array()
sql/rpl_handler.cc:
Updated call to my_init_dynamic_array2()
sql/rpl_handler.h:
Updated call to init_sql_alloc()
sql/rpl_mi.cc:
Updated call to my_init_dynamic_array()
sql/rpl_tblmap.cc:
Updated call to init_alloc_root()
sql/rpl_utility.cc:
Updated call to my_init_dynamic_array()
sql/slave.cc:
Initialize things properly before calling functions that allocate memory.
Removed calls to net_end() as this is now done in ~THD()
sql/sp_head.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
Added parameter to warning_info() that it should be fully initialized.
sql/sp_pcontext.cc:
Updated call to my_init_dynamic_array()
sql/sql_acl.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_admin.cc:
Added parameter to warning_info() that it should be fully initialized.
sql/sql_analyse.h:
Updated call to init_tree() to mark memory thread specific.
sql/sql_array.h:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_audit.cc:
Updated call to my_init_dynamic_array()
sql/sql_base.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_cache.cc:
Updated comment
sql/sql_class.cc:
Added parameter to warning_info() that not initialize it until THD is fully created.
Updated call to init_sql_alloc()
Mark THD::user_vars has to be thread specific.
Updated call to my_init_dynamic_array()
Ensure that memory allocated by THD is assigned to the THD.
More DBUG
Always acll net_end() in ~THD()
Assert that all memory signed to this THD is really deleted at ~THD.
Fixed set_status_var_init() to not reset memory_used.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_class.h:
Added MY_THREAD_SPECIFIC to allocated memory.
Added malloc_size to THD to record allocated memory per THD.
sql/sql_delete.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_error.cc:
Added 'initialize' parameter to Warning_info() to say if should allocate memory for it's structures.
This is used by THD::THD() to not allocate memory until THD is ready.
Added Warning_info::free_memory()
sql/sql_error.h:
Updated Warning_info() class.
sql/sql_handler.cc:
Updated call to init_alloc_root() to mark memory thread specific.
sql/sql_insert.cc:
More DBUG
sql/sql_join_cache.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_lex.cc:
Updated call to my_init_dynamic_array()
sql/sql_lex.h:
Updated call to my_init_dynamic_array()
sql/sql_load.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_parse.cc:
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
Ensure that examined_row_count() is reset before query.
Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Don't restore thd->status_var.memory_used when restoring thd->status_var
sql/sql_plugin.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Don't allocate THD on the stack, as this causes problems with valgrind when doing thd memory counting.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_prepare.cc:
Added parameter to warning_info() that it should be fully initialized.
Updated call to init_sql_alloc() to mark memory thread specific.
sql/sql_reload.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_select.cc:
Updated call to my_init_dynamic_array() and init_sql_alloc() to mark memory thread specific.
Added MY_THREAD_SPECIFIC to allocated memory.
More DBUG
sql/sql_servers.cc:
Updated call to init_sql_alloc() to mark memory some memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_show.cc:
Updated call to my_init_dynamic_array()
Mark my_dir() memory thread specific.
Use my_pthread_setspecific_ptr(THR_THD,...) to mark that allocated memory should be allocated to calling thread.
More DBUG.
Added malloc_size and examined_row_count to SHOW PROCESSLIST.
Added MY_THREAD_SPECIFIC to allocated memory.
Updated call to init_sql_alloc()
Added parameter to warning_info() that it should be fully initialized.
sql/sql_statistics.cc:
Fixed compiler warning
sql/sql_string.cc:
String elements can now be marked as thread specific.
sql/sql_string.h:
String elements can now be marked as thread specific.
sql/sql_table.cc:
Updated call to init_sql_alloc() and my_malloc() to mark memory thread specific
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Fixed compiler warning
sql/sql_test.cc:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_trigger.cc:
Updated call to init_sql_alloc()
sql/sql_udf.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_update.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/table.cc:
Updated call to init_sql_alloc().
Mark memory used by temporary tables, that are not for slave threads, as MY_THREAD_SPECIFIC
Updated call to init_sql_alloc()
sql/thr_malloc.cc:
Added my_flags argument to init_sql_alloc() to be able to mark memory as MY_THREAD_SPECIFIC.
sql/thr_malloc.h:
Updated prototype for init_sql_alloc()
sql/tztime.cc:
Updated call to init_sql_alloc()
Updated call to init_alloc_root() to mark memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/uniques.cc:
Updated calls to init_tree(), my_init_dynamic_array() and my_malloc() to mark memory thread specific.
sql/unireg.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/csv/ha_tina.cc:
Updated call to init_alloc_root()
storage/federated/ha_federated.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Ensure that memory allocated by fedarated is registered for the system, not for the thread.
storage/federatedx/federatedx_io_mysql.cc:
Updated call to my_init_dynamic_array()
storage/federatedx/ha_federatedx.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
storage/heap/ha_heap.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/heap/heapdef.h:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_block.c:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_create.c:
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Use MY_TREE_WITH_DELETE instead of removed option 'with_delete'.
storage/heap/hp_open.c:
Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
storage/heap/hp_write.c:
Added new parameter to hp_get_new_block()
storage/maria/ma_bitmap.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_blockrec.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_check.c:
Updated call to init_alloc_root()
storage/maria/ma_ft_boolean_search.c:
Updated calls to init_tree() and init_alloc_root()
storage/maria/ma_ft_nlq_search.c:
Updated call to init_tree()
storage/maria/ma_ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/maria/ma_loghandler.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_open.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_sort.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_write.c:
Updated calls to my_init_dynamic_array() and init_tree()
storage/maria/maria_pack.c:
Updated call to init_tree()
storage/maria/unittest/sequence_storage.c:
Updated call to my_init_dynamic_array()
storage/myisam/ft_boolean_search.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_nlq_search.c:
Updated call to init_tree()
storage/myisam/ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_stopwords.c:
Updated call to init_tree()
storage/myisam/mi_check.c:
Updated call to init_alloc_root()
storage/myisam/mi_write.c:
Updated call to my_init_dynamic_array()
Updated call to init_tree()
storage/myisam/myisamlog.c:
Updated call to init_tree()
storage/myisam/myisampack.c:
Updated call to init_tree()
storage/myisam/sort.c:
Updated call to my_init_dynamic_array()
storage/myisammrg/ha_myisammrg.cc:
Updated call to init_sql_alloc()
storage/perfschema/pfs_check.cc:
Rest current_thd
storage/perfschema/pfs_instr.cc:
Removed DBUG_ENTER/DBUG_VOID_RETURN as at this point my_thread_var is not allocated anymore, which can cause problems.
support-files/compiler_warnings.supp:
Disable compiler warning from offsetof macro.
2013-01-23 16:16:14 +01:00
|
|
|
my_init_dynamic_array(&array, sizeof(Elem), prealloc, increment,
|
2013-06-20 13:49:25 +02:00
|
|
|
MYF(0));
|
2005-08-25 15:34:34 +02:00
|
|
|
}
|
|
|
|
|
2013-06-19 13:32:14 +02:00
|
|
|
/**
|
|
|
|
@note Though formally this could be declared "const" it would be
|
|
|
|
misleading at it returns a non-const pointer to array's data.
|
|
|
|
*/
|
2013-04-09 15:49:00 +02:00
|
|
|
Elem& at(size_t idx)
|
2005-08-25 15:34:34 +02:00
|
|
|
{
|
2013-06-21 20:26:03 +02:00
|
|
|
DBUG_ASSERT(idx < array.elements);
|
2005-08-25 15:34:34 +02:00
|
|
|
return *(((Elem*)array.buffer) + idx);
|
|
|
|
}
|
2013-06-19 13:32:14 +02:00
|
|
|
/// Const variant of at(), which cannot change data
|
2013-07-21 16:39:19 +02:00
|
|
|
const Elem& at(size_t idx) const
|
2005-08-25 15:34:34 +02:00
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
return *(((Elem*)array.buffer) + idx);
|
2005-08-25 15:34:34 +02:00
|
|
|
}
|
|
|
|
|
2013-10-29 15:08:44 +01:00
|
|
|
/// @returns pointer to first element
|
2005-08-25 15:34:34 +02:00
|
|
|
Elem *front()
|
|
|
|
{
|
|
|
|
return (Elem*)array.buffer;
|
|
|
|
}
|
|
|
|
|
2013-10-29 15:08:44 +01:00
|
|
|
/// @returns pointer to first element
|
2013-06-19 13:32:14 +02:00
|
|
|
const Elem *front() const
|
2013-04-07 17:11:19 +02:00
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
return (const Elem*)array.buffer;
|
2013-04-07 17:11:19 +02:00
|
|
|
}
|
|
|
|
|
2013-10-29 15:08:44 +01:00
|
|
|
/// @returns pointer to last element
|
2005-08-25 15:34:34 +02:00
|
|
|
Elem *back()
|
|
|
|
{
|
2013-10-29 15:08:44 +01:00
|
|
|
return ((Elem*)array.buffer) + array.elements - 1;
|
2005-08-25 15:34:34 +02:00
|
|
|
}
|
|
|
|
|
2013-10-29 15:08:44 +01:00
|
|
|
/// @returns pointer to last element
|
2013-06-19 13:32:14 +02:00
|
|
|
const Elem *back() const
|
2013-04-09 15:49:00 +02:00
|
|
|
{
|
2013-10-29 15:08:44 +01:00
|
|
|
return ((const Elem*)array.buffer) + array.elements - 1;
|
2013-04-09 15:49:00 +02:00
|
|
|
}
|
|
|
|
|
2013-06-19 13:32:14 +02:00
|
|
|
/**
|
|
|
|
@retval false ok
|
|
|
|
@retval true OOM, @c my_error() has been called.
|
|
|
|
*/
|
|
|
|
bool append(const Elem &el)
|
2005-08-25 15:34:34 +02:00
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
return insert_dynamic(&array, &el);
|
2005-08-25 15:34:34 +02:00
|
|
|
}
|
|
|
|
|
2013-07-21 16:39:19 +02:00
|
|
|
bool append_val(Elem el)
|
2005-08-25 15:34:34 +02:00
|
|
|
{
|
2013-07-21 16:39:19 +02:00
|
|
|
return (insert_dynamic(&array, (uchar*)&el));
|
2005-08-25 15:34:34 +02:00
|
|
|
}
|
|
|
|
|
2013-10-18 21:35:22 +02:00
|
|
|
bool push(Elem &el)
|
|
|
|
{
|
|
|
|
return append(el);
|
|
|
|
}
|
|
|
|
|
2013-06-16 20:26:40 +02:00
|
|
|
/// Pops the last element. Does nothing if array is empty.
|
|
|
|
Elem& pop()
|
2010-01-17 15:51:10 +01:00
|
|
|
{
|
2013-06-16 20:26:40 +02:00
|
|
|
return *((Elem*)pop_dynamic(&array));
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
|
|
|
|
2013-06-16 20:26:40 +02:00
|
|
|
void del(uint idx)
|
2010-01-17 15:51:10 +01:00
|
|
|
{
|
2013-06-16 20:26:40 +02:00
|
|
|
delete_dynamic_element(&array, idx);
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
|
|
|
|
2013-07-21 16:39:19 +02:00
|
|
|
size_t elements() const
|
2010-01-17 15:51:10 +01:00
|
|
|
{
|
2005-08-25 15:34:34 +02:00
|
|
|
return array.elements;
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
|
|
|
|
2013-07-21 16:39:19 +02:00
|
|
|
void elements(size_t num_elements)
|
2010-01-17 15:51:10 +01:00
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
DBUG_ASSERT(num_elements <= array.max_element);
|
|
|
|
array.elements= num_elements;
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
|
|
|
|
2013-06-19 13:32:14 +02:00
|
|
|
void clear()
|
2010-01-17 15:51:10 +01:00
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
elements(0);
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
|
|
|
|
2013-06-19 13:32:14 +02:00
|
|
|
void set(uint idx, const Elem &el)
|
2010-01-17 15:51:10 +01:00
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
set_dynamic(&array, &el, idx);
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
|
|
|
|
2013-06-21 20:26:03 +02:00
|
|
|
bool resize(size_t new_size, Elem default_val)
|
|
|
|
{
|
|
|
|
size_t old_size= elements();
|
|
|
|
if (allocate_dynamic(&array, new_size))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if (new_size > old_size)
|
|
|
|
{
|
|
|
|
set_dynamic(&array, (uchar*)&default_val, new_size - 1);
|
|
|
|
/*for (size_t i= old_size; i != new_size; i++)
|
|
|
|
{
|
|
|
|
at(i)= default_val;
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-06-19 13:32:14 +02:00
|
|
|
~Dynamic_array()
|
2010-01-17 15:51:10 +01:00
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
delete_dynamic(&array);
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
|
|
|
|
2016-04-28 10:28:02 +02:00
|
|
|
void free_memory()
|
|
|
|
{
|
|
|
|
delete_dynamic(&array);
|
|
|
|
}
|
|
|
|
|
2013-06-19 13:32:14 +02:00
|
|
|
typedef int (*CMP_FUNC)(const Elem *el1, const Elem *el2);
|
2010-01-17 15:51:10 +01:00
|
|
|
|
|
|
|
void sort(CMP_FUNC cmp_func)
|
|
|
|
{
|
2013-06-19 13:32:14 +02:00
|
|
|
my_qsort(array.buffer, array.elements, sizeof(Elem), (qsort_cmp)cmp_func);
|
2010-01-17 15:51:10 +01:00
|
|
|
}
|
2013-10-18 21:35:22 +02:00
|
|
|
|
|
|
|
typedef int (*CMP_FUNC2)(const Elem *el1, const Elem *el2, void *);
|
|
|
|
void sort(CMP_FUNC2 cmp_func, void *data)
|
|
|
|
{
|
|
|
|
my_qsort2(array.buffer, array.elements, sizeof(Elem), (qsort2_cmp)cmp_func, data);
|
|
|
|
}
|
2010-01-17 15:51:10 +01:00
|
|
|
};
|
|
|
|
|
2009-09-23 23:32:31 +02:00
|
|
|
#endif /* SQL_ARRAY_INCLUDED */
|