- /* Link all fragments but the first into the free list. */
- for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i)
- {
- next = (struct list *) ((char*) result + (i << log));
- next -> next = mdp -> fraghead[log].next;
- next -> prev = &mdp -> fraghead[log];
- next -> prev -> next = next;
- if (next -> next != NULL)
- {
- next -> next -> prev = next;
+ memset(result, 0, requested_size);
+
+ } else {
+ /* No free fragments of the desired size, so get a new block
+ and break it into fragments, returning the first. */
+ //printf("(%s) No free fragment...",xbt_thread_self_name());
+
+ result = mmalloc(mdp, BLOCKSIZE); // does not return NULL
+ memset(result, 0, requested_size);
+
+ /* Link all fragments but the first into the free list, and mark their requested size to 0. */
+ block = BLOCK(result);
+ for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i) {
+ mdp->heapinfo[block].busy_frag.frag_size[i] = 0;
+ next = (struct list *) ((char *) result + (i << log));
+ next->next = mdp->fraghead[log].next;
+ next->prev = &mdp->fraghead[log];
+ next->prev->next = next;
+ if (next->next != NULL) {
+ next->next->prev = next;