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