X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FSchedAPI.h;h=07fe613f6d3245d10cd0453afb0db3abecb28482;hb=09e2c3a13ed67e2ab69a8e0a3eaa608e19713521;hp=014f906e3440c1b9e8c74fb86317ba2e8d7c5922;hpb=64b08aae7989c2a26a0981df5ca6c3e30b49aee1;p=ghc-hetmet.git diff --git a/ghc/includes/SchedAPI.h b/ghc/includes/SchedAPI.h index 014f906..07fe613 100644 --- a/ghc/includes/SchedAPI.h +++ b/ghc/includes/SchedAPI.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- - * $Id: SchedAPI.h,v 1.4 1999/06/03 08:09:31 sof Exp $ + * $Id: SchedAPI.h,v 1.19 2003/11/12 17:27:03 sof Exp $ * - * (c) The GHC Team 1998 + * (c) The GHC Team 1998-2002 * * External API for the scheduler. For most uses, the functions in * RtsAPI.h should be enough. @@ -11,49 +11,59 @@ #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, + Capability *initialCapability); /* * Creating threads */ +#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, + Capability *initialCapability); -StgTSO *createThread (nat stack_size); - -static inline void pushClosure (StgTSO *tso, StgClosure *c) { +INLINE_HEADER void pushClosure (StgTSO *tso, StgWord c) { tso->sp--; tso->sp[0] = (W_) c; } -static inline void pushRealWorld (StgTSO *tso) { - tso->sp--; - tso->sp[0] = (W_) REALWORLD_TAG; -} -static inline StgTSO * +INLINE_HEADER StgTSO * createGenThread(nat stack_size, StgClosure *closure) { StgTSO *t; +#if defined(GRAN) + t = createThread(stack_size, NO_PRI); +#else t = createThread(stack_size); - pushClosure(t,closure); +#endif + pushClosure(t, (W_)closure); + pushClosure(t, (W_)&stg_enter_info); return t; } -static inline StgTSO * +INLINE_HEADER StgTSO * createIOThread(nat stack_size, StgClosure *closure) { StgTSO *t; +#if defined(GRAN) + t = createThread(stack_size, NO_PRI); +#else t = createThread(stack_size); - pushRealWorld(t); - pushClosure(t,closure); +#endif + pushClosure(t, (W_)&stg_noforceIO_info); + pushClosure(t, (W_)&stg_ap_v_info); + pushClosure(t, (W_)closure); + pushClosure(t, (W_)&stg_enter_info); return t; } @@ -62,12 +72,18 @@ createIOThread(nat stack_size, StgClosure *closure) { * to whnf while we're at it. */ -static inline StgTSO * +INLINE_HEADER StgTSO * createStrictIOThread(nat stack_size, StgClosure *closure) { StgTSO *t; +#if defined(GRAN) + t = createThread(stack_size, NO_PRI); +#else t = createThread(stack_size); - pushClosure(t,closure); - pushClosure(t,(StgClosure*)&forceIO_closure); +#endif + pushClosure(t, (W_)&stg_forceIO_info); + pushClosure(t, (W_)&stg_ap_v_info); + pushClosure(t, (W_)closure); + pushClosure(t, (W_)&stg_enter_info); return t; } @@ -75,13 +91,12 @@ createStrictIOThread(nat stack_size, StgClosure *closure) { /* * Killing threads */ - -void deleteThread(StgTSO *tso); - +extern void deleteThread(StgTSO *tso); +extern void deleteAllThreads ( void ); +extern int howManyThreadsAvail ( void ); /* - * Reverting CAFs + * Run until there are no more threads. */ - -void RevertCAFs(void); +extern void finishAllThreads ( void ); #endif