X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSchedule.h;h=b2a07e46214d90f3bea65e39833dcbe278a8ec8b;hb=40df40956025fdb4d7d81e89f6c27755a9df8f46;hp=5b0e16beca6dae97371f31e15484855ebffb137a;hpb=5eedab2c787043421b8b86e8f8f26c7404340229;p=ghc-hetmet.git diff --git a/ghc/rts/Schedule.h b/ghc/rts/Schedule.h index 5b0e16b..b2a07e4 100644 --- a/ghc/rts/Schedule.h +++ b/ghc/rts/Schedule.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Schedule.h,v 1.31 2002/03/12 13:57:12 simonmar Exp $ + * $Id: Schedule.h,v 1.38 2003/03/17 14:47:48 simonmar Exp $ * * (c) The GHC Team 1998-1999 * @@ -34,6 +34,9 @@ void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node); void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node); #else void awakenBlockedQueue(StgTSO *tso); +#if defined(RTS_SUPPORTS_THREADS) +void awakenBlockedQueueNoLock(StgTSO *tso); +#endif #endif /* unblockOne() @@ -58,10 +61,11 @@ StgTSO *unblockOne(StgTSO *tso); * Locks assumed : none */ void raiseAsync(StgTSO *tso, StgClosure *exception); +void raiseAsyncWithLock(StgTSO *tso, StgClosure *exception); -/* awaitEvent() +/* awaitEvent(rtsBool wait) * - * Raises an exception asynchronously in the specified thread. + * Checks for blocked threads that need to be woken. * * Called from STG : NO * Locks assumed : sched_mutex @@ -77,6 +81,16 @@ void awaitEvent(rtsBool wait); /* In Select.c */ */ rtsBool wakeUpSleepingThreads(nat); /* In Select.c */ +/* wakeBlockedWorkerThread() + * + * If a worker thread is currently blocked in awaitEvent(), interrupt it. + * + * Called from STG : NO + * Locks assumed : sched_mutex + */ +void wakeBlockedWorkerThread(void); /* In Select.c */ + + /* GetRoots(evac_fn f) * * Call f() for each root known to the scheduler. @@ -135,16 +149,9 @@ extern nat rts_n_waiting_workers; extern nat rts_n_waiting_tasks; #endif +StgInt forkProcess(StgTSO *tso); -/* Sigh, RTS-internal versions of waitThread(), scheduleThread(), and - rts_evalIO() for the use by main() only. ToDo: better. */ -extern SchedulerStatus waitThread_(StgTSO *tso, - /*out*/StgClosure **ret -#if defined(THREADED_RTS) - , rtsBool blockWaiting -#endif - ); -extern SchedulerStatus rts_mainEvalIO(HaskellObj p, /*out*/HaskellObj *ret); +extern SchedulerStatus rts_mainLazyIO(HaskellObj p, /*out*/HaskellObj *ret); /* Called by shutdown_handler(). */ @@ -180,6 +187,10 @@ typedef struct StgMainThread_ { StgClosure ** ret; #if defined(RTS_SUPPORTS_THREADS) Condition wakeup; +#if defined(THREADED_RTS) + rtsBool thread_bound; + Condition bound_thread_cond; +#endif #endif struct StgMainThread_ *link; } StgMainThread; @@ -189,18 +200,22 @@ typedef struct StgMainThread_ { */ extern StgMainThread *main_threads; +void printAllThreads(void); +#ifdef COMPILING_SCHEDULER +static void printThreadBlockage(StgTSO *tso); +static void printThreadStatus(StgTSO *tso); +#endif /* debugging only */ #ifdef DEBUG -void printThreadBlockage(StgTSO *tso); -void printThreadStatus(StgTSO *tso); -void printAllThreads(void); -#endif void print_bq (StgClosure *node); +#endif #if defined(PAR) void print_bqe (StgBlockingQueueElement *bqe); #endif +void labelThread(StgPtr tso, char *label); + /* ----------------------------------------------------------------------------- * Some convenient macros... */ @@ -259,9 +274,7 @@ void print_bqe (StgBlockingQueueElement *bqe); */ #if defined(RTS_SUPPORTS_THREADS) #define THREAD_RUNNABLE() \ - if ( !noCapabilities() ) { \ - signalCondition(&thread_ready_cond); \ - } \ + wakeBlockedWorkerThread(); \ context_switch = 1; #else #define THREAD_RUNNABLE() /* nothing */ @@ -279,4 +292,14 @@ void print_bqe (StgBlockingQueueElement *bqe); EMPTY_BLOCKED_QUEUE() && \ EMPTY_SLEEPING_QUEUE()) +#if defined(RTS_SUPPORTS_THREADS) +/* If no task is waiting for a capability, + * spawn a new worker thread. + * + * (Used by the RtsAPI) + */ +void +startSchedulerTask(void); +#endif + #endif /* __SCHEDULE_H__ */