* complete the reservation by also asking for the full lastest block.
*
* Also, the returned block is aligned to the end of block (but I've
- * no fucking idea of why, actually -- http://abstrusegoose.com/432).
+ * no fucking idea of why, actually -- http://abstrusegoose.com/432 --
+ * but not doing so seems to lead to issues).
*/
adj = RESIDUAL(result, BLOCKSIZE);
if (adj != 0) {
return (NULL);
}
- /* Check if we need to grow the info table. */
+ /* Check if we need to grow the info table (in a multiplicative manner) */
if ((size_t) BLOCK((char *) result + size) > mdp->heapsize) {
+
newsize = mdp->heapsize;
- while ((size_t) BLOCK((char *) result + size) > newsize) {
+ while ((size_t) BLOCK((char *) result + size) > newsize)
newsize *= 2;
- }
- newinfo = (malloc_info *) align(mdp, newsize * sizeof(malloc_info));
- if (newinfo == NULL) {
- mmorecore(mdp, -size);
- return (NULL);
- }
- memset((void *) newinfo, 0, newsize * sizeof(malloc_info));
- memcpy((void *) newinfo, (void *) mdp->heapinfo,
- mdp->heapsize * sizeof(malloc_info));
+
+ /* Copy old info into new location */
oldinfo = mdp->heapinfo;
+ newinfo = (malloc_info *) align(mdp, newsize * sizeof(malloc_info));
+ memset(newinfo, 0, newsize * sizeof(malloc_info));
+ memcpy(newinfo, oldinfo, mdp->heapsize * sizeof(malloc_info));
+ mdp->heapinfo = newinfo;
+
+ /* mark the space previously occupied by the block info as free by first marking it
+ * as occupied in the regular way, and then freing it */
newinfo[BLOCK(oldinfo)].busy.type = 0;
- newinfo[BLOCK(oldinfo)].busy.info.block.size
- = BLOCKIFY(mdp->heapsize * sizeof(malloc_info));
+ newinfo[BLOCK(oldinfo)].busy.info.block.size = BLOCKIFY(mdp->heapsize * sizeof(malloc_info));
newinfo[BLOCK(oldinfo)].busy.info.block.busy_size = size;
- mdp->heapinfo = newinfo;
__mmalloc_free(mdp, (void *) oldinfo);
mdp->heapsize = newsize;
}