From a2a2e32c02643a0cec111511220227703fda1cd5 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 1 Jul 2024 20:15:00 +0200 Subject: Merging upstream version 1:11.4.2. Signed-off-by: Daniel Baumann --- mysys/array.c | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'mysys/array.c') diff --git a/mysys/array.c b/mysys/array.c index 6e871ee6..02a54d44 100644 --- a/mysys/array.c +++ b/mysys/array.c @@ -92,7 +92,7 @@ my_bool init_dynamic_array2(PSI_memory_key psi_key, DYNAMIC_ARRAY *array, my_bool insert_dynamic(DYNAMIC_ARRAY *array, const void * element) { void *buffer; - if (array->elements == array->max_element) + if (unlikely(array->elements == array->max_element)) { /* Call only when necessary */ if (!(buffer=alloc_dynamic(array))) return TRUE; @@ -102,7 +102,42 @@ my_bool insert_dynamic(DYNAMIC_ARRAY *array, const void * element) buffer=array->buffer+(array->elements * array->size_of_element); array->elements++; } - memcpy(buffer,element,(size_t) array->size_of_element); + memcpy(buffer, element, array->size_of_element); + return FALSE; +} + + +/* Fast version of appending to dynamic array */ + +void init_append_dynamic(DYNAMIC_ARRAY_APPEND *append, + DYNAMIC_ARRAY *array) +{ + append->array= array; + append->pos= array->buffer + array->elements * array->size_of_element; + append->end= array->buffer + array->max_element * array->size_of_element; +} + + +my_bool append_dynamic(DYNAMIC_ARRAY_APPEND *append, + const void *element) +{ + DYNAMIC_ARRAY *array= append->array; + size_t size_of_element= array->size_of_element; + if (unlikely(append->pos == append->end)) + { + void *buffer; + if (!(buffer=alloc_dynamic(array))) + return TRUE; + append->pos= (uchar*)buffer + size_of_element; + append->end= array->buffer + array->max_element * size_of_element; + memcpy(buffer, element, size_of_element); + } + else + { + array->elements++; + memcpy(append->pos, element, size_of_element); + append->pos+= size_of_element; + } return FALSE; } @@ -281,7 +316,7 @@ my_bool allocate_dynamic(DYNAMIC_ARRAY *array, size_t max_elements) void get_dynamic(DYNAMIC_ARRAY *array, void *element, size_t idx) { - if (idx >= array->elements) + if (unlikely(idx >= array->elements)) { DBUG_PRINT("warning",("To big array idx: %d, array size is %d", idx,array->elements)); @@ -306,7 +341,7 @@ void delete_dynamic(DYNAMIC_ARRAY *array) /* Just mark as empty if we are using a static buffer */ - if (!(array->malloc_flags & MY_INIT_BUFFER_USED) && array->buffer) + if (array->buffer && !(array->malloc_flags & MY_INIT_BUFFER_USED)) my_free(array->buffer); array->buffer= 0; -- cgit v1.2.3