Serialize malloc and free with a uspinlock

上级 401b5c65
...@@ -23,3 +23,9 @@ tryacquire(struct uspinlock *lk) ...@@ -23,3 +23,9 @@ tryacquire(struct uspinlock *lk)
{ {
return xchg32(&lk->locked, 1) == 0; return xchg32(&lk->locked, 1) == 0;
} }
static void inline
initlock(struct uspinlock *lk)
{
lk->locked = 0;
}
...@@ -43,7 +43,7 @@ wqlock_release(wqlock_t *lock) ...@@ -43,7 +43,7 @@ wqlock_release(wqlock_t *lock)
static inline void static inline void
wqlock_init(wqlock_t *lock) wqlock_init(wqlock_t *lock)
{ {
lock->locked = 0; initlock(lock);
} }
static void static void
......
...@@ -160,5 +160,7 @@ void __cxa_pure_virtual(void) ...@@ -160,5 +160,7 @@ void __cxa_pure_virtual(void)
void void
usetup(void) usetup(void)
{ {
extern void initmalloc(void);
forkt_setup(getpid()); forkt_setup(getpid());
initmalloc();
} }
#include "types.h" #include "types.h"
#include "stat.h" #include "stat.h"
#include "user.h" #include "user.h"
#include "uspinlock.h"
// Memory allocator by Kernighan and Ritchie, // Memory allocator by Kernighan and Ritchie,
// The C programming Language, 2nd ed. Section 8.7. // The C programming Language, 2nd ed. Section 8.7.
...@@ -20,11 +21,14 @@ typedef union header Header; ...@@ -20,11 +21,14 @@ typedef union header Header;
static Header base; static Header base;
static Header *freep; static Header *freep;
static struct uspinlock lock;
void void
free(void *ap) free(void *ap)
{ {
Header *bp, *p; Header *bp, *p;
acquire(&lock);
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))
...@@ -40,6 +44,7 @@ free(void *ap) ...@@ -40,6 +44,7 @@ free(void *ap)
} else } else
p->s.ptr = bp; p->s.ptr = bp;
freep = p; freep = p;
release(&lock);
} }
static Header* static Header*
...@@ -65,6 +70,7 @@ malloc(u32 nbytes) ...@@ -65,6 +70,7 @@ malloc(u32 nbytes)
Header *p, *prevp; Header *p, *prevp;
u32 nunits; u32 nunits;
acquire(&lock);
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;
...@@ -80,10 +86,20 @@ malloc(u32 nbytes) ...@@ -80,10 +86,20 @@ malloc(u32 nbytes)
p->s.size = nunits; p->s.size = nunits;
} }
freep = prevp; freep = prevp;
release(&lock);
return (void*)(p + 1); return (void*)(p + 1);
} }
if(p == freep) if(p == freep)
if((p = morecore(nunits)) == 0) if((p = morecore(nunits)) == 0) {
release(&lock);
return 0; return 0;
}
} }
} }
extern "C" void initmalloc(void);
void
initmalloc(void)
{
initlock(&lock);
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论