| 160 | */ |
| 161 | |
| 162 | void *alloc_dynamic(DYNAMIC_ARRAY *array) |
| 163 | { |
| 164 | DBUG_ENTER("alloc_dynamic"); |
| 165 | |
| 166 | DBUG_ASSERT(array->size_of_element); /* Ensure init() is called */ |
| 167 | if (array->elements == array->max_element) |
| 168 | { |
| 169 | char *new_ptr; |
| 170 | if (array->malloc_flags & MY_INIT_BUFFER_USED) |
| 171 | { |
| 172 | /* |
| 173 | In this scenario, the buffer is statically preallocated, |
| 174 | so we have to create an all-new malloc since we overflowed |
| 175 | */ |
| 176 | if (!(new_ptr= (char *) my_malloc(array->m_psi_key, |
| 177 | (array->max_element+ |
| 178 | array->alloc_increment) * |
| 179 | array->size_of_element, |
| 180 | MYF(array->malloc_flags | MY_WME)))) |
| 181 | DBUG_RETURN(0); |
| 182 | if (array->elements) |
| 183 | memcpy(new_ptr, array->buffer, |
| 184 | array->elements * array->size_of_element); |
| 185 | array->malloc_flags&= ~MY_INIT_BUFFER_USED; |
| 186 | } |
| 187 | else if (!(new_ptr=(char*) |
| 188 | my_realloc(array->m_psi_key, array->buffer, |
| 189 | (array->max_element+ array->alloc_increment) * |
| 190 | array->size_of_element, |
| 191 | MYF(MY_WME | MY_ALLOW_ZERO_PTR | |
| 192 | array->malloc_flags)))) |
| 193 | DBUG_RETURN(0); |
| 194 | array->buffer= (uchar*) new_ptr; |
| 195 | array->max_element+=array->alloc_increment; |
| 196 | } |
| 197 | DBUG_RETURN(array->buffer+(array->elements++ * array->size_of_element)); |
| 198 | } |
| 199 | |
| 200 | |
| 201 | /* |
no test coverage detected