X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FSchedAPI.h;h=565ed202319bb0481082d01c1459fb49ca9403ac;hb=821d799485702aa76b393cecf3e2eb32381eb5df;hp=27745272da6c5f03819eb1ad777278c140cfd390;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/includes/SchedAPI.h b/ghc/includes/SchedAPI.h index 2774527..565ed20 100644 --- a/ghc/includes/SchedAPI.h +++ b/ghc/includes/SchedAPI.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: SchedAPI.h,v 1.2 1998/12/02 13:21:33 simonm Exp $ + * $Id: SchedAPI.h,v 1.15 2002/06/19 20:45:17 sof Exp $ * * (c) The GHC Team 1998 * @@ -11,25 +11,26 @@ #ifndef SCHEDAPI_H #define SCHEDAPI_H -/* - * Running the scheduler - */ +#if defined(GRAN) +// Dummy def for NO_PRI if not in GranSim +#define NO_PRI 0 +#endif -typedef enum { - Success, - Killed, /* another thread killed us */ - Interrupted, /* stopped in response to a call to interruptStgRts */ - Deadlock, - AllBlocked, /* subtly different from Deadlock */ -} SchedulerStatus; - -SchedulerStatus schedule(StgTSO *main_thread, /*out*/StgClosure **ret); +extern SchedulerStatus waitThread(StgTSO *main_thread, /*out*/StgClosure **ret); /* - * Creating thraeds + * Creating threads */ - -StgTSO *createThread (nat stack_size); +#if defined(GRAN) +extern StgTSO *createThread(nat stack_size, StgInt pri); +#else +extern StgTSO *createThread(nat stack_size); +#endif +#if defined(PAR) || defined(SMP) +extern void taskStart(void); +#endif +extern void scheduleThread(StgTSO *tso); +extern SchedulerStatus scheduleWaitThread(StgTSO *tso, /*out*/HaskellObj* ret); static inline void pushClosure (StgTSO *tso, StgClosure *c) { tso->sp--; @@ -43,7 +44,11 @@ static inline void pushRealWorld (StgTSO *tso) { static inline StgTSO * createGenThread(nat stack_size, StgClosure *closure) { StgTSO *t; +#if defined(GRAN) + t = createThread(stack_size, NO_PRI); +#else t = createThread(stack_size); +#endif pushClosure(t,closure); return t; } @@ -51,22 +56,49 @@ createGenThread(nat stack_size, StgClosure *closure) { static inline StgTSO * createIOThread(nat stack_size, StgClosure *closure) { StgTSO *t; +#if defined(GRAN) + t = createThread(stack_size, NO_PRI); +#else t = createThread(stack_size); +#endif pushRealWorld(t); pushClosure(t,closure); return t; } +/* + * Same as above, but also evaluate the result of the IO action + * to whnf while we're at it. + */ + +static inline StgTSO * +createStrictIOThread(nat stack_size, StgClosure *closure) { + StgTSO *t; +#if defined(GRAN) + t = createThread(stack_size, NO_PRI); +#else + t = createThread(stack_size); +#endif + pushClosure(t,closure); + pushClosure(t,(StgClosure*)&stg_forceIO_closure); + return t; +} + + /* * Killing threads */ - -void deleteThread(StgTSO *tso); +extern void deleteThread(StgTSO *tso); +extern void deleteAllThreads ( void ); +extern int howManyThreadsAvail ( void ); +/* + * Run until there are no more threads. + */ +extern void finishAllThreads ( void ); /* * Reverting CAFs */ - -void RevertCAFs(void); +extern void RevertCAFs ( void ); #endif