- else
- {
- /* Large allocation to receive one or more blocks.
- Search the free list in a circle starting at the last place visited.
- If we loop completely around without finding a large enough
- space we will have to get more memory from the system. */
- blocks = BLOCKIFY(size);
- start = block = MALLOC_SEARCH_START;
- while (mdp -> heapinfo[block].free.size < blocks)
- {
- block = mdp -> heapinfo[block].free.next;
- if (block == start)
- {
- /* Need to get more from the system. Check to see if
- the new core will be contiguous with the final free
- block; if so we don't need to get as much. */
- block = mdp -> heapinfo[0].free.prev;
- lastblocks = mdp -> heapinfo[block].free.size;
- if (mdp -> heaplimit != 0 &&
- block + lastblocks == mdp -> heaplimit &&
- mdp -> morecore (mdp, 0) == ADDRESS(block + lastblocks) &&
- (morecore (mdp, (blocks - lastblocks) * BLOCKSIZE)) != NULL)
- {
- /* Which block we are extending (the `final free
- block' referred to above) might have changed, if
- it got combined with a freed info table. */
- block = mdp -> heapinfo[0].free.prev;
-
- mdp -> heapinfo[block].free.size += (blocks - lastblocks);
- mdp -> heapstats.bytes_free +=
- (blocks - lastblocks) * BLOCKSIZE;
- continue;
- }
- result = morecore(mdp, blocks * BLOCKSIZE);
- if (result == NULL)
- {
- return (NULL);
- }
- block = BLOCK (result);
- mdp -> heapinfo[block].busy.type = 0;
- mdp -> heapinfo[block].busy.info.size = blocks;
- mdp -> heapstats.chunks_used++;
- mdp -> heapstats.bytes_used += blocks * BLOCKSIZE;
- return (result);
- }
- }
-
- /* At this point we have found a suitable free list entry.
- Figure out how to remove what we need from the list. */
- result = ADDRESS(block);
- if (mdp -> heapinfo[block].free.size > blocks)
- {
- /* The block we found has a bit left over,
- so relink the tail end back into the free list. */
- mdp -> heapinfo[block + blocks].free.size
- = mdp -> heapinfo[block].free.size - blocks;
- mdp -> heapinfo[block + blocks].free.next
- = mdp -> heapinfo[block].free.next;
- mdp -> heapinfo[block + blocks].free.prev
- = mdp -> heapinfo[block].free.prev;
- mdp -> heapinfo[mdp -> heapinfo[block].free.prev].free.next
- = mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev
- = mdp -> heapindex = block + blocks;
- }
- else
- {
- /* The block exactly matches our requirements,
- so just remove it from the list. */
- mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev
- = mdp -> heapinfo[block].free.prev;
- mdp -> heapinfo[mdp -> heapinfo[block].free.prev].free.next
- = mdp -> heapindex = mdp -> heapinfo[block].free.next;
- mdp -> heapstats.chunks_free--;
- }
-
- mdp -> heapinfo[block].busy.type = 0;
- mdp -> heapinfo[block].busy.info.size = blocks;
- mdp -> heapstats.chunks_used++;
- mdp -> heapstats.bytes_used += blocks * BLOCKSIZE;
- mdp -> heapstats.bytes_free -= blocks * BLOCKSIZE;
+
+ /* At this point we have found a suitable free list entry.
+ Figure out how to remove what we need from the list. */
+ result = ADDRESS(block);
+ if (mdp->heapinfo[block].free.size > blocks) {
+ /* The block we found has a bit left over,
+ so relink the tail end back into the free list. */
+ mdp->heapinfo[block + blocks].free.size
+ = mdp->heapinfo[block].free.size - blocks;
+ mdp->heapinfo[block + blocks].free.next
+ = mdp->heapinfo[block].free.next;
+ mdp->heapinfo[block + blocks].free.prev
+ = mdp->heapinfo[block].free.prev;
+ mdp->heapinfo[mdp->heapinfo[block].free.prev].free.next
+ = mdp->heapinfo[mdp->heapinfo[block].free.next].free.prev
+ = mdp->heapindex = block + blocks;
+ } else {
+ /* The block exactly matches our requirements,
+ so just remove it from the list. */
+ mdp->heapinfo[mdp->heapinfo[block].free.next].free.prev
+ = mdp->heapinfo[block].free.prev;
+ mdp->heapinfo[mdp->heapinfo[block].free.prev].free.next
+ = mdp->heapindex = mdp->heapinfo[block].free.next;
+ mdp->heapstats.chunks_free--;