Mercurial > hg > xemacs-beta
comparison src/dynarr.c @ 3092:141c2920ea48
[xemacs-hg @ 2005-11-25 01:41:31 by crestani]
Incremental Garbage Collector
author | crestani |
---|---|
date | Fri, 25 Nov 2005 01:42:08 +0000 |
parents | 3d8143fc88e1 |
children | 72b7d685c194 |
comparison
equal
deleted
inserted
replaced
3091:c22d8984148c | 3092:141c2920ea48 |
---|---|
148 d->elsize = elsize; | 148 d->elsize = elsize; |
149 | 149 |
150 return d; | 150 return d; |
151 } | 151 } |
152 | 152 |
153 #ifdef NEW_GC | |
154 DEFINE_LRECORD_IMPLEMENTATION ("dynarr", dynarr, | |
155 1, /*dumpable-flag*/ | |
156 0, 0, 0, 0, 0, | |
157 0, | |
158 Dynarr); | |
159 | |
160 static void | |
161 Dynarr_lisp_realloc (Dynarr *dy, Elemcount new_size) | |
162 { | |
163 void *new_base = alloc_lrecord_array (dy->elsize, new_size, dy->lisp_imp); | |
164 void *old_base = dy->base; | |
165 if (dy->base) | |
166 memcpy (new_base, dy->base, | |
167 (dy->max > new_size ? dy->max : new_size) * dy->elsize); | |
168 dy->base = new_base; | |
169 if (old_base) | |
170 mc_free (old_base); | |
171 } | |
172 | |
173 void * | |
174 Dynarr_lisp_newf (int elsize, | |
175 const struct lrecord_implementation *dynarr_imp, | |
176 const struct lrecord_implementation *imp) | |
177 { | |
178 Dynarr *d = (Dynarr *) alloc_lrecord (sizeof (Dynarr), dynarr_imp); | |
179 d->elsize = elsize; | |
180 d->lisp_imp = imp; | |
181 | |
182 return d; | |
183 } | |
184 #endif /* not NEW_GC */ | |
185 | |
153 void | 186 void |
154 Dynarr_resize (void *d, Elemcount size) | 187 Dynarr_resize (void *d, Elemcount size) |
155 { | 188 { |
156 int newsize; | 189 int newsize; |
157 double multiplier; | 190 double multiplier; |
166 newsize = max (Dynarr_min_size, (int) (multiplier * newsize)); | 199 newsize = max (Dynarr_min_size, (int) (multiplier * newsize)); |
167 | 200 |
168 /* Don't do anything if the array is already big enough. */ | 201 /* Don't do anything if the array is already big enough. */ |
169 if (newsize > dy->max) | 202 if (newsize > dy->max) |
170 { | 203 { |
204 #ifdef NEW_GC | |
205 if (dy->lisp_imp) | |
206 Dynarr_lisp_realloc (dy, newsize); | |
207 else | |
208 Dynarr_realloc (dy, newsize*dy->elsize); | |
209 #else /* not NEW_GC */ | |
171 Dynarr_realloc (dy, newsize*dy->elsize); | 210 Dynarr_realloc (dy, newsize*dy->elsize); |
211 #endif /* not NEW_GC */ | |
172 dy->max = newsize; | 212 dy->max = newsize; |
173 } | 213 } |
174 } | 214 } |
175 | 215 |
176 /* Add a number of contiguous elements to the array starting at START. */ | 216 /* Add a number of contiguous elements to the array starting at START. */ |
220 void | 260 void |
221 Dynarr_free (void *d) | 261 Dynarr_free (void *d) |
222 { | 262 { |
223 Dynarr *dy = (Dynarr *) d; | 263 Dynarr *dy = (Dynarr *) d; |
224 | 264 |
265 #ifdef NEW_GC | |
266 if (dy->base && !DUMPEDP (dy->base)) | |
267 { | |
268 if (dy->lisp_imp) | |
269 mc_free (dy->base); | |
270 else | |
271 xfree (dy->base, void *); | |
272 } | |
273 if(!DUMPEDP (dy)) | |
274 { | |
275 if (dy->lisp_imp) | |
276 mc_free (dy); | |
277 else | |
278 xfree (dy, Dynarr *); | |
279 } | |
280 #else /* not NEW_GC */ | |
225 if (dy->base && !DUMPEDP (dy->base)) | 281 if (dy->base && !DUMPEDP (dy->base)) |
226 xfree (dy->base, void *); | 282 xfree (dy->base, void *); |
227 if(!DUMPEDP (dy)) | 283 if(!DUMPEDP (dy)) |
228 xfree (dy, Dynarr *); | 284 xfree (dy, Dynarr *); |
285 #endif /* not NEW_GC */ | |
229 } | 286 } |
230 | 287 |
231 #ifdef MEMORY_USAGE_STATS | 288 #ifdef MEMORY_USAGE_STATS |
232 | 289 |
233 /* Return memory usage for Dynarr D. The returned value is the total | 290 /* Return memory usage for Dynarr D. The returned value is the total |