*/
typedef StgWord32 StgThreadID;
-/*
- * Flags for the tso->flags field.
- *
- * The TSO_DIRTY flag indicates that this TSO's stack should be
- * scanned during garbage collection. The link field of a TSO is
- * always scanned, so we don't have to dirty a TSO just for linking
- * it on a different list.
- *
- * TSO_DIRTY is set by
- * - schedule(), just before running a thread,
- * - raiseAsync(), because it modifies a thread's stack
- * - resumeThread(), just before running the thread again
- * and unset by the garbage collector (only).
- */
-#define TSO_DIRTY 1
-
-/*
- * TSO_LOCKED is set when a TSO is locked to a particular Capability.
- */
-#define TSO_LOCKED 2
-
#define tsoDirty(tso) ((tso)->flags & TSO_DIRTY)
#define tsoLocked(tso) ((tso)->flags & TSO_LOCKED)
StgWord target;
} StgTSOBlockInfo;
+
/*
* TSOs live on the heap, and therefore look just like heap objects.
* Large TSOs will live in their own "block group" allocated by the
StgWord16 why_blocked; /* Values defined in Constants.h */
StgWord32 flags;
StgTSOBlockInfo block_info;
- struct StgTSO_* blocked_exceptions;
StgThreadID id;
int saved_errno;
struct Task_* bound;
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).
+ */
+ struct StgTSO_ * blocked_exceptions;
+
#ifdef TICKY_TICKY
/* TICKY-specific stuff would go here. */
#endif
(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
/* this is the NIL ptr for a TSO queue (e.g. runnable queue) */
-#if IN_STG_CODE
-#define END_TSO_QUEUE (stg_END_TSO_QUEUE_closure)
-#else
#define END_TSO_QUEUE ((StgTSO *)(void*)&stg_END_TSO_QUEUE_closure)
-#endif
#if defined(PAR) || defined(GRAN)
/* this is the NIL ptr for a blocking queue */