void sm_free_pool(struct smalloc_pool *spool, void *p) { struct smalloc_hdr *shdr; char *s; if (!smalloc_verify_pool(spool)) { errno = EINVAL; return; } if (!p) return; shdr = USER_TO_HEADER(p); if (smalloc_is_alloc(spool, shdr)) { if (spool->do_zero) memset(p, 0, shdr->rsz); s = CHAR_PTR(p); s += shdr->usz; memset(s, 0, HEADER_SZ); if (spool->do_zero) memset(s+HEADER_SZ, 0, shdr->rsz - shdr->usz); memset(shdr, 0, HEADER_SZ); if (!spool->do_zero) { memcpy(shdr, "FREED MEMORY", 12); memcpy(s, "FREEDBARRIER", 12); } return; } smalloc_UB(spool, p); return; }
void my_claim(void *ptr) { my_memory_header *mh; if (ptr == NULL) return; mh= USER_TO_HEADER(ptr); DBUG_ASSERT(mh->m_magic == MAGIC); mh->m_key= PSI_MEMORY_CALL(memory_claim)(mh->m_key, mh->m_size, & mh->m_owner); }
void * my_realloc(PSI_memory_key key, void *ptr, size_t size, myf flags) { my_memory_header *old_mh; size_t old_size; size_t min_size; void *new_ptr; if (ptr == NULL) return my_malloc(key, size, flags); old_mh= USER_TO_HEADER(ptr); DBUG_ASSERT((old_mh->m_key == key) || (old_mh->m_key == PSI_NOT_INSTRUMENTED)); DBUG_ASSERT(old_mh->m_magic == MAGIC); old_size= old_mh->m_size; if (old_size == size) return ptr; new_ptr= my_malloc(key, size, flags); if (likely(new_ptr != NULL)) { #ifndef DBUG_OFF my_memory_header *new_mh= USER_TO_HEADER(new_ptr); #endif DBUG_ASSERT((new_mh->m_key == key) || (new_mh->m_key == PSI_NOT_INSTRUMENTED)); DBUG_ASSERT(new_mh->m_magic == MAGIC); DBUG_ASSERT(new_mh->m_size == size); min_size= (old_size < size) ? old_size : size; memcpy(new_ptr, ptr, min_size); my_free(ptr); return new_ptr; } return NULL; }
void my_free(void *ptr) { my_memory_header *mh; if (ptr == NULL) return; mh= USER_TO_HEADER(ptr); DBUG_ASSERT(mh->m_magic == MAGIC); PSI_MEMORY_CALL(memory_free)(mh->m_key, mh->m_size, mh->m_owner); /* Catch double free */ mh->m_magic= 0xDEAD; MEM_FREELIKE_BLOCK(ptr, 0); my_raw_free(mh); }