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_MarkNextGA);
41 EXTDATA(_PRMarking_MarkNextGA_closure);
43 EXTFUN(_PRMarking_MarkNextAStack);
44 EXTFUN(_PRMarking_MarkNextBStack);
45 EXTDATA(_PRMarking_MarkNextAStack_closure);
46 EXTDATA(_PRMarking_MarkNextBStack_closure);
47 #endif /* not parallel */
52 markHeapRoots(sm, cafs1, cafs2, base, lim, bit_array)
54 P_ cafs1, cafs2; /* Pointer to CAF lists */
55 P_ base; /* Heap closure in range only tested for by GCgn */
67 DEBUG_STRING("Marking Roots:");
69 sm_roots_end = (P_) &sm->roots[sm->rootno];
70 MRoot = (P_) sm->roots;
72 MStack = (P_) _PRMarking_MarkNextRoot_closure;
74 miniInterpret((StgFunPtr)_startMarkWorld);
78 for(pool = 0; pool < SPARK_POOLS; pool++) {
79 if (PendingSparksHd[pool] < PendingSparksTl[pool]) {
80 sm_roots_end = (P_) PendingSparksTl[pool];
81 MRoot = (P_) PendingSparksHd[pool];
83 MStack = (P_) _PRMarking_MarkNextSpark_closure;
85 miniInterpret((StgFunPtr)_startMarkWorld);
91 DEBUG_STRING("Marking GA Roots:");
92 MRoot = (P_) liveIndirections;
93 while(MRoot != NULL && ((GALA *)MRoot)->ga.weight == MAX_GA_WEIGHT)
94 MRoot = (P_) ((GALA *)MRoot)->next;
96 Mark = ((GALA *)MRoot)->la;
97 MStack = (P_) _PRMarking_MarkNextGA_closure;
99 miniInterpret((StgFunPtr) _startMarkWorld);
103 /* Note: no *external* stacks in parallel/concurrent world */
105 DEBUG_STRING("Marking A Stack:");
106 if (SUBTRACT_A_STK(MAIN_SpA, stackInfo.botA) >= 0) {
107 MRoot = (P_) MAIN_SpA;
109 MStack = (P_) _PRMarking_MarkNextAStack_closure;
111 miniInterpret((StgFunPtr)_startMarkWorld);
114 DEBUG_STRING("Marking B Stack:");
115 if (SUBTRACT_B_STK(MAIN_SuB, stackInfo.botB) > 0) {
117 Mark = GRAB_UPDATEE(MRoot);
118 MStack = (P_) _PRMarking_MarkNextBStack_closure;
119 miniInterpret((StgFunPtr)_startMarkWorld);
121 # endif /* ! CONCURRENT */
124 DEBUG_STRING("Marking & Updating CAFs:");
127 Mark = (P_) IND_CLOSURE_PTR(MRoot);
128 MStack = (P_) _PRMarking_MarkNextCAF_closure;
130 miniInterpret((StgFunPtr)_startMarkWorld);
135 Mark = (P_) IND_CLOSURE_PTR(MRoot);
136 MStack = (P_) _PRMarking_MarkNextCAF_closure;
138 miniInterpret((StgFunPtr)_startMarkWorld);
144 #endif /* _INFO_MARKING */
148 CODE REQUIRED (expressed as a loop):
152 MStack = _PRMarking_MarkNextRoot_closure;
153 for (MRoot = (P_) sm->roots;
154 MRoot < (P_) &sm->roots[sm->rootno];
157 (PRMARK_CODE(INFO_PTR(Mark)))();
158 _PRMarking_MarkNextRoot:
165 MStack = _PRMarking_MarkNextAStack_closure;
166 for (MRoot = MAIN_SpA;
167 SUBTRACT_A_STK(MRoot, stackInfo.botA) >= 0;
168 MRoot = MRoot + AREL(1)) {
170 (PRMARK_CODE(INFO_PTR(Mark)))();
171 _PRMarking_MarkNextAStack:
178 MStack = _PRMarking_MarkNextBStack_closure;
179 for (MRoot = MAIN_SuB; --- Topmost Update Frame
180 SUBTRACT_B_STK(MRoot, stackInfo.botB) > 0;
181 MRoot = GRAB_SuB(MRoot)) {
183 Mark = GRAB_UPDATEE(MRoot);
184 (PRMARK_CODE(INFO_PTR(Mark)))();
185 _PRMarking_MarkNextBStack:
186 PUSH_UPDATEE(MRoot, Mark);
192 MStack = _PRMarking_MarkNextCAF_closure;
193 for (MRoot = sm->CAFlist;
195 MRoot = (P_) IND_CLOSURE_LINK(MRoot))
197 Mark = IND_CLOSURE_PTR(MRoot);
198 (PRMARK_CODE(INFO_PTR(Mark)))();
199 _PRMarking_MarkNextCAF:
200 IND_CLOSURE_PTR(MRoot) = (W_) Mark;