]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cwfs/malloc.c
Import sources from 2011-03-30 iso image
[plan9front.git] / sys / src / cmd / cwfs / malloc.c
1 #include "all.h"
2 #include "io.h"
3
4 long    niob;
5 long    nhiob;
6 Hiob    *hiob;
7
8 /*
9  * Called to allocate permanent data structures
10  * Alignment is in number of bytes. It pertains both to the start and
11  * end of the allocated memory.
12  */
13 void*
14 ialloc(ulong n, int align)
15 {
16         void *p = mallocalign(n, align, 0, 0);
17
18         if (p == nil)
19                 panic("ialloc: out of memory");
20         memset(p, 0, n);
21         return p;
22 }
23
24 void
25 prbanks(void)
26 {
27         Mbank *mbp;
28
29         for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
30                 print("bank[%ld]: base 0x%8.8lux, limit 0x%8.8lux (%.0fMB)\n",
31                         mbp - mconf.bank, mbp->base, mbp->limit,
32                         (mbp->limit - mbp->base)/(double)MB);
33 }
34
35 static void
36 cmd_memory(int, char *[])
37 {
38         prbanks();
39 }
40
41 enum { HWIDTH = 8 };            /* buffers per hash */
42
43 /*
44  * allocate rest of mem
45  * for io buffers.
46  */
47 void
48 iobufinit(void)
49 {
50         long m;
51         int i;
52         char *xiop;
53         Iobuf *p, *q;
54         Hiob *hp;
55         Mbank *mbp;
56
57         wlock(&mainlock);       /* init */
58         wunlock(&mainlock);
59
60         prbanks();
61         m = 0;
62         for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
63                 m += mbp->limit - mbp->base;
64
65         niob = m / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH);
66         nhiob = niob / HWIDTH;
67         while(!prime(nhiob))
68                 nhiob++;
69         print("\t%ld buffers; %ld hashes\n", niob, nhiob);
70         hiob = ialloc(nhiob * sizeof(Hiob), 0);
71         hp = hiob;
72         for(i=0; i<nhiob; i++) {
73                 lock(hp);
74                 unlock(hp);
75                 hp++;
76         }
77         p = ialloc(niob * sizeof(Iobuf), 0);
78         xiop = ialloc(niob * RBUFSIZE, 0);
79         hp = hiob;
80         for(i=0; i < niob; i++) {
81 //              p->name = "buf";
82                 qlock(p);
83                 qunlock(p);
84                 if(hp == hiob)
85                         hp = hiob + nhiob;
86                 hp--;
87                 q = hp->link;
88                 if(q) {
89                         p->fore = q;
90                         p->back = q->back;
91                         q->back = p;
92                         p->back->fore = p;
93                 } else {
94                         hp->link = p;
95                         p->fore = p;
96                         p->back = p;
97                 }
98                 p->dev = devnone;
99                 p->addr = -1;
100 //              p->xiobuf = ialloc(RBUFSIZE, RBUFSIZE);
101                 p->xiobuf = xiop;
102                 p->iobuf = (char*)-1;
103                 p++;
104                 xiop += RBUFSIZE;
105         }
106
107         /*
108          * Make sure that no more of bank[0] can be used.
109          */
110         mconf.bank[0].base = mconf.bank[0].limit;
111
112         i = 0;
113         for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
114                 i += mbp->limit - mbp->base;
115         print("\tmem left = %,d, out of %,ld\n", i, conf.mem);
116         /* paranoia: add this command as late as is easy */
117         cmd_install("memory", "-- print ranges of memory banks", cmd_memory);
118 }
119
120 void*
121 iobufmap(Iobuf *p)
122 {
123         return p->iobuf = p->xiobuf;
124 }
125
126 void
127 iobufunmap(Iobuf *p)
128 {
129         p->iobuf = (char*)-1;
130 }