]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cwfs/malloc.c
audiohda: fix syntax error
[plan9front.git] / sys / src / cmd / cwfs / malloc.c
1 #include "all.h"
2 #include "io.h"
3
4 #include <pool.h>
5
6 static uvlong
7 memsize(void)
8 {
9         ulong pgsize, userpgs, userused;
10         char *s, *f[2];
11         int n, mpcnt;
12         Biobuf *bp;
13
14         mpcnt = 25;
15         pgsize = userpgs = userused = 0;
16         if(bp = Bopen("/dev/swap", OREAD)) {
17                 while(s = Brdline(bp, '\n')) {
18                         if((n = Blinelen(bp)) < 1)
19                                 continue;
20                         s[n-1] = '\0';
21                         if(tokenize(s, f, nelem(f)) != 2)
22                                 continue;
23                         if(strcmp(f[1], "pagesize") == 0)
24                                 pgsize = strtoul(f[0], 0, 0);
25                         else if(strcmp(f[1], "user") == 0) {
26                                 userused =  strtoul(f[0], &s, 0);
27                                 if(*s == '/')
28                                         userpgs = strtoul(s+1, 0, 0);
29                         }
30                 }
31                 Bterm(bp);
32         }
33         if(pgsize && userused < userpgs){
34                 userpgs -= userused;
35                 if(s = getenv("fsmempercent")){
36                         mpcnt = atoi(s);
37                         free(s);
38                 }
39                 if(mpcnt < 1)
40                         mpcnt = 1;
41                 userpgs = (userpgs*mpcnt)/100;
42                 return (uvlong)userpgs*pgsize;
43         }
44         return 16*MB;
45 }
46
47 uint    niob;
48 uint    nhiob;
49 Hiob    *hiob;
50
51 /*
52  * Called to allocate permanent data structures
53  * Alignment is in number of bytes. It pertains both to the start and
54  * end of the allocated memory.
55  */
56 void*
57 ialloc(uintptr n, int align)
58 {
59         char *p;
60         int m;
61
62         if(align <= 0)
63                 align = sizeof(uintptr);
64
65         mainmem->lock(mainmem);
66
67         p = sbrk(0);
68         if(m = n % align)
69                 n += align - m;
70         if(m = (uintptr)p % align)
71                 p += align - m;
72         if(brk(p+n) < 0)
73                 panic("ialloc: out of memory");
74
75         mainmem->unlock(mainmem);
76
77         return p;
78 }
79
80 enum { HWIDTH = 8 };            /* buffers per hash */
81
82 /*
83  * allocate rest of mem
84  * for io buffers.
85  */
86 void
87 iobufinit(void)
88 {
89         int i;
90         char *xiop;
91         Iobuf *p, *q;
92         Hiob *hp;
93
94         wlock(&mainlock);       /* init */
95         wunlock(&mainlock);
96
97         niob = memsize() / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH);
98         nhiob = niob / HWIDTH;
99         while(!prime(nhiob))
100                 nhiob++;
101         if(chatty)
102                 print("\t%ud buffers; %ud hashes\n", niob, nhiob);
103         hiob = ialloc((uintptr)nhiob * sizeof(Hiob), 0);
104         hp = hiob;
105         for(i=0; i<nhiob; i++) {
106                 lock(hp);
107                 unlock(hp);
108                 hp++;
109         }
110         p = ialloc((uintptr)niob * sizeof(Iobuf), 0);
111         xiop = ialloc((uintptr)niob * RBUFSIZE, 0);
112         hp = hiob;
113         for(i=0; i < niob; i++) {
114                 qlock(p);
115                 qunlock(p);
116                 if(hp == hiob)
117                         hp = hiob + nhiob;
118                 hp--;
119                 q = hp->link;
120                 if(q) {
121                         p->fore = q;
122                         p->back = q->back;
123                         q->back = p;
124                         p->back->fore = p;
125                 } else {
126                         hp->link = p;
127                         p->fore = p;
128                         p->back = p;
129                 }
130                 p->dev = devnone;
131                 p->addr = -1;
132                 p->xiobuf = xiop;
133                 p->iobuf = (char*)-1;
134                 p++;
135                 xiop += RBUFSIZE;
136         }
137 }
138
139 void*
140 iobufmap(Iobuf *p)
141 {
142         return p->iobuf = p->xiobuf;
143 }
144
145 void
146 iobufunmap(Iobuf *p)
147 {
148         p->iobuf = (char*)-1;
149 }