[project @ 1998-11-26 09:17:22 by sof]
[ghc-hetmet.git] / ghc / runtime / gum / FetchMe.lhc
1 %
2 % (c) Parade/AQUA Projects, Glasgow University, 1995 
3 %     Kevin Hammond, February 15th. 1995
4 %
5 %     This is for GUM only.
6 %
7 %************************************************************************
8 %*                                                                      *
9 \section[FetchMe.lhc]{Reading Closures}
10 %*                                                                      *
11 %************************************************************************
12
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.
16
17 \begin{code}
18 #ifdef PAR /* whole file */
19
20 #define MAIN_REG_MAP        /* STG world */
21 #include "rtsdefs.h"
22 \end{code}
23
24 \begin{code}
25
26 EXTDATA_RO(BH_UPD_info);
27 EXTDATA_RO(FetchMe_info);
28
29 EXTFUN(EnterNodeCode);
30
31 STGFUN(FetchMe_entry)
32 {
33     globalAddr *rGA;
34     globalAddr *lGA;
35     globalAddr fmbqGA;
36
37 # if defined(GRAN)
38     STGCALL0(void,(),GranSimBlock);     /* Do this before losing its TSO_LINK */
39 # endif
40
41     rGA = FETCHME_GA(Node);
42     ASSERT(rGA->loc.gc.gtid != mytid);
43
44     TSO_LINK(CurrentTSO) = PrelBase_Z91Z93_closure;
45     SET_INFO_PTR(Node, FMBQ_info);
46     FMBQ_ENTRIES(Node) = (W_) CurrentTSO;
47
48     LivenessReg = LIVENESS_R1;
49     SaveAllStgRegs();
50     TSO_PC1(CurrentTSO) = EnterNodeCode;
51
52     /* Calls out are now safe */
53
54     if (DO_QP_PROF) {
55         QP_Event1("GR", CurrentTSO);
56     }
57
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);
69     }
70
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));
75
76     sendFetch(rGA, &fmbqGA, 0/*load*/);
77
78     ReSchedule(0);
79     FE_
80 }
81
82 FETCHME_ITBL(FetchMe_info,FetchMe_entry);
83
84 \end{code}
85
86 And for migrated FetchMes that are now blocked on remote blocking queues...
87
88 \begin{code}
89
90 STGFUN(BF_entry)
91 {
92     FB_
93     /* Don't wrap the calls; we're done with STG land */
94     fprintf(stderr, "Panic: Entered a BlockedFetch\n");
95     EXIT(EXIT_FAILURE);
96     FE_
97 }
98
99 BF_ITBL();
100
101 \end{code}
102
103 @FMBQ@ nodes are @FetchMe@s with blocking queues attached.  The fetch has
104 been sent, but no reply has been received yet.
105
106 \begin{code}
107
108 EXTFUN(EnterNodeCode);
109
110 STGFUN(FMBQ_entry)
111 {   
112     FB_
113
114 #if defined(GRAN)
115     STGCALL0(void,(),GranSimBlock);     /* Before overwriting TSO_LINK */
116 #endif
117
118     TSO_LINK(CurrentTSO) = (P_) FMBQ_ENTRIES(Node);
119     FMBQ_ENTRIES(Node) = (W_) CurrentTSO;
120
121     LivenessReg = LIVENESS_R1;
122     SaveAllStgRegs();
123     TSO_PC1(CurrentTSO) = EnterNodeCode;
124
125     if (DO_QP_PROF) {
126         QP_Event1("GR", CurrentTSO);
127     }
128
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);
137     }
138
139     ReSchedule(0);
140     FE_
141 }
142
143 FMBQ_ITBL();
144
145 #endif /* PAR -- whole file */
146 \end{code}