summaryrefslogtreecommitdiff
path: root/kalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'kalloc.c')
-rw-r--r--kalloc.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/kalloc.c b/kalloc.c
index b14a69a..969b81d 100644
--- a/kalloc.c
+++ b/kalloc.c
@@ -10,6 +10,9 @@
#include "param.h"
#include "types.h"
#include "defs.h"
+#include "spinlock.h"
+
+struct spinlock kalloc_lock;
struct run {
struct run *next;
@@ -54,6 +57,8 @@ kfree(char *cp, int len)
for(i = 0; i < len; i++)
cp[i] = 1;
+ acquire(&kalloc_lock);
+
rr = &freelist;
while(*rr){
struct run *rend = (struct run *) ((char *)(*rr) + (*rr)->len);
@@ -63,13 +68,13 @@ kfree(char *cp, int len)
p->len = len + (*rr)->len;
p->next = (*rr)->next;
*rr = p;
- return;
+ goto out;
}
if(pend < *rr){
p->len = len;
p->next = *rr;
*rr = p;
- return;
+ goto out;
}
if(p == rend){
(*rr)->len += len;
@@ -77,13 +82,16 @@ kfree(char *cp, int len)
(*rr)->len += (*rr)->next->len;
(*rr)->next = (*rr)->next->next;
}
- return;
+ goto out;
}
rr = &((*rr)->next);
}
p->len = len;
p->next = 0;
*rr = p;
+
+ out:
+ release(&kalloc_lock);
}
/*
@@ -99,20 +107,25 @@ kalloc(int n)
if(n % PAGE)
panic("kalloc");
+ acquire(&kalloc_lock);
+
rr = &freelist;
while(*rr){
struct run *r = *rr;
if(r->len == n){
*rr = r->next;
+ release(&kalloc_lock);
return (char *) r;
}
if(r->len > n){
char *p = (char *)r + (r->len - n);
r->len -= n;
+ release(&kalloc_lock);
return p;
}
rr = &(*rr)->next;
}
+ release(&kalloc_lock);
return 0;
}