X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSchedule.h;h=00b4de17977f02ca76ad7617192e00d74e63493f;hb=be2838643b5497b6257fe645e6e9a99435efac0e;hp=4d8db44aac7ec2b652cd6d5af49410310e3125f1;hpb=30681e796f707fa109aaf756d4586049f595195d;p=ghc-hetmet.git diff --git a/ghc/rts/Schedule.h b/ghc/rts/Schedule.h index 4d8db44..00b4de1 100644 --- a/ghc/rts/Schedule.h +++ b/ghc/rts/Schedule.h @@ -1,13 +1,26 @@ /* ----------------------------------------------------------------------------- - * $Id: Schedule.h,v 1.10 1999/11/09 15:46:55 simonmar Exp $ + * $Id: Schedule.h,v 1.22 2001/03/22 03:51:10 hwloidl Exp $ * * (c) The GHC Team 1998-1999 * * Prototypes for functions in Schedule.c * (RTS internal scheduler interface) * - * ---------------------------------------------------------------------------*/ + * -------------------------------------------------------------------------*/ +//@menu +//* Scheduler Functions:: +//* Scheduler Vars and Data Types:: +//* Some convenient macros:: +//* Index:: +//@end menu + +//@node Scheduler Functions, Scheduler Vars and Data Types +//@subsection Scheduler Functions + +//@cindex initScheduler +//@cindex exitScheduler +//@cindex startTasks /* initScheduler(), exitScheduler(), startTasks() * * Called from STG : no @@ -19,6 +32,7 @@ void exitScheduler( void ); void startTasks( void ); #endif +//@cindex awakenBlockedQueue /* awakenBlockedQueue() * * Takes a pointer to the beginning of a blocked TSO queue, and @@ -27,8 +41,15 @@ void startTasks( void ); * Called from STG : yes * Locks assumed : none */ +#if defined(GRAN) +void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node); +#elif defined(PAR) +void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node); +#else void awakenBlockedQueue(StgTSO *tso); +#endif +//@cindex unblockOne /* unblockOne() * * Takes a pointer to the beginning of a blocked TSO queue, and @@ -37,8 +58,13 @@ void awakenBlockedQueue(StgTSO *tso); * Called from STG : yes * Locks assumed : none */ +#if defined(GRAN) || defined(PAR) +StgBlockingQueueElement *unblockOne(StgBlockingQueueElement *bqe, StgClosure *node); +#else StgTSO *unblockOne(StgTSO *tso); +#endif +//@cindex raiseAsync /* raiseAsync() * * Raises an exception asynchronously in the specified thread. @@ -48,6 +74,7 @@ StgTSO *unblockOne(StgTSO *tso); */ void raiseAsync(StgTSO *tso, StgClosure *exception); +//@cindex awaitEvent /* awaitEvent() * * Raises an exception asynchronously in the specified thread. @@ -57,13 +84,47 @@ void raiseAsync(StgTSO *tso, StgClosure *exception); */ void awaitEvent(rtsBool wait); /* In Select.c */ +/* wakeUpSleepingThreads(nat ticks) + * + * Wakes up any sleeping threads whose timers have expired. + * + * Called from STG : NO + * Locks assumed : sched_mutex + */ +rtsBool wakeUpSleepingThreads(nat); /* In Select.c */ + +// ToDo: check whether all fcts below are used in the SMP version, too +//@cindex awaken_blocked_queue +#if defined(GRAN) +void awaken_blocked_queue(StgBlockingQueueElement *q, StgClosure *node); +void unlink_from_bq(StgTSO* tso, StgClosure* node); +void initThread(StgTSO *tso, nat stack_size, StgInt pri); +#elif defined(PAR) +nat run_queue_len(void); +void awaken_blocked_queue(StgBlockingQueueElement *q, StgClosure *node); +void initThread(StgTSO *tso, nat stack_size); +#else +char *info_type(StgClosure *closure); // dummy +char *info_type_by_ip(StgInfoTable *ip); // dummy +void awaken_blocked_queue(StgTSO *q); +void initThread(StgTSO *tso, nat stack_size); +#endif + +//@node Scheduler Vars and Data Types, Some convenient macros, Scheduler Functions +//@subsection Scheduler Vars and Data Types + +//@cindex context_switch /* Context switch flag. * Locks required : sched_mutex */ extern nat context_switch; +extern rtsBool interrupted; -extern nat ticks_since_select; +/* In Select.c */ +extern nat timestamp; +extern nat ticks_since_timestamp; +//@cindex Capability /* Capability type */ typedef StgRegTable Capability; @@ -80,20 +141,29 @@ extern Capability MainRegTable; /* Thread queues. * Locks required : sched_mutex + * + * In GranSim we have one run/blocked_queue per PE. */ +#if defined(GRAN) +// run_queue_hds defined in GranSim.h +#else extern StgTSO *run_queue_hd, *run_queue_tl; extern StgTSO *blocked_queue_hd, *blocked_queue_tl; - -#ifdef DEBUG -extern void printThreadBlockage(StgTSO *tso); +extern StgTSO *sleeping_queue; #endif +/* Linked list of all threads. */ +extern StgTSO *all_threads; #ifdef SMP +//@cindex sched_mutex +//@cindex thread_ready_cond +//@cindex gc_pending_cond extern pthread_mutex_t sched_mutex; extern pthread_cond_t thread_ready_cond; extern pthread_cond_t gc_pending_cond; #endif +//@cindex task_info #ifdef SMP typedef struct { pthread_t id; @@ -107,13 +177,37 @@ typedef struct { extern task_info *task_ids; #endif +/* Needed by Hugs. + */ +void interruptStgRts ( void ); + +void raiseAsync(StgTSO *tso, StgClosure *exception); +nat run_queue_len(void); + +void resurrectThreads( StgTSO * ); + +//@node Some convenient macros, Index, Scheduler Vars and Data Types +//@subsection Some convenient macros + +/* debugging only + */ +#ifdef DEBUG +void printThreadBlockage(StgTSO *tso); +void printThreadStatus(StgTSO *tso); +void printAllThreads(void); +#endif +void print_bq (StgClosure *node); +#if defined(PAR) +void print_bqe (StgBlockingQueueElement *bqe); +#endif + /* ----------------------------------------------------------------------------- * Some convenient macros... */ -#define END_TSO_QUEUE ((StgTSO *)(void*)&END_TSO_QUEUE_closure) -#define END_CAF_LIST ((StgCAF *)(void*)&END_TSO_QUEUE_closure) +/* END_TSO_QUEUE and friends now defined in includes/StgMiscClosures.h */ +//@cindex APPEND_TO_RUN_QUEUE /* Add a thread to the end of the run queue. * NOTE: tso->link should be END_TSO_QUEUE before calling this macro. */ @@ -126,6 +220,7 @@ extern task_info *task_ids; } \ run_queue_tl = tso; +//@cindex PUSH_ON_RUN_QUEUE /* Push a thread on the beginning of the run queue. Used for * newly awakened threads, so they get run as soon as possible. */ @@ -135,7 +230,8 @@ extern task_info *task_ids; if (run_queue_tl == END_TSO_QUEUE) { \ run_queue_tl = tso; \ } - + +//@cindex POP_RUN_QUEUE /* Pop the first thread off the runnable queue. */ #define POP_RUN_QUEUE() \ @@ -150,6 +246,7 @@ extern task_info *task_ids; t; \ }) +//@cindex APPEND_TO_BLOCKED_QUEUE /* Add a thread to the end of the blocked queue. */ #define APPEND_TO_BLOCKED_QUEUE(tso) \ @@ -161,6 +258,7 @@ extern task_info *task_ids; } \ blocked_queue_tl = tso; +//@cindex THREAD_RUNNABLE /* Signal that a runnable thread has become available, in * case there are any waiting tasks to execute it. */ @@ -174,3 +272,32 @@ extern task_info *task_ids; #define THREAD_RUNNABLE() /* nothing */ #endif +//@cindex EMPTY_RUN_QUEUE +/* Check whether the run queue is empty i.e. the PE is idle + */ +#define EMPTY_RUN_QUEUE() (run_queue_hd == END_TSO_QUEUE) + +//@node Index, , Some convenient macros +//@subsection Index + +//@index +//* APPEND_TO_BLOCKED_QUEUE:: @cindex\s-+APPEND_TO_BLOCKED_QUEUE +//* APPEND_TO_RUN_QUEUE:: @cindex\s-+APPEND_TO_RUN_QUEUE +//* Capability:: @cindex\s-+Capability +//* POP_RUN_QUEUE :: @cindex\s-+POP_RUN_QUEUE +//* PUSH_ON_RUN_QUEUE:: @cindex\s-+PUSH_ON_RUN_QUEUE +//* THREAD_RUNNABLE:: @cindex\s-+THREAD_RUNNABLE +//* awaitEvent:: @cindex\s-+awaitEvent +//* awakenBlockedQueue:: @cindex\s-+awakenBlockedQueue +//* awaken_blocked_queue:: @cindex\s-+awaken_blocked_queue +//* context_switch:: @cindex\s-+context_switch +//* exitScheduler:: @cindex\s-+exitScheduler +//* gc_pending_cond:: @cindex\s-+gc_pending_cond +//* initScheduler:: @cindex\s-+initScheduler +//* raiseAsync:: @cindex\s-+raiseAsync +//* sched_mutex:: @cindex\s-+sched_mutex +//* startTasks:: @cindex\s-+startTasks +//* task_info:: @cindex\s-+task_info +//* thread_ready_cond:: @cindex\s-+thread_ready_cond +//* unblockOne:: @cindex\s-+unblockOne +//@end index