提交 81d52199 创建 作者: kaashoek's avatar kaashoek

bug in sbrk

test malloc
上级 bcfb84b6
......@@ -151,10 +151,9 @@ growproc(int n)
oldmem = cp->mem;
cp->mem = newmem;
kfree(oldmem, cp->sz);
cprintf("growproc: added %d bytes to %d bytes\n", n, cp->sz);
cp->sz += n;
cprintf("growproc: added %d bytes starting at address 0x%x\n", n,
newmem + cp->sz - n);
return newmem + cp->sz - n;
return cp->sz - n;
}
// Per-CPU process scheduler.
......
......@@ -25,7 +25,9 @@ void
free(void *ap)
{
Header *bp, *p;
printf(1, "free\n");
bp = (Header *) ap - 1;
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
......@@ -51,6 +53,7 @@ morecore(uint nu)
if (nu < PAGE)
nu = PAGE;
printf(1, "call sbrk\n");
cp = sbrk(nu * sizeof(Header));
if (cp == (char *) -1)
return 0;
......@@ -66,6 +69,8 @@ malloc(uint nbytes)
Header *p, *prevp;
uint nunits;
printf(1, "malloc %d\n", nbytes);
nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
if ((prevp = freep) == 0) {
base.s.ptr = freep = prevp = &base;
......@@ -81,6 +86,7 @@ malloc(uint nbytes)
p->s.size = nunits;
}
freep = prevp;
printf(1, "malloc returns: %d\n", (int) (p+1));
return (void *) (p + 1);
}
if (p == freep)
......
......@@ -30,5 +30,5 @@ void printf(int fd, char *fmt, ...);
char *gets(char *, int max);
unsigned int strlen(char *);
void * memset(void *dst, int c, unsigned int n);
void *mallic(uint);
void *malloc(uint);
void free(void *);
......@@ -117,14 +117,50 @@ exitwait(void)
puts("exitwait ok\n");
}
void
mem(void)
{
void *m = malloc(4096);
void *m1, *m2;
free(m + 3*1024);
free(m + 2*1024);
free(m + 1024);
free(m);
m1 = malloc(4096);
if (m1 != m) {
puts("didn't coalesce\n");
exit();
}
free(m1);
m1 = 0;
while ((m2 = malloc(1024)) != 0) {
*(char **) m2 = m1;
m1 = m2;
}
while (m1) {
m2 = *(char **)m1;
free(m1);
m1 = m2;
}
m1 = malloc(1024*20);
if (m1 == 0) {
puts("couldn't allocate mem?!!\n");
exit();
}
free(m1);
}
int
main(int argc, char *argv[])
{
puts("usertests starting\n");
pipe1();
preempt();
exitwait();
// pipe1();
// preempt();
// exitwait();
mem();
puts("usertests finished\n");
exit();
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论