1 /*************************************************************************
3 *************************************************************************/
5 [Something needed here to explain what this is doing. KH]
10 #include "SMinternal.h"
12 #if defined(_INFO_MARKING)
14 #if defined (__STG_GCC_REGS__) /* If we are using registers load _SAVE */
16 /* If we are using registers load _SAVE */
17 #define Mark SAVE_Mark
18 #define MRoot SAVE_MRoot
19 #define MStack SAVE_MStack
20 #define BitArray SAVE_BitArray
21 #define HeapBase SAVE_HeapBase
22 #define HeapLim SAVE_HeapLim
24 #endif /* registerized */
26 /* These in SMmark.lhc -- need to be in .hc file */
27 EXTFUN(_startMarkWorld);
29 EXTFUN(_PRMarking_MarkNextRoot);
30 EXTFUN(_PRMarking_MarkNextCAF);
31 EXTDATA(_PRMarking_MarkNextRoot_closure);
32 EXTDATA(_PRMarking_MarkNextCAF_closure);
35 EXTFUN(_PRMarking_MarkNextSpark);
36 EXTDATA(_PRMarking_MarkNextSpark_closure);
40 EXTFUN(_PRMarking_MarkNextEvent);
41 EXTDATA(_PRMarking_MarkNextEvent_closure);
42 EXTFUN(_PRMarking_MarkNextClosureInFetchBuffer);
43 EXTDATA(_PRMarking_MarkNextClosureInFetchBuffer_closure);
47 EXTFUN(_PRMarking_MarkNextGA);
48 EXTDATA(_PRMarking_MarkNextGA_closure);
50 # if 1 /* !defined(GRAN) */ /* HWL */
51 EXTFUN(_PRMarking_MarkNextAStack);
52 EXTFUN(_PRMarking_MarkNextBStack);
53 EXTDATA(_PRMarking_MarkNextAStack_closure);
54 EXTDATA(_PRMarking_MarkNextBStack_closure);
56 #endif /* not parallel */
60 P_ ret_MRoot, ret_Mark;
64 markHeapRoots(sm, cafs1, cafs2, base, lim, bit_array)
66 P_ cafs1, cafs2; /* Pointer to CAF lists */
67 P_ base; /* Heap closure in range only tested for by GCgn */
78 rtsBool found = rtsFalse;
85 DEBUG_STRING("Marking Roots:");
87 sm_roots_end = (P_) &sm->roots[sm->rootno];
88 MRoot = (P_) sm->roots;
90 MStack = (P_) _PRMarking_MarkNextRoot_closure;
92 miniInterpret((StgFunPtr)_startMarkWorld);
96 DEBUG_STRING("Marking Events (GRAN): ");
101 /* inlined version of MarkNextEvent */
102 switch (EVENT_TYPE( ((eventq) MRoot) )) {
107 EVENT_GC_INFO( ((eventq) MRoot) ) = 0;
108 Mark = (P_) EVENT_TSO( ((eventq) MRoot) );
109 MStack = (P_) _PRMarking_MarkNextEvent_closure;
110 miniInterpret((StgFunPtr)_startMarkWorld);
114 EVENT_GC_INFO( ((eventq) MRoot) ) = 0;
115 Mark = (P_) SPARK_NODE(EVENT_SPARK( ((eventq) MRoot) ));
116 MStack = (P_) _PRMarking_MarkNextEvent_closure;
117 miniInterpret((StgFunPtr)_startMarkWorld);
121 EVENT_GC_INFO( ((eventq) MRoot) ) = 0;
122 Mark = (P_) EVENT_TSO( ((eventq) MRoot) );
123 MStack = (P_) _PRMarking_MarkNextEvent_closure;
124 miniInterpret((StgFunPtr)_startMarkWorld);
128 EVENT_GC_INFO( ((eventq) MRoot) ) = 0;
129 Mark = (P_) EVENT_TSO( ((eventq) MRoot) );
130 MStack = (P_) _PRMarking_MarkNextEvent_closure;
131 miniInterpret((StgFunPtr)_startMarkWorld);
135 EVENT_GC_INFO( ((eventq) MRoot) ) = 0;
136 Mark = (P_) EVENT_TSO( ((eventq) MRoot) );
137 MStack = (P_) _PRMarking_MarkNextEvent_closure;
138 miniInterpret((StgFunPtr)_startMarkWorld);
142 Mark = (P_) EVENT_TSO( ((eventq) MRoot) );
143 MStack = (P_) _PRMarking_MarkNextEvent_closure;
144 miniInterpret((StgFunPtr)_startMarkWorld);
148 MRoot = (P_) EVENT_NEXT( ((eventq) MRoot) );
152 fprintf(stderr,"Unknown event type %d (event @ %#x) in SMmarking_NextEvent\n",
153 EVENT_TYPE( ((eventq) MRoot) ), MRoot);
157 } while (!found && MRoot != NULL);
159 DEBUG_STRING("Marking Sparks (GRAN):");
160 /* ToDo: Check this code */
161 for(proc = 0; proc < RTSflags.GranFlags.proc; ++proc) {
162 for(pool = 0; pool < SPARK_POOLS; pool++) {
163 MRoot = (P_) PendingSparksHd[proc][pool];
165 Mark = (P_) SPARK_NODE( ((sparkq) MRoot) );
166 MStack = (P_) _PRMarking_MarkNextSpark_closure;
167 miniInterpret((StgFunPtr)_startMarkWorld);
169 } /* forall pool .. */
170 } /* forall proc ... */
173 #if defined(CONCURRENT) && !defined(GRAN)
174 for(pool = 0; pool < SPARK_POOLS; pool++) {
175 if (PendingSparksHd[pool] < PendingSparksTl[pool]) {
176 sm_roots_end = (P_) PendingSparksTl[pool];
177 MRoot = (P_) PendingSparksHd[pool];
179 MStack = (P_) _PRMarking_MarkNextSpark_closure;
181 miniInterpret((StgFunPtr)_startMarkWorld);
187 DEBUG_STRING("Marking GA Roots:");
188 MRoot = (P_) liveIndirections;
189 while(MRoot != NULL && ((GALA *)MRoot)->ga.weight == MAX_GA_WEIGHT)
190 MRoot = (P_) ((GALA *)MRoot)->next;
192 Mark = ((GALA *)MRoot)->la;
193 MStack = (P_) _PRMarking_MarkNextGA_closure;
195 miniInterpret((StgFunPtr) _startMarkWorld);
198 # if 1 /* !defined(GRAN) */ /* HWL */
199 /* Note: no *external* stacks in parallel/concurrent world */
201 DEBUG_STRING("Marking A Stack:");
202 if (SUBTRACT_A_STK(MAIN_SpA, stackInfo.botA) >= 0) {
203 MRoot = (P_) MAIN_SpA;
205 MStack = (P_) _PRMarking_MarkNextAStack_closure;
207 miniInterpret((StgFunPtr)_startMarkWorld);
210 DEBUG_STRING("Marking B Stack:");
211 if (SUBTRACT_B_STK(MAIN_SuB, stackInfo.botB) > 0) {
213 Mark = GRAB_UPDATEE(MRoot);
214 MStack = (P_) _PRMarking_MarkNextBStack_closure;
215 miniInterpret((StgFunPtr)_startMarkWorld);
217 # endif /* ! CONCURRENT */
220 DEBUG_STRING("Marking & Updating CAFs:");
223 Mark = (P_) IND_CLOSURE_PTR(MRoot);
224 MStack = (P_) _PRMarking_MarkNextCAF_closure;
226 miniInterpret((StgFunPtr)_startMarkWorld);
231 Mark = (P_) IND_CLOSURE_PTR(MRoot);
232 MStack = (P_) _PRMarking_MarkNextCAF_closure;
234 miniInterpret((StgFunPtr)_startMarkWorld);
240 #endif /* _INFO_MARKING */
244 CODE REQUIRED (expressed as a loop):
248 MStack = _PRMarking_MarkNextRoot_closure;
249 for (MRoot = (P_) sm->roots;
250 MRoot < (P_) &sm->roots[sm->rootno];
253 (PRMARK_CODE(INFO_PTR(Mark)))();
254 _PRMarking_MarkNextRoot:
261 MStack = _PRMarking_MarkNextAStack_closure;
262 for (MRoot = MAIN_SpA;
263 SUBTRACT_A_STK(MRoot, stackInfo.botA) >= 0;
264 MRoot = MRoot + AREL(1)) {
266 (PRMARK_CODE(INFO_PTR(Mark)))();
267 _PRMarking_MarkNextAStack:
274 MStack = _PRMarking_MarkNextBStack_closure;
275 for (MRoot = MAIN_SuB; --- Topmost Update Frame
276 SUBTRACT_B_STK(MRoot, stackInfo.botB) > 0;
277 MRoot = GRAB_SuB(MRoot)) {
279 Mark = GRAB_UPDATEE(MRoot);
280 (PRMARK_CODE(INFO_PTR(Mark)))();
281 _PRMarking_MarkNextBStack:
282 PUSH_UPDATEE(MRoot, Mark);
288 MStack = _PRMarking_MarkNextCAF_closure;
289 for (MRoot = sm->CAFlist;
291 MRoot = (P_) IND_CLOSURE_LINK(MRoot))
293 Mark = IND_CLOSURE_PTR(MRoot);
294 (PRMARK_CODE(INFO_PTR(Mark)))();
295 _PRMarking_MarkNextCAF:
296 IND_CLOSURE_PTR(MRoot) = (W_) Mark;