[project @ 1996-07-25 20:43:49 by partain]
[ghc-hetmet.git] / ghc / includes / Threads.lh
index f08ab9b..f0f88a5 100644 (file)
@@ -9,26 +9,29 @@
 \end{code}
 
 \begin{code}
-#ifndef GRAN 
-#define GRAN_ALLOC_HEAP(n,liveness)                    /* nothing */
-#define GRAN_UNALLOC_HEAP(n,liveness)                  /* nothing */
-#define GRAN_FETCH()                                   /* nothing */
-#define GRAN_FETCH_AND_RESCHEDULE(liveness)            /* nothing */
-#define GRAN_RESCHEDULE(liveness, reenter)             /* nothing */
-#define GRAN_EXEC(arith,branch,loads,stores,floats)    /* nothing */
-#define GRAN_SPARK()                                   /* nothing */
-#endif
-\end{code}
+#if defined(GRAN)
+
+#define sparkq sparkq 
+#define TYPE_OF_SPARK    struct spark
+#define TYPE_OF_SPARK_PTR sparkq
+#define SIZE_OF_SPARK    (sizeof(TYPE_OF_SPARK))
+
+typedef struct spark
+{
+  struct spark *prev, *next;
+  P_ node;
+  I_ name, global;
+  I_ gran_info;
+} *sparkq;
+
+#endif 
 
-\begin{code}
 #ifndef CONCURRENT
 
 #define OR_CONTEXT_SWITCH
 
 #else
 
-#define        DEFAULT_MAX_THREADS             (32)
-
 extern I_ do_gr_sim;                           /* Are we simulating granularity? */
 extern FILE *gr_file;
 
@@ -41,16 +44,10 @@ extern FILE *qp_file;
 #define DO_QP_PROF do_qp_prof
 #endif
 
-extern I_ MaxThreads;
-
 extern I_ context_switch;                      /* Flag set by signal handler */
-extern I_ contextSwitchTime;
-#if defined(USE_COST_CENTRES) || defined(GUM)
-extern I_ contextSwitchTicks;
-#endif
 
-#define CS_MAX_FREQUENCY       100                     /* context switches per second */
-#define CS_MIN_MILLISECS       (1000/CS_MAX_FREQUENCY) /* milliseconds per slice */
+#define CS_MAX_FREQUENCY 100                   /* context switches per second */
+#define CS_MIN_MILLISECS (1000/CS_MAX_FREQUENCY)/* milliseconds per slice */
 
 #ifdef __STG_GCC_REGS__
 #define OR_CONTEXT_SWITCH || context_switch
@@ -62,25 +59,31 @@ extern I_ contextSwitchTicks;
 #define ADVISORY_POOL  1
 #define SPARK_POOLS    2
 
-#ifndef GRAN
+#if !defined(GRAN) 
+
+#define TYPE_OF_SPARK    PP_
+#define SIZE_OF_SPARK    (sizeof(TYPE_OF_SPARK))
 
-extern PP_ PendingSparksBase[SPARK_POOLS], PendingSparksLim[SPARK_POOLS];
-extern PP_ PendingSparksHd[SPARK_POOLS], PendingSparksTl[SPARK_POOLS];
+extern TYPE_OF_SPARK PendingSparksBase[SPARK_POOLS], 
+                     PendingSparksLim[SPARK_POOLS];
+extern TYPE_OF_SPARK PendingSparksHd[SPARK_POOLS], 
+                     PendingSparksTl[SPARK_POOLS];
 
 extern I_ SparkLimit[SPARK_POOLS];
 
 extern P_ RunnableThreadsHd, RunnableThreadsTl;
 extern P_ WaitingThreadsHd, WaitingThreadsTl;
 
-#define DEFAULT_MAX_LOCAL_SPARKS 100
-
-extern I_ MaxLocalSparks;
+extern I_ sparksIgnored;
 
 IF_RTS(extern void AwaitEvent(I_);)
 
 #else /* GRAN */
 
-extern sparkq PendingSparksHd[][SPARK_POOLS], PendingSparksTl[][SPARK_POOLS];
+extern TYPE_OF_SPARK_PTR PendingSparksBase[][SPARK_POOLS], 
+                         PendingSparksLim[][SPARK_POOLS];
+extern TYPE_OF_SPARK_PTR PendingSparksHd[][SPARK_POOLS], 
+                         PendingSparksTl[][SPARK_POOLS];
 extern P_ RunnableThreadsHd[], RunnableThreadsTl[],
           WaitThreadsHd[], WaitThreadsTl[];
 
@@ -95,7 +98,7 @@ extern P_ RunnableThreadsHd[], RunnableThreadsTl[],
 
 IF_RTS(extern void PruneSparks(STG_NO_ARGS);)
 
-#ifdef GRAN
+#if defined(GRAN)
 
 /* Codes that can be used as params for ReSchedule */
 /* I distinguish them from the values 0/1 in the -UGRAN setup for security */
@@ -104,179 +107,23 @@ IF_RTS(extern void PruneSparks(STG_NO_ARGS);)
 #define SAME_THREAD    11
 #define NEW_THREAD     SAME_THREAD
 #define CHANGE_THREAD  13
+#define END_OF_WORLD    14
 
-#define MAX_PROC (BITS_IN(W_))                 /* Maximum number of PEs that can be simulated */
-extern W_ max_proc;
-
-extern W_ IdleProcs, Idlers; 
-
-extern unsigned CurrentProc;
-extern W_ CurrentTime[];
 extern W_ SparksAvail, SurplusThreads;
 
-/* Processor numbers to bitmasks and vice-versa */
-#define MainProc            0
-
-#define PE_NUMBER(n)          (1l << (long)n)
-#define ThisPE               PE_NUMBER(CurrentProc)
-#define MainPE               PE_NUMBER(MainProc)
-
-#define IS_LOCAL_TO(ga,proc)  ((1l << (long) proc) & ga)
-
-/* These constants should eventually be program parameters */
-
-/* Communication Cost Model (EDS-like), max_proc > 2. */
-
-#define LATENCY                           1000 /* Latency for single packet */
-#define ADDITIONAL_LATENCY         100 /* Latency for additional packets */
-#define BASICBLOCKTIME              10
-#define FETCHTIME              (LATENCY*2+MSGUNPACKTIME)
-#define LOCALUNBLOCKTIME            10
-#define GLOBALUNBLOCKTIME      (LATENCY+MSGUNPACKTIME)
-
-extern W_ gran_latency, gran_additional_latency, gran_fetchtime, 
-          gran_lunblocktime, gran_gunblocktime;
-
-#define        MSGPACKTIME                  0  /* Cost of creating a packet */
-#define        MSGUNPACKTIME                0  /* Cost of receiving a packet */
-
-extern W_ gran_mpacktime, gran_mtidytime, gran_munpacktime;
-
-/* Thread cost model */
-#define THREADCREATETIME          (25+THREADSCHEDULETIME)
-#define THREADQUEUETIME                    12  /* Cost of adding a thread to the running/runnable queue */
-#define THREADDESCHEDULETIME       75  /* Cost of descheduling a thread */
-#define THREADSCHEDULETIME         75  /* Cost of scheduling a thread */
-#define THREADCONTEXTSWITCHTIME            (THREADDESCHEDULETIME+THREADSCHEDULETIME)
-
-extern W_ gran_threadcreatetime, gran_threadqueuetime, 
-          gran_threadscheduletime, gran_threaddescheduletime, 
-          gran_threadcontextswitchtime;
-
-/* Instruction Cost model (SPARC, including cache misses) */
-#define ARITH_COST                1
-#define BRANCH_COST               2
-#define LOAD_COST                 4
-#define STORE_COST                4
-#define FLOAT_COST                1 /* ? */
-
-extern W_ gran_arith_cost, gran_branch_cost, 
-          gran_load_cost, gran_store_cost, gran_float_cost,
-          gran_heapalloc_cost;
-
-/* Miscellaneous Parameters */
-extern I_ DoFairSchedule;
-extern I_ DoReScheduleOnFetch;
-extern I_ SimplifiedFetch;
-extern I_ DoStealThreadsFirst;
-extern I_ DoAlwaysCreateThreads;
-extern I_ DoThreadMigration;
-extern I_ DoGUMMFetching;
-extern I_ FetchStrategy;
-extern I_ PreferSparksOfLocalNodes;
-/* These come from debug options -bD? */
-extern I_ NoForward;
-extern I_ PrintFetchMisses, fetch_misses;
-#if defined(COUNT)
-extern I_ nUPDs, nUPDs_old, nUPDs_new, nUPDs_BQ, nPAPs, BQ_lens;
-#endif
-
-extern I_ do_gr_binary;
-extern I_ do_gr_profile;
-extern I_ no_gr_profile;
-extern I_ do_sp_profile;
-
-extern I_ NeedToReSchedule;
-
-extern void GranSimAllocate                PROTO((I_, P_, W_));
-extern void GranSimUnAllocate              PROTO((I_, P_, W_));
-extern I_   GranSimFetch                   PROTO((P_));
-extern void GranSimExec                    PROTO((W_,W_,W_,W_,W_));
-extern void GranSimSpark                   PROTO((W_,P_));
-extern void GranSimBlock                   PROTO(());
-extern void PerformReschedule              PROTO((W_, W_));
-
-#if 0   /* 'ngo Dochmey */
-
-#define GRAN_ALLOC_HEAP(n,liveness)       STGCALL3(void,(),GranSimAllocate,n,0,0)
-#define GRAN_UNALLOC_HEAP(n,liveness)     STGCALL3(void,(),GranSimUnallocate,n,0,0)
-
-#define GRAN_FETCH()                      STGCALL1(I_,(),GranSimFetch,Node)
-
-#define GRAN_FETCH_AND_RESCHEDULE(liveness_mask)       \
-       do { if(liveness_mask&LIVENESS_R1)  \
-             STGCALL1(I_,(),GranSimFetch,Node); \
-            GRAN_RESCHEDULE(liveness_mask,1);  \
-          } while(0)
-
-#define GRAN_RESCHEDULE(liveness_mask,reenter) \
-        STGCALL2_GC(void,(),     \
-                PerformReschedule,liveness_mask,reenter)
-
-#define THREAD_CONTEXT_SWITCH(liveness_mask,reenter)   \
-        do { \
-       if (context_switch /* OR_INTERVAL_EXPIRED */) { \
-          GRAN_RESCHEDULE(liveness_mask,reenter); \
-        } }while(0)
-
-#define GRAN_EXEC(arith,branch,load,store,floats)      \
-                                       STGCALL5(void,(),GranSimExec,arith,branch,load,store,floats)
-
-
-#else  /* 1 */ /* chu' Dochmey */
-
-#define GRAN_ALLOC_HEAP(n,liveness)       \
-       SaveAllStgRegs();                  \
-       GranSimAllocate(n,0,0);            \
-       RestoreAllStgRegs();
-
-#define GRAN_UNALLOC_HEAP(n,liveness)     \
-       SaveAllStgRegs();                  \
-       GranSimUnallocate(n,0,0);          \
-       RestoreAllStgRegs();
-
-#define GRAN_FETCH()                      \
-       SaveAllStgRegs();                  \
-       GranSimFetch(Node);                \
-       RestoreAllStgRegs();
-
-#define GRAN_FETCH_AND_RESCHEDULE(liveness_mask)       \
-       do { if(liveness_mask&LIVENESS_R1)              \
-            SaveAllStgRegs();                  \
-             GranSimFetch(Node);                       \
-            RestoreAllStgRegs();                       \
-            GRAN_RESCHEDULE(liveness_mask,1);          \
-          } while(0)
-
-#define GRAN_RESCHEDULE(liveness_mask,reenter) \
-        PerformReschedule_wrapper(liveness_mask,reenter)
-
-#define THREAD_CONTEXT_SWITCH(liveness_mask,reenter)   \
-        do { \
-       if (context_switch /* OR_INTERVAL_EXPIRED */) { \
-          GRAN_RESCHEDULE(liveness_mask,reenter); \
-        } }while(0)
-
-#define GRAN_EXEC(arith,branch,load,store,floats)      \
-       SaveAllStgRegs();                               \
-       GranSimExec(arith,branch,load,store,floats);    \
-       RestoreAllStgRegs();
-
-#endif
-       
+extern W_ CurrentTime[];
+extern I_ OutstandingFetches[], OutstandingFishes[];
+extern enum proc_status procStatus[];
 
-#define ADD_TO_SPARK_QUEUE(spark)                      \
-    SPARK_NEXT(spark) = NULL;                          \
-    SPARK_PREV(spark) = PendingSparksTl[CurrentProc][ADVISORY_POOL];   \
-    if (PendingSparksHd[CurrentProc][ADVISORY_POOL] == NULL)           \
-       PendingSparksHd[CurrentProc][ADVISORY_POOL] = spark;            \
-    else                                               \
-       SPARK_NEXT(PendingSparksTl[CurrentProc][ADVISORY_POOL]) = spark;        \
-    PendingSparksTl[CurrentProc][ADVISORY_POOL] = spark;               \
+#  if defined(GRAN_CHECK) && defined(GRAN) /* Just for testing */
+# define FETCH_MASK_TSO  0x08000000      /* only bits 0, 1, 2 should be used */
+                                        /* normally */
+extern P_ BlockedOnFetch[];
+#  endif
 
 #endif     /* GRAN */
 
-extern P_ CurrentTSO;                          /* thread state object now in use */
+extern P_ CurrentTSO;                   /* thread state object now in use */
 
 extern P_ AvailableStack;
 extern P_ AvailableTSO;
@@ -284,13 +131,26 @@ extern P_ AvailableTSO;
 extern I_ threadId;
 
 void ScheduleThreads PROTO((P_ topClosure));
+
 #if defined(GRAN)
 void ReSchedule PROTO((int what_next)) STG_NORETURN;
-#else
+void add_to_spark_queue PROTO((sparkq));
+int set_sparkname PROTO((P_, int));
+int reset_sparkname PROTO((P_)); 
+I_ spark_queue_len PROTO((PROC, I_));
+sparkq delete_from_spark_queue PROTO((sparkq, sparkq));
+I_ thread_queue_len PROTO((PROC));
+void DisposeSparkQ PROTO((sparkq));
+
+#else /* !GRAN */
+
 void ReSchedule PROTO((int again)) STG_NORETURN;
+
 #endif
+
 void EndThread(STG_NO_ARGS) STG_NORETURN;
 
+/* ToDo: Check if these are still needed -- HWL */
 void QP_Event0 PROTO((I_, P_));
 void QP_Event1 PROTO((char *, P_));
 void QP_Event2 PROTO((char *, P_, P_));
@@ -336,14 +196,15 @@ table for those values).
 \begin{code}
 #define TSO_INFO_WORDS 10
 
-#ifdef DO_REDN_COUNTING
+#ifdef TICKY_TICKY
 #define TSO_REDN_WORDS 2
 #else
 #define TSO_REDN_WORDS 0
 #endif
 
 #if defined(GRAN) || defined(PAR)
-#define TSO_GRAN_WORDS 15
+           /* do we really need a whole statistics buffer in PAR setup? HWL*/
+#define TSO_GRAN_WORDS 17
 #else
 #define TSO_GRAN_WORDS 0
 #endif
@@ -375,7 +236,7 @@ table for those values).
 #define TSO_SWITCH_LOCN                (TSO_INFO_START + 9)
 
 #define TSO_REDN_START         (TSO_INFO_START + TSO_INFO_WORDS)
-#ifdef DO_REDN_COUNTING
+#ifdef TICKY_TICKY
 #define TSO_AHWM_LOCN          (TSO_REDN_START + 0)
 #define TSO_BHWM_LOCN          (TSO_REDN_START + 1)
 #endif
@@ -397,6 +258,8 @@ table for those values).
 #define TSO_GLOBALSPARKS_LOCN          (TSO_GRAN_START + 12)
 #define TSO_LOCALSPARKS_LOCN           (TSO_GRAN_START + 13)
 #define TSO_QUEUE_LOCN         (TSO_GRAN_START + 14)
+#define TSO_PRI_LOCN           (TSO_GRAN_START + 15)
+#define TSO_CLOCK_LOCN         (TSO_GRAN_START + 16)
 #endif
 
 #define TSO_LINK(closure)          (((PP_)closure)[TSO_LINK_LOCN])
@@ -428,6 +291,9 @@ table for those values).
 #define TSO_GLOBALSPARKS(closure)   (((P_)closure)[TSO_GLOBALSPARKS_LOCN])
 #define TSO_LOCALSPARKS(closure)    (((P_)closure)[TSO_LOCALSPARKS_LOCN])
 #define TSO_QUEUE(closure)         (((P_)closure)[TSO_QUEUE_LOCN])
+#define TSO_PRI(closure)           (((P_)closure)[TSO_PRI_LOCN])
+/* TSO_CLOCK is only needed in GrAnSim-Light */
+#define TSO_CLOCK(closure)         (((P_)closure)[TSO_CLOCK_LOCN])
 
 #define TSO_INTERNAL_PTR(closure)          \
   ((STGRegisterTable *)(((W_)(((P_)closure) \
@@ -454,7 +320,7 @@ The types of threads (TSO_TYPE):
 The total space required to start a new thread (See NewThread in
 Threads.lc):
 \begin{code}
-#define THREAD_SPACE_REQUIRED (TSO_HS + TSO_CTS_SIZE + STKO_HS + StkOChunkSize)
+#define THREAD_SPACE_REQUIRED (TSO_HS + TSO_CTS_SIZE + STKO_HS + RTSflags.ConcFlags.stkChunkSize)
 \end{code}
 
 Here are the various queues for GrAnSim-type events.
@@ -463,6 +329,7 @@ Here are the various queues for GrAnSim-type events.
 #define Q_RUNNABLE  'A'
 #define Q_BLOCKED   'R'
 #define Q_FETCHING  'Y'
+#define Q_MIGRATING 'B'
 \end{code}
 
 %************************************************************************
@@ -472,35 +339,45 @@ Here are the various queues for GrAnSim-type events.
 %************************************************************************
 
 \begin{code}
-#ifdef GUM
+#ifdef PAR
 
 P_ FindLocalSpark PROTO((rtsBool forexport));
 
 void DisposeSpark PROTO((P_ spark));
 rtsBool Spark PROTO((P_ closure, rtsBool required));
 
-#endif /*GUM*/
+#endif /*PAR*/
 
 #ifdef GRAN   /* For GrAnSim sparks are currently mallocated -- HWL */
 
 void DisposeSpark PROTO((sparkq spark));
+sparkq NewSpark PROTO((P_,I_,I_,I_,I_,I_));
 
-# define MAX_SPARKS            2000  /* For GC Roots Purposes */
-# if defined(GRAN_TNG)
-extern sparkq NewSpark         PROTO((P_,I_,I_,I_));
-# else /* !GRAN_TNG */
-extern sparkq NewSpark         PROTO((P_,I_,I_));
-# endif  /* GRAN_TNG */
+/* # define MAX_EVENTS         1000 */  /* For GC Roots Purposes */
+# define MAX_SPARKS            0        /* i.e. infinite */
 
+#if defined(GRAN_JSM_SPARKS)
+/* spark is a pointer into some sparkq (which is for JSM sparls just an 
+   array of (struct sparks) */
+
+# define SPARK_PREV(spark)     { fprintf(stderr,"Error: SPARK_PREV not supported for JSM sparks") \
+                                  EXIT(EXIT_FAILURE); }
+/* NB: SPARK_NEXT may only be used as a rhs but NOT as a lhs */
+# define SPARK_NEXT(spark)     (spark++)
+# define SPARK_NODE(spark)     (P_)(spark->node)
+# define SPARK_NAME(spark)     (spark->name)
+# define SPARK_GRAN_INFO(spark) (spark->gran_info)
+# define SPARK_GLOBAL(spark)   (spark->global)
+# define SPARK_EXPORTED(spark) (SPARK_GLOBAL(spark) > 1)
+#else
 # define SPARK_PREV(spark)     (spark->prev)
 # define SPARK_NEXT(spark)     (sparkq)(spark->next)
-# define SPARK_NODE(spark)     (P_)(spark->node)
+# define SPARK_NODE(spark)     (spark->node)
 # define SPARK_NAME(spark)     (spark->name)
-# if defined(GRAN_TNG)
-#  define SPARK_GRAN_INFO(spark) (spark->gran_info)
-# endif  /* GRAN_TNG */
+# define SPARK_GRAN_INFO(spark) (spark->gran_info)
 # define SPARK_GLOBAL(spark)   (spark->global)
 # define SPARK_EXPORTED(spark) (SPARK_GLOBAL(spark) > 1)
+#endif
 
 #endif      /* GRAN */
 \end{code}
@@ -559,19 +436,15 @@ From a storage-manager point of view, these are {\em very special}
 objects.
 
 \begin{code}
-#ifdef DO_REDN_COUNTING
+#ifdef TICKY_TICKY
 #define STKO_VHS       (GC_MUT_RESERVED_WORDS + 9)
 #else
 #define STKO_VHS       (GC_MUT_RESERVED_WORDS + 7)
 #endif
 #define STKO_HS                (FIXED_HS + STKO_VHS)
 
-#define DEFAULT_STKO_CHUNK_SIZE        1024
-
 #define MIN_STKO_CHUNK_SIZE 16 /* Rather arbitrary */
 
-extern I_ StkOChunkSize;
-
 #define STKO_CLOSURE_SIZE(closure)     STKO_SIZE(closure)
 
 #define STKO_CLOSURE_CTS_SIZE(closure) (STKO_CLOSURE_SIZE(closure) - STKO_VHS)
@@ -594,7 +467,7 @@ extern I_ StkOChunkSize;
          to debug things.
  */
 
-#ifdef DO_REDN_COUNTING
+#ifdef TICKY_TICKY
 #define STKO_ADEP_LOCN      (STKO_HS - 9)
 #define STKO_BDEP_LOCN      (STKO_HS - 8)
 #endif
@@ -762,7 +635,7 @@ The special info table used for stack objects (STKOs).
        INCLUDE_TYPE_INFO(STKO_STATIC)                          \
        INCLUDE_SIZE_INFO(INFO_UNUSED,INFO_UNUSED)              \
        INCLUDE_PAR_INFO                                        \
-       INCLUDE_COPYING_INFO(_Evacuate_Static,_Scavenge_Static) \
+       INCLUDE_COPYING_INFO(_Evacuate_Static,_Dummy_Static_entry) \
        INCLUDE_COMPACTING_INFO(_Dummy_Static_entry,_PRStart_Static, \
                                _Dummy_Static_entry,_PRIn_Error)    \
     }