BSD 1 development
[unix-history] / portlib / alloc.s
CommitLineData
520d5775
EA
1/ storage allocator for use with C
2/
3/
4/
5/ hand-tooled from C compilation to modify save-return
6/ so that it can be called from within the C save when
7/ running with coroutines
8/
9/#
10//*
11/ * C storage allocator
12/ * (circular first fit strategy)
13/ */
14/#define BUSY 01
15/
16/char *allocs[2] { /*initial empty arena*/
17/ &allocs[1],
18/ &allocs[0]
19/};
20/struct { int word; };
21/char **allocp &allocs[1]; /*current search pointer*/
22/char **alloct &allocs[1]; /*top of arena (last cell)*/
23/
24/alloc(nbytes)
25/{
26/ register int nwords;
27/ register char **p, **q;
28/ static char *t;
29/
30/ allocs[0].word =| BUSY; /*static initialization*/
31/ allocs[1].word =| BUSY;
32/
33/ nwords = (nbytes+(2*sizeof(p)-1))/sizeof(p);
34/ for(p=allocp;;) {
35/ do {
36/ if((p->word&BUSY)==0) {
37/ while(((q = *p)->word&BUSY)==0)
38/ *p = *q;
39/ if(q >= &p[nwords])
40/ goto found;
41/ }
42/ q = p;
43/ p = p->word & ~BUSY;
44/ } while(q>=allocp || p<allocp);
45/ if((t = sbrk(sizeof(p)*nwords)) == -1)
46/ return(-1);
47/ *alloct = t;
48/ if(t != alloct + 1)
49/ alloct->word =| BUSY;
50/ alloct = (*t = &t[nwords]-1);
51/ *alloct = allocs;
52/ alloct->word =| BUSY;
53/ }
54/found:
55/ allocp = &p[nwords];
56/ if(q>allocp)
57/ *allocp = *p;
58/ *p = allocp.word|BUSY;
59/ return(p+1);
60/}
61/
62/free(p)
63/char **p;
64/{
65/ allocp = p-1;
66/ allocp->word =& ~BUSY;
67/}
68.data
69.globl _allocs
70_allocs:
712+_allocs
72_allocs
73.data
74.globl _allocp
75_allocp:
762+_allocs
77.data
78.globl _alloct
79_alloct:
802+_allocs
81.text
82.globl _alloc
83.globl _getvec
84_getvec:
85_alloc:
86~~alloc:
87.bss
88L2:.=.+2
89.text
90~p=r3
91~q=r2
92~t=L2
93~nbytes=4
94~nwords=r4
95mov r5,-(sp)
96mov sp,r5
97mov r4,-(sp)
98mov r3,-(sp)
99mov r2,-(sp)
100bis $1,_allocs
101bis $1,2+_allocs
102mov 4(r5),r4
103add $3,r4
104asr r4
105mov _allocp,r3
106jbr L7
107L12:mov L2,*_alloct
108mov _alloct,r0
109add $2,r0
110cmp L2,r0
111jeq L13
112bis $1,*_alloct
113L13:
114mov r4,r0
115dec r0
116asl r0
117add L2,r0
118mov r0,*L2
119mov r0,_alloct
120mov $_allocs,*_alloct
121bis $1,*_alloct
122L7:bit $1,(r3)
123jeq L9
124L8:mov r3,r2
125mov (r3),r3
126bic $1,r3
127cmp _allocp,r2
128jlos L7
129cmp _allocp,r3
130jhi L7
131mov r4,r0
132asl r0
133mov r0,(sp)
134.globl _sbrk
135jsr pc,*$_sbrk
136mov r0,L2
137cmp $-1,r0
138jne L12
139L1:
140mov (sp)+,r2
141mov (sp)+,r3
142mov (sp)+,r4
143mov (sp)+,r5
144rts pc
145L20001:mov (r2),(r3)
146L9:mov (r3),r2
147bit $1,(r2)
148jeq L20001
149mov r4,r0
150asl r0
151add r3,r0
152cmp r2,r0
153jlo L8
154mov r4,r0
155asl r0
156add r3,r0
157mov r0,_allocp
158cmp r0,r2
159jhis L14
160mov (r3),(r0)
161L14:
162bis $1,r0
163mov r0,(r3)
164mov r3,r0
165add $2,r0
166jbr L1
167.globl _free
168.globl _cfree,_relvec
169_cfree:
170_relvec:
171_free:
172~~free:
173~p=4
174mov r5,-(sp)
175mov sp,r5
176mov 4(r5),r0
177add $-2,r0
178mov r0,_allocp
179bic $1,*_allocp
180mov (sp)+,r5
181rts pc
182.globl
183.data