[project @ 1996-01-08 20:28:12 by partain]
[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) = Nil_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(do_gr_profile) {
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     }
68
69     /* Assign a brand-new global address to the newly created FMBQ */
70     lGA = MakeGlobal((SAVE_R1).p, rtsFalse);
71     splitWeight(&fmbqGA, lGA);
72     ASSERT(fmbqGA.weight == 1L << (BITS_IN(unsigned) - 1));
73
74     sendFetch(rGA, &fmbqGA, 0/*load*/);
75
76     ReSchedule(0);
77     FE_
78 }
79
80 FETCHME_ITBL(FetchMe_info,FetchMe_entry);
81
82 \end{code}
83
84 And for migrated FetchMes that are now blocked on remote blocking queues...
85
86 \begin{code}
87
88 STGFUN(BF_entry)
89 {
90     FB_
91     /* Don't wrap the calls; we're done with STG land */
92     fprintf(stderr, "Panic: Entered a BlockedFetch\n");
93     EXIT(EXIT_FAILURE);
94     FE_
95 }
96
97 BF_ITBL();
98
99 \end{code}
100
101 @FMBQ@ nodes are @FetchMe@s with blocking queues attached.  The fetch has
102 been sent, but no reply has been received yet.
103
104 \begin{code}
105
106 EXTFUN(EnterNodeCode);
107
108 STGFUN(FMBQ_entry)
109 {   
110     FB_
111
112 #if defined(GRAN)
113     STGCALL0(void,(),GranSimBlock);     /* Before overwriting TSO_LINK */
114 #endif
115
116     TSO_LINK(CurrentTSO) = (P_) FMBQ_ENTRIES(Node);
117     FMBQ_ENTRIES(Node) = (W_) CurrentTSO;
118
119     LivenessReg = LIVENESS_R1;
120     SaveAllStgRegs();
121     TSO_PC1(CurrentTSO) = EnterNodeCode;
122
123     if (DO_QP_PROF) {
124         QP_Event1("GR", CurrentTSO);
125     }
126
127     if(do_gr_profile) {
128         /* Note that CURRENT_TIME may perform an unsafe call */
129         TIME now = CURRENT_TIME;
130         TSO_EXECTIME(CurrentTSO) += now - TSO_BLOCKEDAT(CurrentTSO);
131         TSO_FETCHCOUNT(CurrentTSO)++;
132         TSO_QUEUE(CurrentTSO) = Q_FETCHING;
133         TSO_BLOCKEDAT(CurrentTSO) = now;
134         DumpGranEvent(GR_FETCH, CurrentTSO);
135     }
136
137     ReSchedule(0);
138     FE_
139 }
140
141 FMBQ_ITBL();
142
143 #endif /* PAR -- whole file */
144 \end{code}