2 % (c) Parade/AQUA Projects, Glasgow University, 1995
3 % Kevin Hammond, February 15th. 1995
5 % This is for GUM only.
7 %************************************************************************
9 \section[FetchMe.lhc]{Reading Closures}
11 %************************************************************************
13 This module defines routines for handling remote pointers (@FetchMe@s)
14 in GUM. It is threaded (@.lhc@) because @FetchMe_entry@ will be
15 called during evaluation.
18 #ifdef PAR /* whole file */
20 #define MAIN_REG_MAP /* STG world */
26 EXTDATA_RO(BH_UPD_info);
27 EXTDATA_RO(FetchMe_info);
29 EXTFUN(EnterNodeCode);
38 STGCALL0(void,(),GranSimBlock); /* Do this before losing its TSO_LINK */
41 rGA = FETCHME_GA(Node);
42 ASSERT(rGA->loc.gc.gtid != mytid);
44 TSO_LINK(CurrentTSO) = PrelBase_Z91Z93_closure;
45 SET_INFO_PTR(Node, FMBQ_info);
46 FMBQ_ENTRIES(Node) = (W_) CurrentTSO;
48 LivenessReg = LIVENESS_R1;
50 TSO_PC1(CurrentTSO) = EnterNodeCode;
52 /* Calls out are now safe */
55 QP_Event1("GR", CurrentTSO);
58 if (RTSflags.ParFlags.granSimStats) {
59 /* Note that CURRENT_TIME may perform an unsafe call */
60 TIME now = CURRENT_TIME;
61 TSO_EXECTIME(CurrentTSO) += now - TSO_BLOCKEDAT(CurrentTSO);
62 TSO_FETCHCOUNT(CurrentTSO)++;
63 TSO_QUEUE(CurrentTSO) = Q_FETCHING;
64 TSO_BLOCKEDAT(CurrentTSO) = now;
65 /* DumpGranEventAndNode(GR_FETCH, CurrentTSO, (SAVE_R1).p,
66 taskIDtoPE(rGA->loc.gc.gtid)); */
67 DumpRawGranEvent(CURRENT_PROC,taskIDtoPE(rGA->loc.gc.gtid),GR_FETCH,
68 CurrentTSO,(SAVE_R1).p,0);
71 /* Assign a brand-new global address to the newly created FMBQ */
72 lGA = MakeGlobal((SAVE_R1).p, rtsFalse);
73 splitWeight(&fmbqGA, lGA);
74 ASSERT(fmbqGA.weight == 1L << (BITS_IN(unsigned) - 1));
76 sendFetch(rGA, &fmbqGA, 0/*load*/);
82 FETCHME_ITBL(FetchMe_info,FetchMe_entry);
86 And for migrated FetchMes that are now blocked on remote blocking queues...
93 /* Don't wrap the calls; we're done with STG land */
94 fprintf(stderr, "Panic: Entered a BlockedFetch\n");
103 @FMBQ@ nodes are @FetchMe@s with blocking queues attached. The fetch has
104 been sent, but no reply has been received yet.
108 EXTFUN(EnterNodeCode);
115 STGCALL0(void,(),GranSimBlock); /* Before overwriting TSO_LINK */
118 TSO_LINK(CurrentTSO) = (P_) FMBQ_ENTRIES(Node);
119 FMBQ_ENTRIES(Node) = (W_) CurrentTSO;
121 LivenessReg = LIVENESS_R1;
123 TSO_PC1(CurrentTSO) = EnterNodeCode;
126 QP_Event1("GR", CurrentTSO);
129 if (RTSflags.ParFlags.granSimStats) {
130 /* Note that CURRENT_TIME may perform an unsafe call */
131 TIME now = CURRENT_TIME;
132 TSO_EXECTIME(CurrentTSO) += now - TSO_BLOCKEDAT(CurrentTSO);
133 TSO_FETCHCOUNT(CurrentTSO)++;
134 TSO_QUEUE(CurrentTSO) = Q_FETCHING;
135 TSO_BLOCKEDAT(CurrentTSO) = now;
136 DumpGranEvent(GR_FETCH, CurrentTSO);
145 #endif /* PAR -- whole file */