X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2FTSO.h;h=af624f76667a14b86b5339056a3a3fb7306ad438;hb=1b6914d8a2ad53353651acf62a21a305e9b83876;hp=3f7923d5daf50038832c572a3e699c149bc650a3;hpb=69d5d3266dab36d9bfbe7da8ca9e077619516809;p=ghc-hetmet.git diff --git a/includes/TSO.h b/includes/TSO.h index 3f7923d..af624f7 100644 --- a/includes/TSO.h +++ b/includes/TSO.h @@ -33,16 +33,6 @@ typedef struct { } 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 { @@ -50,25 +40,6 @@ 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. */ @@ -96,6 +67,7 @@ typedef struct { } StgAsyncIOResult; #endif +/* Reason for thread being blocked. See comment above struct StgTso_. */ typedef union { StgClosure *closure; struct StgTSO_ *tso; @@ -113,7 +85,7 @@ typedef union { * 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 @@ -124,7 +96,21 @@ typedef union { 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 */ @@ -137,7 +123,7 @@ typedef struct StgTSO_ { 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). @@ -150,14 +136,8 @@ typedef struct StgTSO_ { #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... */ @@ -169,6 +149,13 @@ typedef struct StgTSO_ { } 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: @@ -217,7 +204,7 @@ typedef struct StgTSO_ { 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 @@ -236,16 +223,7 @@ extern StgTSO dummy_tso; #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 */