OK i have made the following changes:
Code:
void *mymalloc(unsigned nbytes)
{
Header *p, *prevptr;
unsigned nunits;
nunits = (nbytes+(sizeof(Header))-1)/(sizeof(Header)) + 1;
if ((prevptr = freeptr) == NULL)
{ /* no free list yet */
base.s.ptr = (Header *)calloc(MEM_SIZE,sizeof(Header));
base.s.size = 0;
base.s.check = 0; X
/* allocase a memory from OS and then manage it */
base.s.ptr->s.size = MEM_SIZE;
base.s.ptr->s.ptr = &base;
base.s.ptr->s.check=0; X
freeptr = prevptr = &base;
}
for (p = prevptr->s.ptr; ; prevptr = p, p = p->s.ptr)
{
if (p->s.size >= nunits)
{ /* big enough */
if (p->s.size == nunits) /* exactly */
{
prevptr->s.ptr = p->s.ptr;
p->s.check=1; X
}
else
{ /* allocate tail end */
p->s.size -= nunits;
p += p->s.size;
p->s.size = nunits;
p->s.check=1; X
}
freeptr = prevptr;
return (void *)(p+1);
}
}
}
Code:
void myfree(void *ap)
{
Header *bp, *p;
bp = (Header *)ap - 1; /* point to block header */
bp -> s.check=0; X
for (p = freeptr; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
/*if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
{
printf("in the corner\n");
break; freed block at start or end of arena
}*/
if (bp + bp->s.size == p->s.ptr)
{
/* join to upper nbr */
bp->s.size += p->s.ptr->s.size;
bp->s.ptr = p->s.ptr->s.ptr;
}
else
bp->s.ptr = p->s.ptr;
if (p + p->s.size == bp)
{ /* join to lower nbr */
p->s.size += bp->s.size;
p->s.ptr = bp->s.ptr;
}
else
p->s.ptr = bp;
freeptr = p;
}
But still Im getting the same effect.