1 /*
2  * Part of Scheme 48 1.9.  See file COPYING for notices and license.
3  *
4  * Authors: David Frese
5  */
6 
7 #ifndef __S48_REMEMBERED_SET
8 #define __S48_REMEMBERED_SET
9 
10 #include "utils.h"
11 #include "memory.h"
12 #include "gc_config.h"
13 
14 #if (S48_USE_REMEMBERED_SETS)
15 
16 #if S48_REMEMBERED_SET_TYPE==S48_DYNAMIC_REMEMBERED_SETS
17 /* Remembered Intergenerational Pointer Structure */
18 typedef struct Rem_ip{
19   s48_address ip;
20   struct Rem_ip* next_ip;
21 } Rem_ip;
22 #endif
23 
24 typedef struct RemSet {
25 #if S48_REMEMBERED_SET_TYPE==S48_DYNAMIC_REMEMBERED_SETS
26   Rem_ip* first_el;
27   Rem_ip* last_el;
28 #elif S48_REMEMBERED_SET_TYPE==S48_STATIC_REMEMBERED_SETS
29   s48_address elements[S48_REMEMBERED_SET_SIZE];
30   int free_index;
31 #elif S48_REMEMBERED_SET_TYPE==S48_EXTENSIBLE_REMEMBERED_SETS
32   s48_address elements[S48_REMEMBERED_SET_SIZE];
33   int free_index;
34   struct RemSet* next_remset;
35 #endif
36 }RemSet;
37 
38 /* RemSet Structure Construction */
39 RemSet* s48_make_remset();
40 void s48_free_remset(RemSet* remset);
41 
42 /* Operations on RemSet */
43 int s48_remset_add(s48_address ip, RemSet* remset);
44 int s48_remset_size(RemSet* remset);
45 void s48_trace_remset(RemSet* remset);
46 
47 /* checks if all locations are inside the heap */
48 void s48_check_remset(RemSet* remset);
49 #endif /* #if (S48_USE_REMEMBERED_SETS) */
50 
51 #endif
52