diff options
author | Simon Marlow <simonmar@microsoft.com> | 2006-06-16 10:33:42 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2006-06-16 10:33:42 +0000 |
commit | b1953bbb1ed3cb16497e5447db7487f0c2d9e41a (patch) | |
tree | df9e129c57b586a952634dc080939b621ae64cf8 /includes/TSO.h | |
parent | 1e3d53b4707a6c9c7c99cdaa54e3646b840f5cc9 (diff) | |
download | haskell-b1953bbb1ed3cb16497e5447db7487f0c2d9e41a.tar.gz |
Asynchronous exception support for SMP
This patch makes throwTo work with -threaded, and also refactors large
parts of the concurrency support in the RTS to clean things up. We
have some new files:
RaiseAsync.{c,h} asynchronous exception support
Threads.{c,h} general threading-related utils
Some of the contents of these new files used to be in Schedule.c,
which is smaller and cleaner as a result of the split.
Asynchronous exception support in the presence of multiple running
Haskell threads is rather tricky. In fact, to my annoyance there are
still one or two bugs to track down, but the majority of the tests run
now.
Diffstat (limited to 'includes/TSO.h')
-rw-r--r-- | includes/TSO.h | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/includes/TSO.h b/includes/TSO.h index d096d401cf..0c3e4eec38 100644 --- a/includes/TSO.h +++ b/includes/TSO.h @@ -77,27 +77,6 @@ typedef StgTSOStatBuf StgTSOGranInfo; */ 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) @@ -127,6 +106,7 @@ typedef union { 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 @@ -151,13 +131,19 @@ typedef struct StgTSO_ { 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 |