From 742b4de03522c78319e649a34064c87af3b78d49 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 18 Jun 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-06-18 --- port/alloc.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++ port/malloc.c | 23 ++++---- port/page.c | 24 ++++---- power/devcyc.c | 1 - 4 files changed, 175 insertions(+), 23 deletions(-) create mode 100644 port/alloc.c diff --git a/port/alloc.c b/port/alloc.c new file mode 100644 index 0000000000000000000000000000000000000000..69fbe90c9d0f0b2c44fec9cd95eb2a3b18a53f0e --- /dev/null +++ b/port/alloc.c @@ -0,0 +1,150 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#define nil ((void*)0) +#define datoff ((int)&((Xhdr*)0)->data) + +enum +{ + Nhole = 128, + Magic = 0xDeadBabe, +}; + +typedef struct Hole Hole; +typedef struct Xalloc Xalloc; +typedef struct Xhdr Xhdr; +struct Hole +{ + ulong addr; + ulong size; + ulong top; + Hole *link; +}; + +struct Xhdr +{ + ulong size; + ulong magix; + char data[1]; +}; + +struct Xalloc +{ + Lock; + Hole hole[Nhole]; + Hole *flist; + Hole *table; +}; + +Xalloc xlists; + +void +xinit(void) +{ + Hole *h, *eh; + + eh = &xlists.hole[Nhole-1]; + for(h = xlists.hole; h < eh; h++) + h->link = h+1; + + xlists.flist = h; +} + +void +xhole(ulong addr, ulong size) +{ + Hole *h, **l; + + lock(&xlists); + l = &xlists.table; + for(h = *l; h; h = h->link) { + if(h->top == addr) { + h->size += size; + h->top = h->addr+h->size; + unlock(&xlists); + return; + } + if(h->addr > addr) + break; + l = &h->link; + } + + if(xlists.flist == nil) { + print("xfree: no free holes, leaked %d bytes\n", size); + unlock(&xlists); + return; + } + + h = xlists.flist; + xlists.flist = h->link; + h->addr = addr; + h->top = addr+size; + h->size = size; + h->link = *l; + *l = h; + unlock(&xlists); +} + +void* +xalloc(ulong size) +{ + Hole *h, **l; + Xhdr *p; + + size += sizeof(Xhdr); + + lock(&xlists); + l = &xlists.table; + for(h = *l; h; h = h->link) { + if(h->size >= size) { + p = (Xhdr*)h->addr; + h->addr += size; + h->size -= size; + if(h->size == 0) { + *l = h->link; + h->link = xlists.flist; + xlists.flist = h; + } + p->magix = Magic; + p->size = size; + unlock(&xlists); + return p->data; + } + l = &h->link; + } + unlock(&xlists); + return nil; +} + +void +xfree(void *p) +{ + Xhdr *x; + + x = (Xhdr*)((ulong)p - datoff); + if(x->magix != Magic) + panic("xfree"); + + xhole((ulong)x, x->size); +} + +void +xsummary(void) +{ + int i; + Hole *h; + + i = 0; + for(h = xlists.flist; h; h = h->link) + i++; + + print("%d holes free\n", i); + i = 0; + for(h = xlists.table; h; h = h->link) { + print("%lux %lux %d\n", h->addr, h->top, h->size); + i += h->size; + } + print("%d bytes free\n", i); +} diff --git a/port/malloc.c b/port/malloc.c index d8783b5900e6dff99e39a25734616bd888794c01..71f86f57e6e4a7ddff024de8d72148055c4fc079 100644 --- a/port/malloc.c +++ b/port/malloc.c @@ -4,7 +4,7 @@ enum { MAGIC = 0xDEADBABE, - MAX2SIZE = 20 + MAXPOW = 20 }; typedef struct Bucket Bucket; @@ -20,9 +20,8 @@ typedef struct Arena Arena; struct Arena { Lock; - Bucket *btab[MAX2SIZE]; + Bucket *btab[MAXPOW]; }; - static Arena arena; #define datoff ((int)&((Bucket*)0)->data) @@ -32,14 +31,15 @@ malloc(uint size) int pow; Bucket *bp; - for(pow = 1; pow < MAX2SIZE; pow++) { + size += sizeof(Bucket); + + for(pow = 1; pow < MAXPOW; pow++) if(size <= (1<magic != 0) - abort(); + panic("malloc"); bp->magic = MAGIC; @@ -55,14 +55,13 @@ good: return bp->data; } unlock(&arena); + size = sizeof(Bucket)+(1<size = pow; - bp->magic = MAGIC; - + memset(bp->data, 0, size); return bp->data; } diff --git a/port/page.c b/port/page.c index b5560100cb156f965e4105bb9385e8aeb45d7000..e87c9b8995f90d7574b346d164f43adbc39a7d95 100644 --- a/port/page.c +++ b/port/page.c @@ -66,11 +66,14 @@ Region region[Nregion]; void addsplit(Region *r, ulong start, ulong end) { - Region *rr; - int len = end - start; + int len; + Region *rr, *eregion; + + len = end - start; + eregion = ®ion[Nregion]; /* first look for an unused one */ - for(rr = region; rr < ®ion[Nregion]; rr++){ + for(rr = region; rr < eregion; rr++){ if(rr == r) continue; if(rr->end - rr->start == 0){ @@ -81,7 +84,7 @@ addsplit(Region *r, ulong start, ulong end) } /* then look for a smaller one */ - for(rr = region; rr < ®ion[Nregion]; rr++){ + for(rr = region; rr < eregion; rr++){ if(rr == r) continue; if(rr->end - rr->start < len){ @@ -105,19 +108,21 @@ addsplit(Region *r, ulong start, ulong end) void* iallocspan(ulong n, int align, ulong crevasse) { + int m; ulong p; Region *r; - int m; int ledge; if(palloc.active && n!=0) print("ialloc bad\n"); if(palloc.addr0 == 0){ - region[Nregion-2].start = (((ulong)end)&~KZERO) + conf.base0; - region[Nregion-2].end = conf.base0 + (conf.npage0<start = (((ulong)end)&~KZERO) + conf.base0; + r->end = conf.base0 + (conf.npage0<start = conf.base1; + r->end = conf.base1 + (conf.npage1<