1 //metadoc Collector copyright Steve Dekorte 2002
2 //metadoc Collector license BSD revised
3
4 #ifdef COLLECTOR_C
5 #define IO_IN_C_FILE
6 #endif
7 #include "Common_inline.h"
8 #ifdef IO_DECLARE_INLINES
9
10 // inspecting markers -------------------
11
Collector_markerIsWhite_(Collector * self,CollectorMarker * m)12 IOINLINE int Collector_markerIsWhite_(Collector *self, CollectorMarker *m)
13 {
14 return (self->whites->color == m->color);
15 }
16
Collector_markerIsGray_(Collector * self,CollectorMarker * m)17 IOINLINE int Collector_markerIsGray_(Collector *self, CollectorMarker *m)
18 {
19 return (COLLECTOR_GRAY == m->color);
20 }
21
Collector_markerIsBlack_(Collector * self,CollectorMarker * m)22 IOINLINE int Collector_markerIsBlack_(Collector *self, CollectorMarker *m)
23 {
24 return (self->blacks->color == m->color);
25 }
26
27 // changing marker colors -------------------
28
Collector_makeFree_(Collector * self,CollectorMarker * v)29 IOINLINE void Collector_makeFree_(Collector *self, CollectorMarker *v)
30 {
31 #ifdef COLLECTOR_RECYCLE_FREED
32 CollectorMarker_removeAndInsertAfter_((CollectorMarker *)v, self->freed);
33 #else
34 CollectorMarker_remove(v);
35 CollectorMarker_free(v);
36 #endif
37 }
38
Collector_makeWhite_(Collector * self,CollectorMarker * v)39 IOINLINE void Collector_makeWhite_(Collector *self, CollectorMarker *v)
40 {
41 CollectorMarker_removeAndInsertAfter_((CollectorMarker *)v, self->whites);
42 }
43
Collector_makeGray_(Collector * self,CollectorMarker * v)44 IOINLINE void Collector_makeGray_(Collector *self, CollectorMarker *v)
45 {
46 CollectorMarker_removeAndInsertAfter_((CollectorMarker *)v, self->grays);
47 }
48
Collector_makeBlack_(Collector * self,CollectorMarker * v)49 IOINLINE void Collector_makeBlack_(Collector *self, CollectorMarker *v)
50 {
51 CollectorMarker_removeAndInsertAfter_((CollectorMarker *)v, self->blacks);
52 }
53
Collector_makeGrayIfWhite_(Collector * self,void * v)54 IOINLINE void Collector_makeGrayIfWhite_(Collector *self, void *v)
55 {
56 if (Collector_markerIsWhite_(self, (CollectorMarker *)v))
57 {
58 Collector_makeGray_(self, (CollectorMarker *) v);
59 }
60 }
61
62 /*
63 IOINLINE void Collector_makeFreed_(Collector *self, void *v)
64 {
65 CollectorMarker_removeAndInsertAfter_(v, self->freed);
66 }
67 */
68 #ifdef COLLECTOR_USE_NONINCREMENTAL_MARK_SWEEP
69
70 #define Collector_value_addingRefTo_(self, v, ref)
71
72 #else
73
Collector_value_addingRefTo_(Collector * self,void * v,void * ref)74 IOINLINE void *Collector_value_addingRefTo_(Collector *self, void *v, void *ref)
75 {
76 if (Collector_markerIsBlack_(self, (CollectorMarker *)v) && Collector_markerIsWhite_(self, (CollectorMarker *)ref))
77 //if (self->safeMode || (Collector_markerIsBlack_(self, (CollectorMarker *)v) && Collector_markerIsWhite_(self, (CollectorMarker *)ref)))
78 {
79 Collector_makeGray_(self, (CollectorMarker *) ref);
80 }
81
82 return ref;
83 }
84
85 #endif
86
87 #undef IO_IN_C_FILE
88 #endif
89