} StgTSOStatBuf;
/*
- * GRAN: We distinguish between the various classes of threads in
- * the system.
- */
-typedef enum {
- AdvisoryPriority,
- MandatoryPriority,
- RevalPriority
-} StgThreadPriority;
-
-/*
* PROFILING info in a TSO
*/
typedef struct {
} StgTSOProfInfo;
/*
- * PAR info in a TSO
- */
-typedef StgTSOStatBuf StgTSOParInfo;
-
-/*
- * DIST info in a TSO
- */
-typedef struct {
- StgThreadPriority priority;
- StgInt revalTid; /* ToDo: merge both into 1 word */
- StgInt revalSlot;
-} StgTSODistInfo;
-
-/*
- * GRAN info in a TSO
- */
-typedef StgTSOStatBuf StgTSOGranInfo;
-
-/*
* There is no TICKY info in a TSO at this time.
*/
} StgAsyncIOResult;
#endif
+/* Reason for thread being blocked. See comment above struct StgTso_. */
typedef union {
StgClosure *closure;
struct StgTSO_ *tso;
* storage manager, and won't be copied during garbage collection.
*/
-/*
+/*
* Threads may be blocked for several reasons. A blocked thread will
* have the reason in the why_blocked field of the TSO, and some
* further info (such as the closure the thread is blocked on, or the
typedef struct StgTSO_ {
StgHeader header;
- struct StgTSO_* link; /* Links threads onto blocking queues */
+ /* The link field, for linking threads together in lists (e.g. the
+ run queue on a Capability.
+ */
+ struct StgTSO_* _link;
+ /*
+ NOTE!!! do not modify _link directly, it is subject to
+ a write barrier for generational GC. Instead use the
+ setTSOLink() function. Exceptions to this rule are:
+
+ * setting the link field to END_TSO_QUEUE
+ * putting a TSO on the blackhole_queue
+ * setting the link field of the currently running TSO, as it
+ will already be dirty.
+ */
+
struct StgTSO_* global_link; /* Links all threads together */
StgWord16 what_next; /* Values defined in Constants.h */
struct Capability_* cap;
struct StgTRecHeader_ * trec; /* STM transaction record */
- /*
+ /*
A list of threads blocked on this TSO waiting to throw
exceptions. In order to access this field, the TSO must be
locked using lockClosure/unlockClosure (see SMP.h).
#ifdef PROFILING
StgTSOProfInfo prof;
#endif
-#ifdef PAR
- StgTSOParInfo par;
-#endif
-#ifdef GRAN
- StgTSOGranInfo gran;
-#endif
-#ifdef DIST
- StgTSODistInfo dist;
+#ifdef mingw32_HOST_OS
+ StgWord32 saved_winerror;
#endif
/* The thread stack... */
} StgTSO;
/* -----------------------------------------------------------------------------
+ functions
+ -------------------------------------------------------------------------- */
+
+extern void dirty_TSO (Capability *cap, StgTSO *tso);
+extern void setTSOLink (Capability *cap, StgTSO *tso, StgTSO *target);
+
+/* -----------------------------------------------------------------------------
Invariants:
An active thread has the following properties:
(tso->sp is left pointing at the top word on the stack so that
the return value or exception will be retained by a GC).
- tso->blocked_exceptions is either:
-
- NULL if async exceptions are unblocked.
-
- END_TSO_QUEUE if async exceptions are blocked, but no threads
- are currently waiting to deliver.
-
- (StgTSO *)tso if threads are currently awaiting delivery of
- exceptions to this thread.
-
The 2 cases BlockedOnGA and BlockedOnGA_NoSend are needed in a GUM
setup only. They mark a TSO that has entered a FETCH_ME or
- FETCH_ME_BQ closure, respectively; only the first TSO hitting the
+ FETCH_ME_BQ closure, respectively; only the first TSO hitting the
closure will send a Fetch message.
Currently we have no separate code for blocking on an RBH; we use the
BlockedOnBlackHole case for that. -- HWL
#define TSO_STRUCT_SIZEW (TSO_STRUCT_SIZE / sizeof(W_))
-
/* this is the NIL ptr for a TSO queue (e.g. runnable queue) */
#define END_TSO_QUEUE ((StgTSO *)(void*)&stg_END_TSO_QUEUE_closure)
-#if defined(PAR) || defined(GRAN)
-/* this is the NIL ptr for a blocking queue */
-# define END_BQ_QUEUE ((StgBlockingQueueElement *)(void*)&stg_END_TSO_QUEUE_closure)
-/* this is the NIL ptr for a blocked fetch queue (as in PendingFetches in GUM) */
-# define END_BF_QUEUE ((StgBlockedFetch *)(void*)&stg_END_TSO_QUEUE_closure)
-#endif
-/* ToDo?: different name for end of sleeping queue ? -- HWL */
-
#endif /* TSO_H */