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