Commit | Line | Data |
---|---|---|
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: | |
71 | 2+_allocs | |
72 | _allocs | |
73 | .data | |
74 | .globl _allocp | |
75 | _allocp: | |
76 | 2+_allocs | |
77 | .data | |
78 | .globl _alloct | |
79 | _alloct: | |
80 | 2+_allocs | |
81 | .text | |
82 | .globl _alloc | |
83 | .globl _getvec | |
84 | _getvec: | |
85 | _alloc: | |
86 | ~~alloc: | |
87 | .bss | |
88 | L2:.=.+2 | |
89 | .text | |
90 | ~p=r3 | |
91 | ~q=r2 | |
92 | ~t=L2 | |
93 | ~nbytes=4 | |
94 | ~nwords=r4 | |
95 | mov r5,-(sp) | |
96 | mov sp,r5 | |
97 | mov r4,-(sp) | |
98 | mov r3,-(sp) | |
99 | mov r2,-(sp) | |
100 | bis $1,_allocs | |
101 | bis $1,2+_allocs | |
102 | mov 4(r5),r4 | |
103 | add $3,r4 | |
104 | asr r4 | |
105 | mov _allocp,r3 | |
106 | jbr L7 | |
107 | L12:mov L2,*_alloct | |
108 | mov _alloct,r0 | |
109 | add $2,r0 | |
110 | cmp L2,r0 | |
111 | jeq L13 | |
112 | bis $1,*_alloct | |
113 | L13: | |
114 | mov r4,r0 | |
115 | dec r0 | |
116 | asl r0 | |
117 | add L2,r0 | |
118 | mov r0,*L2 | |
119 | mov r0,_alloct | |
120 | mov $_allocs,*_alloct | |
121 | bis $1,*_alloct | |
122 | L7:bit $1,(r3) | |
123 | jeq L9 | |
124 | L8:mov r3,r2 | |
125 | mov (r3),r3 | |
126 | bic $1,r3 | |
127 | cmp _allocp,r2 | |
128 | jlos L7 | |
129 | cmp _allocp,r3 | |
130 | jhi L7 | |
131 | mov r4,r0 | |
132 | asl r0 | |
133 | mov r0,(sp) | |
134 | .globl _sbrk | |
135 | jsr pc,*$_sbrk | |
136 | mov r0,L2 | |
137 | cmp $-1,r0 | |
138 | jne L12 | |
139 | L1: | |
140 | mov (sp)+,r2 | |
141 | mov (sp)+,r3 | |
142 | mov (sp)+,r4 | |
143 | mov (sp)+,r5 | |
144 | rts pc | |
145 | L20001:mov (r2),(r3) | |
146 | L9:mov (r3),r2 | |
147 | bit $1,(r2) | |
148 | jeq L20001 | |
149 | mov r4,r0 | |
150 | asl r0 | |
151 | add r3,r0 | |
152 | cmp r2,r0 | |
153 | jlo L8 | |
154 | mov r4,r0 | |
155 | asl r0 | |
156 | add r3,r0 | |
157 | mov r0,_allocp | |
158 | cmp r0,r2 | |
159 | jhis L14 | |
160 | mov (r3),(r0) | |
161 | L14: | |
162 | bis $1,r0 | |
163 | mov r0,(r3) | |
164 | mov r3,r0 | |
165 | add $2,r0 | |
166 | jbr L1 | |
167 | .globl _free | |
168 | .globl _cfree,_relvec | |
169 | _cfree: | |
170 | _relvec: | |
171 | _free: | |
172 | ~~free: | |
173 | ~p=4 | |
174 | mov r5,-(sp) | |
175 | mov sp,r5 | |
176 | mov 4(r5),r0 | |
177 | add $-2,r0 | |
178 | mov r0,_allocp | |
179 | bic $1,*_allocp | |
180 | mov (sp)+,r5 | |
181 | rts pc | |
182 | .globl | |
183 | .data |