1 //metadoc Collector copyright Steve Dekorte, 2006
2 //metadoc Collector license BSD revised
3 //metadoc Collector description A tricolor collector using a Baker treadmill.
4 
5 #ifndef Collector_DEFINED
6 #define Collector_DEFINED 1
7 
8 #include "CollectorMarker.h"
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #define COLLECTOR_FOREACH(self, v, code) \
15 	COLLECTMARKER_FOREACH(self->whites,  v, code;); \
16 	COLLECTMARKER_FOREACH(self->grays,   v, code;); \
17 	COLLECTMARKER_FOREACH(self->blacks,  v, code;);
18 
19 //#define COLLECTOR_RECYCLE_FREED 1
20 #define COLLECTOR_USE_NONINCREMENTAL_MARK_SWEEP 1
21 
22 typedef enum
23 {
24 	COLLECTOR_INITIAL_WHITE,
25 	COLLECTOR_GRAY,
26 	COLLECTOR_INITIAL_BLACK,
27 	COLLECTOR_FREE
28 } CollectorColor;
29 
30 typedef int  (CollectorMarkFunc)(void *);
31 typedef void (CollectorWillFreeFunc)(void *);
32 typedef void (CollectorFreeFunc)(void *);
33 typedef int  (CollectorCheckFunc)(void *);
34 
35 typedef struct
36 {
37 	List *retainedValues;
38 	void *markBeforeSweepValue;
39 
40 	int pauseCount;
41 
42 	CollectorMarker *blacks;
43 	CollectorMarker *grays;
44 	CollectorMarker *whites;
45 	CollectorMarker *freed;
46 
47 	float marksPerAlloc;
48 	float queuedMarks;
49 
50 	size_t allocated;
51 	size_t allocatedSweepLevel;
52 	float allocatedStep;
53 
54 	CollectorMarkFunc *markFunc;
55 	CollectorWillFreeFunc *willFreeFunc;
56 	CollectorFreeFunc *freeFunc;
57 
58 	long clocksUsed;
59 	size_t sweepCount;
60 	int debugOn;
61 	int safeMode;
62 
63 	#ifdef COLLECTOR_USE_NONINCREMENTAL_MARK_SWEEP
64 	int newMarkerCount;
65 	int allocsPerSweep;
66 	#endif
67 } Collector;
68 
69 COLLECTOR_API Collector *Collector_new(void);
70 COLLECTOR_API void Collector_free(Collector *self);
71 
72 COLLECTOR_API void Collector_check(Collector *self);
73 COLLECTOR_API void Collector_checkObjectPointers(Collector *self); // if not 0, then memory is hosed
74 COLLECTOR_API void Collector_checkObjectsWith_(Collector *self, CollectorCheckFunc *func);
75 
76 COLLECTOR_API void Collector_setMarkBeforeSweepValue_(Collector *self, void *v);
77 
78 // callbacks
79 
80 COLLECTOR_API void Collector_setMarkFunc_(Collector *self, CollectorMarkFunc *func);
81 COLLECTOR_API void Collector_setWillFreeFunc_(Collector *self, CollectorWillFreeFunc *func);
82 COLLECTOR_API void Collector_setFreeFunc_(Collector *self, CollectorFreeFunc *func);
83 
84 // marks per alloc
85 
86 COLLECTOR_API void Collector_setMarksPerAlloc_(Collector *self, float n);
87 COLLECTOR_API float Collector_marksPerAlloc(Collector *self);
88 
89 // marks per sweep
90 
91 COLLECTOR_API void Collector_setAllocatedStep_(Collector *self, float n);
92 COLLECTOR_API float Collector_allocatedStep(Collector *self);
93 
94 #ifdef COLLECTOR_USE_NONINCREMENTAL_MARK_SWEEP
95 	COLLECTOR_API void Collector_setAllocsPerSweep_(Collector *self, int n);
96 	COLLECTOR_API float Collector_allocsPerSweep(Collector *self);
97 #endif
98 
99 // debug
100 
101 COLLECTOR_API void Collector_setDebug_(Collector *self, int b);
102 COLLECTOR_API void Collector_setSafeModeOn_(Collector *self, int b);
103 
104 // retaining
105 
106 COLLECTOR_API void *Collector_retain_(Collector *self, void *v);
107 COLLECTOR_API void Collector_stopRetaining_(Collector *self, void *v);
108 COLLECTOR_API void Collector_removeAllRetainedValues(Collector *self);
109 
110 // adding
111 
112 COLLECTOR_API CollectorMarker *Collector_newMarker(Collector *self);
113 COLLECTOR_API void Collector_addValue_(Collector *self, void *v);
114 
115 // collection
116 
117 COLLECTOR_API void Collector_initPhase(Collector *self);
118 COLLECTOR_API size_t Collector_sweep(Collector *self);
119 COLLECTOR_API size_t Collector_sweepPhase(Collector *self);
120 COLLECTOR_API void Collector_markPhase(Collector *self);
121 
122 COLLECTOR_API size_t Collector_collect(Collector *self);
123 COLLECTOR_API size_t Collector_freeAllValues(Collector *self);
124 
125 // changing colors
126 
127 #define Collector_shouldMark_(self, v) Collector_makeGrayIfWhite_(self, v)
128 //void Collector_makeGrayIfWhite_(Collector *self, void *v);
129 
130 //void Collector_makeWhite_(Collector *self, CollectorMarker *v);
131 //void Collector_makeGray_(Collector *self, CollectorMarker *v);
132 //void Collector_makeBlack_(Collector *self, CollectorMarker *v);
133 
134 //int Collector_markerIsWhite_(Collector *self, CollectorMarker *m);
135 //int Collector_markerIsGray_(Collector *self, CollectorMarker *m);
136 //int Collector_markerIsBlack_(Collector *self, CollectorMarker *m);
137 
138 COLLECTOR_API char *Collector_colorNameFor_(Collector *self, void *v);
139 
140 //void *Collector_value_addingRefTo_(Collector *self, void *v, void *ref);
141 
142 // pause/resume stack
143 
144 COLLECTOR_API void Collector_pushPause(Collector *self);
145 COLLECTOR_API void Collector_popPause(Collector *self);
146 COLLECTOR_API int Collector_isPaused(Collector *self);
147 COLLECTOR_API double Collector_timeUsed(Collector *self);
148 
149 
150 #include "Collector_inline.h"
151 
152 #ifdef __cplusplus
153 }
154 #endif
155 #endif
156