diff options
Diffstat (limited to 'lstate.h')
-rw-r--r-- | lstate.h | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -46,6 +46,15 @@ | |||
46 | ** lists. Moreover, barriers can age young objects in young lists as | 46 | ** lists. Moreover, barriers can age young objects in young lists as |
47 | ** OLD0, which then become OLD1. However, a list never contains | 47 | ** OLD0, which then become OLD1. However, a list never contains |
48 | ** elements younger than their main ages. | 48 | ** elements younger than their main ages. |
49 | ** | ||
50 | ** The generational collector also uses a pointer 'firstold1', which | ||
51 | ** points to the first OLD1 object in the list. It is used to optimize | ||
52 | ** 'markold'. (Potentially OLD1 objects can be anywhere between 'allgc' | ||
53 | ** and 'reallyold', but often the list has no OLD1 objects or they are | ||
54 | ** after 'old1'.) Note the difference between it and 'old1': | ||
55 | ** 'firstold1': no OLD1 objects before this point; there can be all | ||
56 | ** ages after it. | ||
57 | ** 'old1': no objects younger than OLD1 after this point. | ||
49 | */ | 58 | */ |
50 | 59 | ||
51 | /* | 60 | /* |
@@ -54,7 +63,7 @@ | |||
54 | ** can become gray have such a field. The field is not the same | 63 | ** can become gray have such a field. The field is not the same |
55 | ** in all objects, but it always has this name.) Any gray object | 64 | ** in all objects, but it always has this name.) Any gray object |
56 | ** must belong to one of these lists, and all objects in these lists | 65 | ** must belong to one of these lists, and all objects in these lists |
57 | ** must be gray: | 66 | ** must be gray (with one exception explained below): |
58 | ** | 67 | ** |
59 | ** 'gray': regular gray objects, still waiting to be visited. | 68 | ** 'gray': regular gray objects, still waiting to be visited. |
60 | ** 'grayagain': objects that must be revisited at the atomic phase. | 69 | ** 'grayagain': objects that must be revisited at the atomic phase. |
@@ -65,6 +74,12 @@ | |||
65 | ** 'weak': tables with weak values to be cleared; | 74 | ** 'weak': tables with weak values to be cleared; |
66 | ** 'ephemeron': ephemeron tables with white->white entries; | 75 | ** 'ephemeron': ephemeron tables with white->white entries; |
67 | ** 'allweak': tables with weak keys and/or weak values to be cleared. | 76 | ** 'allweak': tables with weak keys and/or weak values to be cleared. |
77 | ** | ||
78 | ** The exception to that "gray rule" is the TOUCHED2 objects in | ||
79 | ** generational mode. Those objects stay in a gray list (because they | ||
80 | ** must be visited again at the end of the cycle), but they are marked | ||
81 | ** black (because assignments to them must activate barriers, to move | ||
82 | ** them back to TOUCHED1). | ||
68 | */ | 83 | */ |
69 | 84 | ||
70 | 85 | ||
@@ -266,6 +281,7 @@ typedef struct global_State { | |||
266 | GCObject *survival; /* start of objects that survived one GC cycle */ | 281 | GCObject *survival; /* start of objects that survived one GC cycle */ |
267 | GCObject *old1; /* start of old1 objects */ | 282 | GCObject *old1; /* start of old1 objects */ |
268 | GCObject *reallyold; /* objects more than one cycle old ("really old") */ | 283 | GCObject *reallyold; /* objects more than one cycle old ("really old") */ |
284 | GCObject *firstold1; /* first OLD1 object in the list (if any) */ | ||
269 | GCObject *finobjsur; /* list of survival objects with finalizers */ | 285 | GCObject *finobjsur; /* list of survival objects with finalizers */ |
270 | GCObject *finobjold1; /* list of old1 objects with finalizers */ | 286 | GCObject *finobjold1; /* list of old1 objects with finalizers */ |
271 | GCObject *finobjrold; /* list of really old objects with finalizers */ | 287 | GCObject *finobjrold; /* list of really old objects with finalizers */ |