1 | #ifndef PARROT_GC_GMS_H_GUARD |
---|
2 | #define PARROT_GC_GMS_H_GUARD |
---|
3 | |
---|
4 | /* |
---|
5 | * all objects have this header in front of the actual |
---|
6 | * object pointer. The prev/next pointers chain all existing |
---|
7 | * objects for one pool (sizeclass) together. |
---|
8 | * |
---|
9 | * XXX this could lead to unaligned FLOATVALs in the adjacent PMC |
---|
10 | * if that's true either insert a dummy or reorder PMC members |
---|
11 | * ??? How is that possible? |
---|
12 | */ |
---|
13 | typedef struct _gc_gms_hdr { |
---|
14 | struct _gc_gms_hdr *prev; |
---|
15 | struct _gc_gms_hdr *next; |
---|
16 | struct _gc_gms_gen *gen; |
---|
17 | void *gc_dummy_align; /* see above */ |
---|
18 | } Gc_gms_hdr; |
---|
19 | |
---|
20 | # define PObj_to_GMSH(o) (((Gc_gms_hdr*)(o))-1) |
---|
21 | # define GMSH_to_PObj(p) ((PObj*) ((p)+1)) |
---|
22 | |
---|
23 | /* the structure uses 2 ptrs itself */ |
---|
24 | # define GC_GMS_STORE_SIZE (64-2) |
---|
25 | |
---|
26 | typedef struct _gc_gms_hdr_store { |
---|
27 | struct _gc_gms_hdr_store *next; |
---|
28 | Gc_gms_hdr **ptr; /* insert location */ |
---|
29 | Gc_gms_hdr * (store[GC_GMS_STORE_SIZE]); /* array of hdr pointers */ |
---|
30 | } Gc_gms_hdr_store; |
---|
31 | |
---|
32 | typedef struct _gc_gms_hdr_list { |
---|
33 | Gc_gms_hdr_store *first; |
---|
34 | Gc_gms_hdr_store *last; |
---|
35 | } Gc_gms_hdr_list; |
---|
36 | |
---|
37 | |
---|
38 | /* |
---|
39 | * all objects belong to one generation |
---|
40 | */ |
---|
41 | typedef struct _gc_gms_gen { |
---|
42 | UINTVAL gen_no; /* generation number */ |
---|
43 | UINTVAL timely_destruct_obj_sofar; /* sum up to this generation */ |
---|
44 | UINTVAL black_color; /* live color of this generation */ |
---|
45 | struct _gc_gms_hdr *first; /* first header in this generation */ |
---|
46 | struct _gc_gms_hdr *last; /* last header in this generation */ |
---|
47 | struct _gc_gms_hdr *fin; /* need destruction/finalization */ |
---|
48 | struct Small_Object_Pool *pool; /* where this generation belongs to */ |
---|
49 | Gc_gms_hdr_list igp; /* IGPs for this generation */ |
---|
50 | UINTVAL n_possibly_dead; /* overwritten count */ |
---|
51 | UINTVAL n_objects; /* live objects count */ |
---|
52 | struct _gc_gms_gen *prev; |
---|
53 | struct _gc_gms_gen *next; |
---|
54 | } Gc_gms_gen; |
---|
55 | |
---|
56 | /* System-specific data for the Small_Object_Pool struct's gc_sys_private_data field. */ |
---|
57 | struct gc_gms_smallobjpool_data { |
---|
58 | Gc_gms_hdr marker; /* limit of list ... also the anchor of the "header chain" |
---|
59 | -- see gc_gms_chain_objects() */ |
---|
60 | Gc_gms_hdr *black; /* alive */ |
---|
61 | Gc_gms_hdr *black_fin; /* alive, needs destruction */ |
---|
62 | Gc_gms_hdr *gray; /* to be scanned */ |
---|
63 | Gc_gms_hdr *white; /* unprocessed */ |
---|
64 | Gc_gms_hdr *white_fin; /* unprocesse, needs destruction */ |
---|
65 | |
---|
66 | Gc_gms_gen *first_gen; /* linked list of generations */ |
---|
67 | Gc_gms_gen *last_gen; |
---|
68 | }; |
---|
69 | |
---|
70 | |
---|
71 | /*For arenas->gc_private*/ |
---|
72 | typedef struct Gc_gms_private { |
---|
73 | UINTVAL current_gen_no; /* the nursery generation number */ |
---|
74 | } Gc_gms_private; |
---|
75 | |
---|
76 | |
---|
77 | /*For gc_sys_priv_data in interp*/ |
---|
78 | struct gc_gms_sys_data { |
---|
79 | UINTVAL gc_generation; /* GC generation number */ |
---|
80 | } gc_gms_sys_data; |
---|
81 | |
---|
82 | #endif /*PARROT_GC_GMS_H_GUARD*/ |
---|