2139e6a5413335ac9de59d4a1ea2a81680a5755c
[bpt/guile.git] / libguile / gc.c
1 /* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2002, 2003, 2006, 2008 Free Software Foundation, Inc.
2 *
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17
18 #define _GNU_SOURCE
19
20 /* #define DEBUGINFO */
21
22 #if HAVE_CONFIG_H
23 # include <config.h>
24 #endif
25
26 #include <stdio.h>
27 #include <errno.h>
28 #include <string.h>
29 #include <assert.h>
30
31 #include "libguile/_scm.h"
32 #include "libguile/eval.h"
33 #include "libguile/stime.h"
34 #include "libguile/stackchk.h"
35 #include "libguile/struct.h"
36 #include "libguile/smob.h"
37 #include "libguile/unif.h"
38 #include "libguile/async.h"
39 #include "libguile/ports.h"
40 #include "libguile/root.h"
41 #include "libguile/strings.h"
42 #include "libguile/vectors.h"
43 #include "libguile/weaks.h"
44 #include "libguile/hashtab.h"
45 #include "libguile/tags.h"
46
47 #include "libguile/private-gc.h"
48 #include "libguile/validate.h"
49 #include "libguile/deprecation.h"
50 #include "libguile/gc.h"
51 #include "libguile/dynwind.h"
52
53 #ifdef GUILE_DEBUG_MALLOC
54 #include "libguile/debug-malloc.h"
55 #endif
56
57 #ifdef HAVE_MALLOC_H
58 #include <malloc.h>
59 #endif
60
61 #ifdef HAVE_UNISTD_H
62 #include <unistd.h>
63 #endif
64
65 /* Lock this mutex before doing lazy sweeping.
66 */
67 scm_i_pthread_mutex_t scm_i_sweep_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER;
68
69 /* Set this to != 0 if every cell that is accessed shall be checked:
70 */
71 int scm_debug_cell_accesses_p = 0;
72 int scm_expensive_debug_cell_accesses_p = 0;
73
74 /* Set this to 0 if no additional gc's shall be performed, otherwise set it to
75 * the number of cell accesses after which a gc shall be called.
76 */
77 int scm_debug_cells_gc_interval = 0;
78
79 /*
80 Global variable, so you can switch it off at runtime by setting
81 scm_i_cell_validation_already_running.
82 */
83 int scm_i_cell_validation_already_running ;
84
85 #if (SCM_DEBUG_CELL_ACCESSES == 1)
86
87
88 /*
89
90 Assert that the given object is a valid reference to a valid cell. This
91 test involves to determine whether the object is a cell pointer, whether
92 this pointer actually points into a heap segment and whether the cell
93 pointed to is not a free cell. Further, additional garbage collections may
94 get executed after a user defined number of cell accesses. This helps to
95 find places in the C code where references are dropped for extremely short
96 periods.
97
98 */
99 void
100 scm_i_expensive_validation_check (SCM cell)
101 {
102 if (!scm_in_heap_p (cell))
103 {
104 fprintf (stderr, "scm_assert_cell_valid: this object does not live in the heap: %lux\n",
105 (unsigned long) SCM_UNPACK (cell));
106 abort ();
107 }
108
109 /* If desired, perform additional garbage collections after a user
110 * defined number of cell accesses.
111 */
112 if (scm_debug_cells_gc_interval)
113 {
114 static unsigned int counter = 0;
115
116 if (counter != 0)
117 {
118 --counter;
119 }
120 else
121 {
122 counter = scm_debug_cells_gc_interval;
123 scm_gc ();
124 }
125 }
126 }
127
128 void
129 scm_assert_cell_valid (SCM cell)
130 {
131 if (!scm_i_cell_validation_already_running && scm_debug_cell_accesses_p)
132 {
133 scm_i_cell_validation_already_running = 1; /* set to avoid recursion */
134
135 /*
136 During GC, no user-code should be run, and the guile core
137 should use non-protected accessors.
138 */
139 if (scm_gc_running_p)
140 return;
141
142 /*
143 Only scm_in_heap_p and rescanning the heap is wildly
144 expensive.
145 */
146 if (scm_expensive_debug_cell_accesses_p)
147 scm_i_expensive_validation_check (cell);
148
149 if (!SCM_GC_MARK_P (cell))
150 {
151 fprintf (stderr,
152 "scm_assert_cell_valid: this object is unmarked. \n"
153 "It has been garbage-collected in the last GC run: "
154 "%lux\n",
155 (unsigned long) SCM_UNPACK (cell));
156 abort ();
157 }
158
159 scm_i_cell_validation_already_running = 0; /* re-enable */
160 }
161 }
162
163
164
165 SCM_DEFINE (scm_set_debug_cell_accesses_x, "set-debug-cell-accesses!", 1, 0, 0,
166 (SCM flag),
167 "If @var{flag} is @code{#f}, cell access checking is disabled.\n"
168 "If @var{flag} is @code{#t}, cheap cell access checking is enabled,\n"
169 "but no additional calls to garbage collection are issued.\n"
170 "If @var{flag} is a number, strict cell access checking is enabled,\n"
171 "with an additional garbage collection after the given\n"
172 "number of cell accesses.\n"
173 "This procedure only exists when the compile-time flag\n"
174 "@code{SCM_DEBUG_CELL_ACCESSES} was set to 1.")
175 #define FUNC_NAME s_scm_set_debug_cell_accesses_x
176 {
177 if (scm_is_false (flag))
178 {
179 scm_debug_cell_accesses_p = 0;
180 }
181 else if (scm_is_eq (flag, SCM_BOOL_T))
182 {
183 scm_debug_cells_gc_interval = 0;
184 scm_debug_cell_accesses_p = 1;
185 scm_expensive_debug_cell_accesses_p = 0;
186 }
187 else
188 {
189 scm_debug_cells_gc_interval = scm_to_signed_integer (flag, 0, INT_MAX);
190 scm_debug_cell_accesses_p = 1;
191 scm_expensive_debug_cell_accesses_p = 1;
192 }
193 return SCM_UNSPECIFIED;
194 }
195 #undef FUNC_NAME
196
197
198 #endif /* SCM_DEBUG_CELL_ACCESSES == 1 */
199
200 \f
201
202
203 /* scm_mtrigger
204 * is the number of bytes of malloc allocation needed to trigger gc.
205 */
206 unsigned long scm_mtrigger;
207
208 /* GC Statistics Keeping
209 */
210 unsigned long scm_cells_allocated = 0;
211 unsigned long scm_last_cells_allocated = 0;
212 unsigned long scm_mallocated = 0;
213
214 /* Global GC sweep statistics since the last full GC. */
215 static scm_t_sweep_statistics scm_i_gc_sweep_stats = { 0, 0 };
216 static scm_t_sweep_statistics scm_i_gc_sweep_stats_1 = { 0, 0 };
217
218 /* Total count of cells marked/swept. */
219 static double scm_gc_cells_marked_acc = 0.;
220 static double scm_gc_cells_swept_acc = 0.;
221 static double scm_gc_cells_allocated_acc = 0.;
222
223 static unsigned long scm_gc_time_taken = 0;
224 static unsigned long t_before_gc;
225 static unsigned long scm_gc_mark_time_taken = 0;
226
227 static unsigned long scm_gc_times = 0;
228
229 static int scm_gc_cell_yield_percentage = 0;
230 static unsigned long protected_obj_count = 0;
231
232 /* The following are accessed from `gc-malloc.c' and `gc-card.c'. */
233 int scm_gc_malloc_yield_percentage = 0;
234 unsigned long scm_gc_malloc_collected = 0;
235
236
237 SCM_SYMBOL (sym_cells_allocated, "cells-allocated");
238 SCM_SYMBOL (sym_heap_size, "cell-heap-size");
239 SCM_SYMBOL (sym_mallocated, "bytes-malloced");
240 SCM_SYMBOL (sym_mtrigger, "gc-malloc-threshold");
241 SCM_SYMBOL (sym_heap_segments, "cell-heap-segments");
242 SCM_SYMBOL (sym_gc_time_taken, "gc-time-taken");
243 SCM_SYMBOL (sym_gc_mark_time_taken, "gc-mark-time-taken");
244 SCM_SYMBOL (sym_times, "gc-times");
245 SCM_SYMBOL (sym_cells_marked, "cells-marked");
246 SCM_SYMBOL (sym_cells_swept, "cells-swept");
247 SCM_SYMBOL (sym_malloc_yield, "malloc-yield");
248 SCM_SYMBOL (sym_cell_yield, "cell-yield");
249 SCM_SYMBOL (sym_protected_objects, "protected-objects");
250 SCM_SYMBOL (sym_total_cells_allocated, "total-cells-allocated");
251
252
253 /* Number of calls to SCM_NEWCELL since startup. */
254 unsigned scm_newcell_count;
255 unsigned scm_newcell2_count;
256
257
258 /* {Scheme Interface to GC}
259 */
260 static SCM
261 tag_table_to_type_alist (void *closure, SCM key, SCM val, SCM acc)
262 {
263 if (scm_is_integer (key))
264 {
265 int c_tag = scm_to_int (key);
266
267 char const * name = scm_i_tag_name (c_tag);
268 if (name != NULL)
269 {
270 key = scm_from_locale_string (name);
271 }
272 else
273 {
274 char s[100];
275 sprintf (s, "tag %d", c_tag);
276 key = scm_from_locale_string (s);
277 }
278 }
279
280 return scm_cons (scm_cons (key, val), acc);
281 }
282
283 SCM_DEFINE (scm_gc_live_object_stats, "gc-live-object-stats", 0, 0, 0,
284 (),
285 "Return an alist of statistics of the current live objects. ")
286 #define FUNC_NAME s_scm_gc_live_object_stats
287 {
288 SCM tab = scm_make_hash_table (scm_from_int (57));
289 SCM alist;
290
291 scm_i_all_segments_statistics (tab);
292
293 alist
294 = scm_internal_hash_fold (&tag_table_to_type_alist, NULL, SCM_EOL, tab);
295
296 return alist;
297 }
298 #undef FUNC_NAME
299
300 extern int scm_gc_malloc_yield_percentage;
301 SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0,
302 (),
303 "Return an association list of statistics about Guile's current\n"
304 "use of storage.\n")
305 #define FUNC_NAME s_scm_gc_stats
306 {
307 long i = 0;
308 SCM heap_segs = SCM_EOL ;
309 unsigned long int local_scm_mtrigger;
310 unsigned long int local_scm_mallocated;
311 unsigned long int local_scm_heap_size;
312 int local_scm_gc_cell_yield_percentage;
313 int local_scm_gc_malloc_yield_percentage;
314 unsigned long int local_scm_cells_allocated;
315 unsigned long int local_scm_gc_time_taken;
316 unsigned long int local_scm_gc_times;
317 unsigned long int local_scm_gc_mark_time_taken;
318 unsigned long int local_protected_obj_count;
319 double local_scm_gc_cells_swept;
320 double local_scm_gc_cells_marked;
321 double local_scm_total_cells_allocated;
322 SCM answer;
323 unsigned long *bounds = 0;
324 int table_size = scm_i_heap_segment_table_size;
325 SCM_CRITICAL_SECTION_START;
326
327 /*
328 temporarily store the numbers, so as not to cause GC.
329 */
330
331 bounds = malloc (sizeof (unsigned long) * table_size * 2);
332 if (!bounds)
333 abort();
334 for (i = table_size; i--; )
335 {
336 bounds[2*i] = (unsigned long)scm_i_heap_segment_table[i]->bounds[0];
337 bounds[2*i+1] = (unsigned long)scm_i_heap_segment_table[i]->bounds[1];
338 }
339
340
341 /* Below, we cons to produce the resulting list. We want a snapshot of
342 * the heap situation before consing.
343 */
344 local_scm_mtrigger = scm_mtrigger;
345 local_scm_mallocated = scm_mallocated;
346 local_scm_heap_size = SCM_HEAP_SIZE;
347
348 local_scm_cells_allocated = scm_cells_allocated;
349
350 local_scm_gc_time_taken = scm_gc_time_taken;
351 local_scm_gc_mark_time_taken = scm_gc_mark_time_taken;
352 local_scm_gc_times = scm_gc_times;
353 local_scm_gc_malloc_yield_percentage = scm_gc_malloc_yield_percentage;
354 local_scm_gc_cell_yield_percentage= scm_gc_cell_yield_percentage;
355 local_protected_obj_count = protected_obj_count;
356 local_scm_gc_cells_swept =
357 (double) scm_gc_cells_swept_acc
358 + (double) scm_i_gc_sweep_stats.swept;
359 local_scm_gc_cells_marked = scm_gc_cells_marked_acc
360 +(double) scm_i_gc_sweep_stats.swept
361 -(double) scm_i_gc_sweep_stats.collected;
362
363 local_scm_total_cells_allocated = scm_gc_cells_allocated_acc
364 + (double) (scm_cells_allocated - scm_last_cells_allocated);
365
366 for (i = table_size; i--;)
367 {
368 heap_segs = scm_cons (scm_cons (scm_from_ulong (bounds[2*i]),
369 scm_from_ulong (bounds[2*i+1])),
370 heap_segs);
371 }
372 /* njrev: can any of these scm_cons's or scm_list_n signal a memory
373 error? If so we need a frame here. */
374 answer =
375 scm_list_n (scm_cons (sym_gc_time_taken,
376 scm_from_ulong (local_scm_gc_time_taken)),
377 scm_cons (sym_cells_allocated,
378 scm_from_ulong (local_scm_cells_allocated)),
379 scm_cons (sym_total_cells_allocated,
380 scm_from_double (local_scm_total_cells_allocated)),
381 scm_cons (sym_heap_size,
382 scm_from_ulong (local_scm_heap_size)),
383 scm_cons (sym_mallocated,
384 scm_from_ulong (local_scm_mallocated)),
385 scm_cons (sym_mtrigger,
386 scm_from_ulong (local_scm_mtrigger)),
387 scm_cons (sym_times,
388 scm_from_ulong (local_scm_gc_times)),
389 scm_cons (sym_gc_mark_time_taken,
390 scm_from_ulong (local_scm_gc_mark_time_taken)),
391 scm_cons (sym_cells_marked,
392 scm_from_double (local_scm_gc_cells_marked)),
393 scm_cons (sym_cells_swept,
394 scm_from_double (local_scm_gc_cells_swept)),
395 scm_cons (sym_malloc_yield,
396 scm_from_long(local_scm_gc_malloc_yield_percentage)),
397 scm_cons (sym_cell_yield,
398 scm_from_long (local_scm_gc_cell_yield_percentage)),
399 scm_cons (sym_protected_objects,
400 scm_from_ulong (local_protected_obj_count)),
401 scm_cons (sym_heap_segments, heap_segs),
402
403 SCM_UNDEFINED);
404 SCM_CRITICAL_SECTION_END;
405
406 free (bounds);
407 return answer;
408 }
409 #undef FUNC_NAME
410
411 /* Update the global sweeping/collection statistics by adding SWEEP_STATS to
412 SCM_I_GC_SWEEP_STATS and updating related variables. */
413 static inline void
414 gc_update_stats (scm_t_sweep_statistics sweep_stats)
415 {
416 /* CELLS SWEPT is another word for the number of cells that were examined
417 during GC. YIELD is the number that we cleaned out. MARKED is the number
418 that weren't cleaned. */
419
420 scm_gc_cell_yield_percentage = (sweep_stats.collected * 100) / SCM_HEAP_SIZE;
421
422 scm_i_sweep_statistics_sum (&scm_i_gc_sweep_stats, sweep_stats);
423
424 if ((scm_i_gc_sweep_stats.collected > scm_i_gc_sweep_stats.swept)
425 || (scm_cells_allocated < sweep_stats.collected))
426 {
427 printf ("internal GC error, please report to `"
428 PACKAGE_BUGREPORT "'\n");
429 abort ();
430 }
431
432 scm_gc_cells_allocated_acc +=
433 (double) (scm_cells_allocated - scm_last_cells_allocated);
434
435 scm_cells_allocated -= sweep_stats.collected;
436 scm_last_cells_allocated = scm_cells_allocated;
437 }
438
439 static void
440 gc_start_stats (const char *what SCM_UNUSED)
441 {
442 t_before_gc = scm_c_get_internal_run_time ();
443
444 scm_gc_malloc_collected = 0;
445 }
446
447 static void
448 gc_end_stats (scm_t_sweep_statistics sweep_stats)
449 {
450 unsigned long t = scm_c_get_internal_run_time ();
451
452 scm_gc_time_taken += (t - t_before_gc);
453
454 /* Reset the number of cells swept/collected since the last full GC. */
455 scm_i_gc_sweep_stats_1 = scm_i_gc_sweep_stats;
456 scm_i_gc_sweep_stats.collected = scm_i_gc_sweep_stats.swept = 0;
457
458 gc_update_stats (sweep_stats);
459
460 scm_gc_cells_marked_acc += (double) scm_i_gc_sweep_stats.swept
461 - (double) scm_i_gc_sweep_stats.collected;
462 scm_gc_cells_swept_acc += (double) scm_i_gc_sweep_stats.swept;
463
464 ++scm_gc_times;
465 }
466
467
468 SCM_DEFINE (scm_object_address, "object-address", 1, 0, 0,
469 (SCM obj),
470 "Return an integer that for the lifetime of @var{obj} is uniquely\n"
471 "returned by this function for @var{obj}")
472 #define FUNC_NAME s_scm_object_address
473 {
474 return scm_from_ulong (SCM_UNPACK (obj));
475 }
476 #undef FUNC_NAME
477
478
479 SCM_DEFINE (scm_gc, "gc", 0, 0, 0,
480 (),
481 "Scans all of SCM objects and reclaims for further use those that are\n"
482 "no longer accessible.")
483 #define FUNC_NAME s_scm_gc
484 {
485 scm_i_scm_pthread_mutex_lock (&scm_i_sweep_mutex);
486 scm_gc_running_p = 1;
487 scm_i_gc ("call");
488 /* njrev: It looks as though other places, e.g. scm_realloc,
489 can call scm_i_gc without acquiring the sweep mutex. Does this
490 matter? Also scm_i_gc (or its descendants) touch the
491 scm_sys_protects, which are protected in some cases
492 (e.g. scm_permobjs above in scm_gc_stats) by a critical section,
493 not by the sweep mutex. Shouldn't all the GC-relevant objects be
494 protected in the same way? */
495 scm_gc_running_p = 0;
496 scm_i_pthread_mutex_unlock (&scm_i_sweep_mutex);
497 scm_c_hook_run (&scm_after_gc_c_hook, 0);
498 return SCM_UNSPECIFIED;
499 }
500 #undef FUNC_NAME
501
502
503 \f
504
505 /* The master is global and common while the freelist will be
506 * individual for each thread.
507 */
508
509 SCM
510 scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells)
511 {
512 SCM cell;
513 int did_gc = 0;
514 scm_t_sweep_statistics sweep_stats;
515
516 scm_i_scm_pthread_mutex_lock (&scm_i_sweep_mutex);
517 scm_gc_running_p = 1;
518
519 *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
520 gc_update_stats (sweep_stats);
521
522 if (*free_cells == SCM_EOL && scm_i_gc_grow_heap_p (freelist))
523 {
524 freelist->heap_segment_idx =
525 scm_i_get_new_heap_segment (freelist,
526 scm_i_gc_sweep_stats,
527 abort_on_error);
528
529 *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
530 gc_update_stats (sweep_stats);
531 }
532
533 if (*free_cells == SCM_EOL)
534 {
535 /*
536 with the advent of lazy sweep, GC yield is only known just
537 before doing the GC.
538 */
539 scm_i_adjust_min_yield (freelist,
540 scm_i_gc_sweep_stats,
541 scm_i_gc_sweep_stats_1);
542
543 /*
544 out of fresh cells. Try to get some new ones.
545 */
546
547 did_gc = 1;
548 scm_i_gc ("cells");
549
550 *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
551 gc_update_stats (sweep_stats);
552 }
553
554 if (*free_cells == SCM_EOL)
555 {
556 /*
557 failed getting new cells. Get new juice or die.
558 */
559 freelist->heap_segment_idx =
560 scm_i_get_new_heap_segment (freelist,
561 scm_i_gc_sweep_stats,
562 abort_on_error);
563
564 *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
565 gc_update_stats (sweep_stats);
566 }
567
568 if (*free_cells == SCM_EOL)
569 abort ();
570
571 cell = *free_cells;
572
573 *free_cells = SCM_FREE_CELL_CDR (cell);
574
575 scm_gc_running_p = 0;
576 scm_i_pthread_mutex_unlock (&scm_i_sweep_mutex);
577
578 if (did_gc)
579 scm_c_hook_run (&scm_after_gc_c_hook, 0);
580
581 return cell;
582 }
583
584
585 scm_t_c_hook scm_before_gc_c_hook;
586 scm_t_c_hook scm_before_mark_c_hook;
587 scm_t_c_hook scm_before_sweep_c_hook;
588 scm_t_c_hook scm_after_sweep_c_hook;
589 scm_t_c_hook scm_after_gc_c_hook;
590
591 /* Must be called while holding scm_i_sweep_mutex.
592 */
593
594 void
595 scm_i_gc (const char *what)
596 {
597 scm_t_sweep_statistics sweep_stats;
598
599 scm_i_thread_put_to_sleep ();
600
601 scm_c_hook_run (&scm_before_gc_c_hook, 0);
602
603 #ifdef DEBUGINFO
604 fprintf (stderr,"gc reason %s\n", what);
605
606 fprintf (stderr,
607 scm_is_null (*SCM_FREELIST_LOC (scm_i_freelist))
608 ? "*"
609 : (scm_is_null (*SCM_FREELIST_LOC (scm_i_freelist2)) ? "o" : "m"));
610 #endif
611
612 gc_start_stats (what);
613
614 /*
615 Set freelists to NULL so scm_cons() always triggers gc, causing
616 the assertion above to fail.
617 */
618 *SCM_FREELIST_LOC (scm_i_freelist) = SCM_EOL;
619 *SCM_FREELIST_LOC (scm_i_freelist2) = SCM_EOL;
620
621 /*
622 Let's finish the sweep. The conservative GC might point into the
623 garbage, and marking that would create a mess.
624 */
625 scm_i_sweep_all_segments ("GC", &sweep_stats);
626
627 /* Invariant: the number of cells collected (i.e., freed) must always be
628 lower than or equal to the number of cells "swept" (i.e., visited). */
629 assert (sweep_stats.collected <= sweep_stats.swept);
630
631 if (scm_mallocated < scm_i_deprecated_memory_return)
632 {
633 /* The byte count of allocated objects has underflowed. This is
634 probably because you forgot to report the sizes of objects you
635 have allocated, by calling scm_done_malloc or some such. When
636 the GC freed them, it subtracted their size from
637 scm_mallocated, which underflowed. */
638 fprintf (stderr,
639 "scm_gc_sweep: Byte count of allocated objects has underflowed.\n"
640 "This is probably because the GC hasn't been correctly informed\n"
641 "about object sizes\n");
642 abort ();
643 }
644 scm_mallocated -= scm_i_deprecated_memory_return;
645
646
647 /* Mark */
648
649 scm_c_hook_run (&scm_before_mark_c_hook, 0);
650 scm_mark_all ();
651 scm_gc_mark_time_taken += (scm_c_get_internal_run_time () - t_before_gc);
652
653 /* Sweep
654
655 TODO: the after_sweep hook should probably be moved to just before
656 the mark, since that's where the sweep is finished in lazy
657 sweeping.
658
659 MDJ 030219 <djurfeldt@nada.kth.se>: No, probably not. The
660 original meaning implied at least two things: that it would be
661 called when
662
663 1. the freelist is re-initialized (no evaluation possible, though)
664
665 and
666
667 2. the heap is "fresh"
668 (it is well-defined what data is used and what is not)
669
670 Neither of these conditions would hold just before the mark phase.
671
672 Of course, the lazy sweeping has muddled the distinction between
673 scm_before_sweep_c_hook and scm_after_sweep_c_hook, but even if
674 there were no difference, it would still be useful to have two
675 distinct classes of hook functions since this can prevent some
676 bad interference when several modules adds gc hooks.
677 */
678
679 scm_c_hook_run (&scm_before_sweep_c_hook, 0);
680 scm_gc_sweep ();
681 scm_c_hook_run (&scm_after_sweep_c_hook, 0);
682
683 gc_end_stats (sweep_stats);
684
685 scm_i_thread_wake_up ();
686
687 /*
688 For debugging purposes, you could do
689 scm_i_sweep_all_segments("debug"), but then the remains of the
690 cell aren't left to analyse.
691 */
692 }
693
694
695 \f
696 /* {GC Protection Helper Functions}
697 */
698
699
700 /*
701 * If within a function you need to protect one or more scheme objects from
702 * garbage collection, pass them as parameters to one of the
703 * scm_remember_upto_here* functions below. These functions don't do
704 * anything, but since the compiler does not know that they are actually
705 * no-ops, it will generate code that calls these functions with the given
706 * parameters. Therefore, you can be sure that the compiler will keep those
707 * scheme values alive (on the stack or in a register) up to the point where
708 * scm_remember_upto_here* is called. In other words, place the call to
709 * scm_remember_upto_here* _behind_ the last code in your function, that
710 * depends on the scheme object to exist.
711 *
712 * Example: We want to make sure that the string object str does not get
713 * garbage collected during the execution of 'some_function' in the code
714 * below, because otherwise the characters belonging to str would be freed and
715 * 'some_function' might access freed memory. To make sure that the compiler
716 * keeps str alive on the stack or in a register such that it is visible to
717 * the conservative gc we add the call to scm_remember_upto_here_1 _after_ the
718 * call to 'some_function'. Note that this would not be necessary if str was
719 * used anyway after the call to 'some_function'.
720 * char *chars = scm_i_string_chars (str);
721 * some_function (chars);
722 * scm_remember_upto_here_1 (str); // str will be alive up to this point.
723 */
724
725 /* Remove any macro versions of these while defining the functions.
726 Functions are always included in the library, for upward binary
727 compatibility and in case combinations of GCC and non-GCC are used. */
728 #undef scm_remember_upto_here_1
729 #undef scm_remember_upto_here_2
730
731 void
732 scm_remember_upto_here_1 (SCM obj SCM_UNUSED)
733 {
734 /* Empty. Protects a single object from garbage collection. */
735 }
736
737 void
738 scm_remember_upto_here_2 (SCM obj1 SCM_UNUSED, SCM obj2 SCM_UNUSED)
739 {
740 /* Empty. Protects two objects from garbage collection. */
741 }
742
743 void
744 scm_remember_upto_here (SCM obj SCM_UNUSED, ...)
745 {
746 /* Empty. Protects any number of objects from garbage collection. */
747 }
748
749 /*
750 These crazy functions prevent garbage collection
751 of arguments after the first argument by
752 ensuring they remain live throughout the
753 function because they are used in the last
754 line of the code block.
755 It'd be better to have a nice compiler hint to
756 aid the conservative stack-scanning GC. --03/09/00 gjb */
757 SCM
758 scm_return_first (SCM elt, ...)
759 {
760 return elt;
761 }
762
763 int
764 scm_return_first_int (int i, ...)
765 {
766 return i;
767 }
768
769
770 SCM
771 scm_permanent_object (SCM obj)
772 {
773 SCM cell = scm_cons (obj, SCM_EOL);
774 SCM_CRITICAL_SECTION_START;
775 SCM_SETCDR (cell, scm_permobjs);
776 scm_permobjs = cell;
777 SCM_CRITICAL_SECTION_END;
778 return obj;
779 }
780
781
782 /* Protect OBJ from the garbage collector. OBJ will not be freed, even if all
783 other references are dropped, until the object is unprotected by calling
784 scm_gc_unprotect_object (OBJ). Calls to scm_gc_protect/unprotect_object nest,
785 i. e. it is possible to protect the same object several times, but it is
786 necessary to unprotect the object the same number of times to actually get
787 the object unprotected. It is an error to unprotect an object more often
788 than it has been protected before. The function scm_protect_object returns
789 OBJ.
790 */
791
792 /* Implementation note: For every object X, there is a counter which
793 scm_gc_protect_object(X) increments and scm_gc_unprotect_object(X) decrements.
794 */
795
796
797
798 SCM
799 scm_gc_protect_object (SCM obj)
800 {
801 SCM handle;
802
803 /* This critical section barrier will be replaced by a mutex. */
804 /* njrev: Indeed; if my comment above is correct, there is the same
805 critsec/mutex inconsistency here. */
806 SCM_CRITICAL_SECTION_START;
807
808 handle = scm_hashq_create_handle_x (scm_protects, obj, scm_from_int (0));
809 SCM_SETCDR (handle, scm_sum (SCM_CDR (handle), scm_from_int (1)));
810
811 protected_obj_count ++;
812
813 SCM_CRITICAL_SECTION_END;
814
815 return obj;
816 }
817
818
819 /* Remove any protection for OBJ established by a prior call to
820 scm_protect_object. This function returns OBJ.
821
822 See scm_protect_object for more information. */
823 SCM
824 scm_gc_unprotect_object (SCM obj)
825 {
826 SCM handle;
827
828 /* This critical section barrier will be replaced by a mutex. */
829 /* njrev: and again. */
830 SCM_CRITICAL_SECTION_START;
831
832 if (scm_gc_running_p)
833 {
834 fprintf (stderr, "scm_unprotect_object called during GC.\n");
835 abort ();
836 }
837
838 handle = scm_hashq_get_handle (scm_protects, obj);
839
840 if (scm_is_false (handle))
841 {
842 fprintf (stderr, "scm_unprotect_object called on unprotected object\n");
843 abort ();
844 }
845 else
846 {
847 SCM count = scm_difference (SCM_CDR (handle), scm_from_int (1));
848 if (scm_is_eq (count, scm_from_int (0)))
849 scm_hashq_remove_x (scm_protects, obj);
850 else
851 SCM_SETCDR (handle, count);
852 }
853 protected_obj_count --;
854
855 SCM_CRITICAL_SECTION_END;
856
857 return obj;
858 }
859
860 void
861 scm_gc_register_root (SCM *p)
862 {
863 SCM handle;
864 SCM key = scm_from_ulong ((unsigned long) p);
865
866 /* This critical section barrier will be replaced by a mutex. */
867 /* njrev: and again. */
868 SCM_CRITICAL_SECTION_START;
869
870 handle = scm_hashv_create_handle_x (scm_gc_registered_roots, key,
871 scm_from_int (0));
872 /* njrev: note also that the above can probably signal an error */
873 SCM_SETCDR (handle, scm_sum (SCM_CDR (handle), scm_from_int (1)));
874
875 SCM_CRITICAL_SECTION_END;
876 }
877
878 void
879 scm_gc_unregister_root (SCM *p)
880 {
881 SCM handle;
882 SCM key = scm_from_ulong ((unsigned long) p);
883
884 /* This critical section barrier will be replaced by a mutex. */
885 /* njrev: and again. */
886 SCM_CRITICAL_SECTION_START;
887
888 handle = scm_hashv_get_handle (scm_gc_registered_roots, key);
889
890 if (scm_is_false (handle))
891 {
892 fprintf (stderr, "scm_gc_unregister_root called on unregistered root\n");
893 abort ();
894 }
895 else
896 {
897 SCM count = scm_difference (SCM_CDR (handle), scm_from_int (1));
898 if (scm_is_eq (count, scm_from_int (0)))
899 scm_hashv_remove_x (scm_gc_registered_roots, key);
900 else
901 SCM_SETCDR (handle, count);
902 }
903
904 SCM_CRITICAL_SECTION_END;
905 }
906
907 void
908 scm_gc_register_roots (SCM *b, unsigned long n)
909 {
910 SCM *p = b;
911 for (; p < b + n; ++p)
912 scm_gc_register_root (p);
913 }
914
915 void
916 scm_gc_unregister_roots (SCM *b, unsigned long n)
917 {
918 SCM *p = b;
919 for (; p < b + n; ++p)
920 scm_gc_unregister_root (p);
921 }
922
923 int scm_i_terminating;
924
925 \f
926
927
928 /*
929 MOVE THIS FUNCTION. IT DOES NOT HAVE ANYTHING TODO WITH GC.
930 */
931
932 /* Get an integer from an environment variable. */
933 int
934 scm_getenv_int (const char *var, int def)
935 {
936 char *end = 0;
937 char *val = getenv (var);
938 long res = def;
939 if (!val)
940 return def;
941 res = strtol (val, &end, 10);
942 if (end == val)
943 return def;
944 return res;
945 }
946
947 void
948 scm_storage_prehistory ()
949 {
950 scm_c_hook_init (&scm_before_gc_c_hook, 0, SCM_C_HOOK_NORMAL);
951 scm_c_hook_init (&scm_before_mark_c_hook, 0, SCM_C_HOOK_NORMAL);
952 scm_c_hook_init (&scm_before_sweep_c_hook, 0, SCM_C_HOOK_NORMAL);
953 scm_c_hook_init (&scm_after_sweep_c_hook, 0, SCM_C_HOOK_NORMAL);
954 scm_c_hook_init (&scm_after_gc_c_hook, 0, SCM_C_HOOK_NORMAL);
955 }
956
957 scm_i_pthread_mutex_t scm_i_gc_admin_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER;
958
959 int
960 scm_init_storage ()
961 {
962 size_t j;
963
964 j = SCM_NUM_PROTECTS;
965 while (j)
966 scm_sys_protects[--j] = SCM_BOOL_F;
967
968 scm_gc_init_freelist();
969 scm_gc_init_malloc ();
970
971 j = SCM_HEAP_SEG_SIZE;
972
973 #if 0
974 /* We can't have a cleanup handler since we have no thread to run it
975 in. */
976
977 #ifdef HAVE_ATEXIT
978 atexit (cleanup);
979 #else
980 #ifdef HAVE_ON_EXIT
981 on_exit (cleanup, 0);
982 #endif
983 #endif
984
985 #endif
986
987 scm_stand_in_procs = scm_make_weak_key_hash_table (scm_from_int (257));
988 scm_permobjs = SCM_EOL;
989 scm_protects = scm_c_make_hash_table (31);
990 scm_gc_registered_roots = scm_c_make_hash_table (31);
991
992 return 0;
993 }
994
995 \f
996
997 SCM scm_after_gc_hook;
998
999 static SCM gc_async;
1000
1001 /* The function gc_async_thunk causes the execution of the after-gc-hook. It
1002 * is run after the gc, as soon as the asynchronous events are handled by the
1003 * evaluator.
1004 */
1005 static SCM
1006 gc_async_thunk (void)
1007 {
1008 scm_c_run_hook (scm_after_gc_hook, SCM_EOL);
1009 return SCM_UNSPECIFIED;
1010 }
1011
1012
1013 /* The function mark_gc_async is run by the scm_after_gc_c_hook at the end of
1014 * the garbage collection. The only purpose of this function is to mark the
1015 * gc_async (which will eventually lead to the execution of the
1016 * gc_async_thunk).
1017 */
1018 static void *
1019 mark_gc_async (void * hook_data SCM_UNUSED,
1020 void *fn_data SCM_UNUSED,
1021 void *data SCM_UNUSED)
1022 {
1023 /* If cell access debugging is enabled, the user may choose to perform
1024 * additional garbage collections after an arbitrary number of cell
1025 * accesses. We don't want the scheme level after-gc-hook to be performed
1026 * for each of these garbage collections for the following reason: The
1027 * execution of the after-gc-hook causes cell accesses itself. Thus, if the
1028 * after-gc-hook was performed with every gc, and if the gc was performed
1029 * after a very small number of cell accesses, then the number of cell
1030 * accesses during the execution of the after-gc-hook will suffice to cause
1031 * the execution of the next gc. Then, guile would keep executing the
1032 * after-gc-hook over and over again, and would never come to do other
1033 * things.
1034 *
1035 * To overcome this problem, if cell access debugging with additional
1036 * garbage collections is enabled, the after-gc-hook is never run by the
1037 * garbage collecter. When running guile with cell access debugging and the
1038 * execution of the after-gc-hook is desired, then it is necessary to run
1039 * the hook explicitly from the user code. This has the effect, that from
1040 * the scheme level point of view it seems that garbage collection is
1041 * performed with a much lower frequency than it actually is. Obviously,
1042 * this will not work for code that depends on a fixed one to one
1043 * relationship between the execution counts of the C level garbage
1044 * collection hooks and the execution count of the scheme level
1045 * after-gc-hook.
1046 */
1047
1048 #if (SCM_DEBUG_CELL_ACCESSES == 1)
1049 if (scm_debug_cells_gc_interval == 0)
1050 scm_system_async_mark (gc_async);
1051 #else
1052 scm_system_async_mark (gc_async);
1053 #endif
1054
1055 return NULL;
1056 }
1057
1058 void
1059 scm_init_gc ()
1060 {
1061 scm_gc_init_mark ();
1062
1063 scm_after_gc_hook = scm_permanent_object (scm_make_hook (SCM_INUM0));
1064 scm_c_define ("after-gc-hook", scm_after_gc_hook);
1065
1066 gc_async = scm_c_make_subr ("%gc-thunk", scm_tc7_subr_0,
1067 gc_async_thunk);
1068
1069 scm_c_hook_add (&scm_after_gc_c_hook, mark_gc_async, NULL, 0);
1070
1071 #include "libguile/gc.x"
1072 }
1073
1074 #ifdef __ia64__
1075 # ifdef __hpux
1076 # include <sys/param.h>
1077 # include <sys/pstat.h>
1078 void *
1079 scm_ia64_register_backing_store_base (void)
1080 {
1081 struct pst_vm_status vm_status;
1082 int i = 0;
1083 while (pstat_getprocvm (&vm_status, sizeof (vm_status), 0, i++) == 1)
1084 if (vm_status.pst_type == PS_RSESTACK)
1085 return (void *) vm_status.pst_vaddr;
1086 abort ();
1087 }
1088 void *
1089 scm_ia64_ar_bsp (const void *ctx)
1090 {
1091 uint64_t bsp;
1092 __uc_get_ar_bsp(ctx, &bsp);
1093 return (void *) bsp;
1094 }
1095 # endif /* hpux */
1096 # ifdef linux
1097 # include <ucontext.h>
1098 void *
1099 scm_ia64_register_backing_store_base (void)
1100 {
1101 extern void *__libc_ia64_register_backing_store_base;
1102 return __libc_ia64_register_backing_store_base;
1103 }
1104 void *
1105 scm_ia64_ar_bsp (const void *opaque)
1106 {
1107 const ucontext_t *ctx = opaque;
1108 return (void *) ctx->uc_mcontext.sc_ar_bsp;
1109 }
1110 # endif /* linux */
1111 #endif /* __ia64__ */
1112
1113 void
1114 scm_gc_sweep (void)
1115 #define FUNC_NAME "scm_gc_sweep"
1116 {
1117 scm_i_deprecated_memory_return = 0;
1118
1119 scm_i_gc_sweep_freelist_reset (&scm_i_master_freelist);
1120 scm_i_gc_sweep_freelist_reset (&scm_i_master_freelist2);
1121
1122 /*
1123 NOTHING HERE: LAZY SWEEPING !
1124 */
1125 scm_i_reset_segments ();
1126
1127 *SCM_FREELIST_LOC (scm_i_freelist) = SCM_EOL;
1128 *SCM_FREELIST_LOC (scm_i_freelist2) = SCM_EOL;
1129
1130 /* Invalidate the freelists of other threads. */
1131 scm_i_thread_invalidate_freelists ();
1132 }
1133
1134 #undef FUNC_NAME
1135
1136
1137
1138 /*
1139 Local Variables:
1140 c-file-style: "gnu"
1141 End:
1142 */