enable the x86-specific versions of atomic_inc()/atomic_dec()
[ghc-hetmet.git] / includes / TSO.h
index 3f7923d..af624f7 100644 (file)
@@ -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 */