fix haddock submodule pointer
[ghc-hetmet.git] / includes / rts / storage / TSO.h
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 1998-2009
4  *
5  * The definitions for Thread State Objects.
6  *
7  * ---------------------------------------------------------------------------*/
8
9 #ifndef RTS_STORAGE_TSO_H
10 #define RTS_STORAGE_TSO_H
11
12 /*
13  * PROFILING info in a TSO
14  */
15 typedef struct {
16   CostCentreStack *CCCS;        /* thread's current CCS */
17 } StgTSOProfInfo;
18
19 /*
20  * There is no TICKY info in a TSO at this time.
21  */
22
23 /*
24  * Thread IDs are 32 bits.
25  */
26 typedef StgWord32 StgThreadID;
27
28 #define tsoLocked(tso) ((tso)->flags & TSO_LOCKED)
29
30 /*
31  * Type returned after running a thread.  Values of this type
32  * include HeapOverflow, StackOverflow etc.  See Constants.h for the
33  * full list.
34  */
35 typedef unsigned int StgThreadReturnCode;
36
37 #if defined(mingw32_HOST_OS)
38 /* results from an async I/O request + its request ID. */
39 typedef struct {
40   unsigned int reqID;
41   int          len;
42   int          errCode;
43 } StgAsyncIOResult;
44 #endif
45
46 /* Reason for thread being blocked. See comment above struct StgTso_. */
47 typedef union {
48   StgClosure *closure;
49   StgTSO *prev; // a back-link when the TSO is on the run queue (NotBlocked)
50   struct MessageBlackHole_ *bh;
51   struct MessageThrowTo_ *throwto;
52   struct MessageWakeup_  *wakeup;
53   StgInt fd;    /* StgInt instead of int, so that it's the same size as the ptrs */
54 #if defined(mingw32_HOST_OS)
55   StgAsyncIOResult *async_result;
56 #endif
57   StgWord target;
58 } StgTSOBlockInfo;
59
60
61 /*
62  * TSOs live on the heap, and therefore look just like heap objects.
63  * Large TSOs will live in their own "block group" allocated by the
64  * storage manager, and won't be copied during garbage collection.
65  */
66
67 /*
68  * Threads may be blocked for several reasons.  A blocked thread will
69  * have the reason in the why_blocked field of the TSO, and some
70  * further info (such as the closure the thread is blocked on, or the
71  * file descriptor if the thread is waiting on I/O) in the block_info
72  * field.
73  */
74
75 typedef struct StgTSO_ {
76     StgHeader               header;
77
78     /* The link field, for linking threads together in lists (e.g. the
79        run queue on a Capability.
80     */
81     struct StgTSO_*         _link;
82     /*
83       Currently used for linking TSOs on:
84       * cap->run_queue_{hd,tl}
85       * (non-THREADED_RTS); the blocked_queue
86       * and pointing to the next chunk for a ThreadOldStack
87
88        NOTE!!!  do not modify _link directly, it is subject to
89        a write barrier for generational GC.  Instead use the
90        setTSOLink() function.  Exceptions to this rule are:
91
92        * setting the link field to END_TSO_QUEUE
93        * setting the link field of the currently running TSO, as it
94          will already be dirty.
95     */
96
97     struct StgTSO_*         global_link;    // Links threads on the
98                                             // generation->threads lists
99     
100     /*
101      * The thread's stack
102      */
103     struct StgStack_       *stackobj;
104
105     /*
106      * The tso->dirty flag indicates that this TSO's stack should be
107      * scanned during garbage collection.  It also indicates that this
108      * TSO is on the mutable list.
109      *
110      * NB. The dirty flag gets a word to itself, so that it can be set
111      * safely by multiple threads simultaneously (the flags field is
112      * not safe for this purpose; see #3429).  It is harmless for the
113      * TSO to be on the mutable list multiple times.
114      *
115      * tso->dirty is set by dirty_TSO(), and unset by the garbage
116      * collector (only).
117      */
118
119     StgWord16               what_next;      // Values defined in Constants.h
120     StgWord16               why_blocked;    // Values defined in Constants.h
121     StgWord32               flags;          // Values defined in Constants.h
122     StgTSOBlockInfo         block_info;
123     StgThreadID             id;
124     StgWord32               saved_errno;
125     StgWord32               dirty;          /* non-zero => dirty */
126     struct InCall_*         bound;
127     struct Capability_*     cap;
128
129     struct StgTRecHeader_ * trec;       /* STM transaction record */
130
131     /*
132      * A list of threads blocked on this TSO waiting to throw exceptions.
133     */
134     struct MessageThrowTo_ * blocked_exceptions;
135
136     /*
137      * A list of StgBlockingQueue objects, representing threads
138      * blocked on thunks that are under evaluation by this thread.
139     */
140     struct StgBlockingQueue_ *bq;
141
142 #ifdef TICKY_TICKY
143     /* TICKY-specific stuff would go here. */
144 #endif
145 #ifdef PROFILING
146     StgTSOProfInfo prof;
147 #endif
148 #ifdef mingw32_HOST_OS
149     StgWord32 saved_winerror;
150 #endif
151
152     /*
153      * sum of the sizes of all stack chunks (in words), used to decide
154      * whether to throw the StackOverflow exception when the stack
155      * overflows, or whether to just chain on another stack chunk.
156      *
157      * Note that this overestimates the real stack size, because each
158      * chunk will have a gap at the end, of +RTS -kb<size> words.
159      * This means stack overflows are not entirely accurate, because
160      * the more gaps there are, the sooner the stack will run into the
161      * hard +RTS -K<size> limit.
162      */
163     StgWord32  tot_stack_size;
164
165 } *StgTSOPtr;
166
167 typedef struct StgStack_ {
168     StgHeader  header;
169     StgWord32  stack_size;     // stack size in *words*
170     StgWord32  dirty;          // non-zero => dirty
171     StgPtr     sp;             // current stack pointer
172     StgWord    stack[FLEXIBLE_ARRAY];
173 } StgStack;
174
175 // Calculate SpLim from a TSO (reads tso->stackobj, but no fields from
176 // the stackobj itself).
177 INLINE_HEADER StgPtr tso_SpLim (StgTSO* tso)
178 {
179     return tso->stackobj->stack + RESERVED_STACK_WORDS;
180 }
181
182 /* -----------------------------------------------------------------------------
183    functions
184    -------------------------------------------------------------------------- */
185
186 void dirty_TSO  (Capability *cap, StgTSO *tso);
187 void setTSOLink (Capability *cap, StgTSO *tso, StgTSO *target);
188 void setTSOPrev (Capability *cap, StgTSO *tso, StgTSO *target);
189
190 void dirty_STACK (Capability *cap, StgStack *stack);
191
192 /* -----------------------------------------------------------------------------
193    Invariants:
194
195    An active thread has the following properties:
196
197       tso->stack < tso->sp < tso->stack+tso->stack_size
198       tso->stack_size <= tso->max_stack_size
199       
200       RESERVED_STACK_WORDS is large enough for any heap-check or
201       stack-check failure.
202
203       The size of the TSO struct plus the stack is either
204         (a) smaller than a block, or
205         (b) a multiple of BLOCK_SIZE
206
207         tso->why_blocked       tso->block_info      location
208         ----------------------------------------------------------------------
209         NotBlocked             END_TSO_QUEUE        runnable_queue, or running
210         
211         BlockedOnBlackHole     the BLACKHOLE        blackhole_queue
212         
213         BlockedOnMVar          the MVAR             the MVAR's queue
214
215         BlockedOnSTM           END_TSO_QUEUE        STM wait queue(s)
216         
217         BlockedOnMsgThrowTo    MessageThrowTo *     TSO->blocked_exception
218
219         BlockedOnRead          NULL                 blocked_queue
220         BlockedOnWrite         NULL                 blocked_queue
221         BlockedOnDelay         NULL                 blocked_queue
222         BlockedOnGA            closure TSO blocks on   BQ of that closure
223         BlockedOnGA_NoSend     closure TSO blocks on   BQ of that closure
224
225       tso->link == END_TSO_QUEUE, if the thread is currently running.
226
227    A zombie thread has the following properties:
228       
229       tso->what_next == ThreadComplete or ThreadKilled
230       tso->link     ==  (could be on some queue somewhere)
231       tso->sp       ==  tso->stack + tso->stack_size - 1 (i.e. top stack word)
232       tso->sp[0]    ==  return value of thread, if what_next == ThreadComplete,
233                         exception             , if what_next == ThreadKilled
234
235       (tso->sp is left pointing at the top word on the stack so that
236       the return value or exception will be retained by a GC).
237
238    The 2 cases BlockedOnGA and BlockedOnGA_NoSend are needed in a GUM
239    setup only. They mark a TSO that has entered a FETCH_ME or
240    FETCH_ME_BQ closure, respectively; only the first TSO hitting the
241    closure will send a Fetch message.
242    Currently we have no separate code for blocking on an RBH; we use the
243    BlockedOnBlackHole case for that.   -- HWL
244
245  ---------------------------------------------------------------------------- */
246
247 /* this is the NIL ptr for a TSO queue (e.g. runnable queue) */
248 #define END_TSO_QUEUE  ((StgTSO *)(void*)&stg_END_TSO_QUEUE_closure)
249
250 #endif /* RTS_STORAGE_TSO_H */