FIX BUILD (on Windows): follow changes to make threaded RTS compile with -fasm
[ghc-hetmet.git] / includes / TSO.h
index d096d40..088097e 100644 (file)
@@ -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
@@ -173,6 +159,9 @@ typedef struct StgTSO_ {
 #ifdef DIST
     StgTSODistInfo dist;
 #endif
+#ifdef mingw32_HOST_OS
+    StgWord32 saved_winerror;
+#endif
 
     /* The thread stack... */
     StgWord32         stack_size;     /* stack size in *words* */
@@ -229,16 +218,6 @@ typedef struct StgTSO_ {
       (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 
@@ -262,11 +241,7 @@ extern StgTSO dummy_tso;
 
 
 /* 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 */