bug in sbrk
test malloc
This commit is contained in:
parent
bcfb84b6a9
commit
81d5219998
4 changed files with 49 additions and 8 deletions
5
proc.c
5
proc.c
|
@ -151,10 +151,9 @@ growproc(int n)
|
||||||
oldmem = cp->mem;
|
oldmem = cp->mem;
|
||||||
cp->mem = newmem;
|
cp->mem = newmem;
|
||||||
kfree(oldmem, cp->sz);
|
kfree(oldmem, cp->sz);
|
||||||
|
cprintf("growproc: added %d bytes to %d bytes\n", n, cp->sz);
|
||||||
cp->sz += n;
|
cp->sz += n;
|
||||||
cprintf("growproc: added %d bytes starting at address 0x%x\n", n,
|
return cp->sz - n;
|
||||||
newmem + cp->sz - n);
|
|
||||||
return newmem + cp->sz - n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Per-CPU process scheduler.
|
// Per-CPU process scheduler.
|
||||||
|
|
|
@ -25,7 +25,9 @@ void
|
||||||
free(void *ap)
|
free(void *ap)
|
||||||
{
|
{
|
||||||
Header *bp, *p;
|
Header *bp, *p;
|
||||||
|
|
||||||
|
printf(1, "free\n");
|
||||||
|
|
||||||
bp = (Header *) ap - 1;
|
bp = (Header *) ap - 1;
|
||||||
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
|
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
|
||||||
if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
|
if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
|
||||||
|
@ -51,6 +53,7 @@ morecore(uint nu)
|
||||||
|
|
||||||
if (nu < PAGE)
|
if (nu < PAGE)
|
||||||
nu = PAGE;
|
nu = PAGE;
|
||||||
|
printf(1, "call sbrk\n");
|
||||||
cp = sbrk(nu * sizeof(Header));
|
cp = sbrk(nu * sizeof(Header));
|
||||||
if (cp == (char *) -1)
|
if (cp == (char *) -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -66,6 +69,8 @@ malloc(uint nbytes)
|
||||||
Header *p, *prevp;
|
Header *p, *prevp;
|
||||||
uint nunits;
|
uint nunits;
|
||||||
|
|
||||||
|
printf(1, "malloc %d\n", nbytes);
|
||||||
|
|
||||||
nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
|
nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
|
||||||
if ((prevp = freep) == 0) {
|
if ((prevp = freep) == 0) {
|
||||||
base.s.ptr = freep = prevp = &base;
|
base.s.ptr = freep = prevp = &base;
|
||||||
|
@ -81,6 +86,7 @@ malloc(uint nbytes)
|
||||||
p->s.size = nunits;
|
p->s.size = nunits;
|
||||||
}
|
}
|
||||||
freep = prevp;
|
freep = prevp;
|
||||||
|
printf(1, "malloc returns: %d\n", (int) (p+1));
|
||||||
return (void *) (p + 1);
|
return (void *) (p + 1);
|
||||||
}
|
}
|
||||||
if (p == freep)
|
if (p == freep)
|
||||||
|
|
2
user.h
2
user.h
|
@ -30,5 +30,5 @@ void printf(int fd, char *fmt, ...);
|
||||||
char *gets(char *, int max);
|
char *gets(char *, int max);
|
||||||
unsigned int strlen(char *);
|
unsigned int strlen(char *);
|
||||||
void * memset(void *dst, int c, unsigned int n);
|
void * memset(void *dst, int c, unsigned int n);
|
||||||
void *mallic(uint);
|
void *malloc(uint);
|
||||||
void free(void *);
|
void free(void *);
|
||||||
|
|
42
usertests.c
42
usertests.c
|
@ -117,14 +117,50 @@ exitwait(void)
|
||||||
puts("exitwait ok\n");
|
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
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
puts("usertests starting\n");
|
puts("usertests starting\n");
|
||||||
|
|
||||||
pipe1();
|
// pipe1();
|
||||||
preempt();
|
// preempt();
|
||||||
exitwait();
|
// exitwait();
|
||||||
|
mem();
|
||||||
|
|
||||||
puts("usertests finished\n");
|
puts("usertests finished\n");
|
||||||
exit();
|
exit();
|
||||||
|
|
Loading…
Reference in a new issue