X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSchedule.h;h=8924a62dac5197994b40c8228d5381e040bc1ab5;hb=6fd47823d987745c6dee66467ad138f8ddcb8446;hp=da4a01022683287bdf2ef76b838750bc053ced1b;hpb=d3581a6a5789da15ab56c11cd02bece49273b41d;p=ghc-hetmet.git diff --git a/ghc/rts/Schedule.h b/ghc/rts/Schedule.h index da4a010..8924a62 100644 --- a/ghc/rts/Schedule.h +++ b/ghc/rts/Schedule.h @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: Schedule.h,v 1.41 2003/10/01 10:57:43 wolfgang Exp $ * * (c) The GHC Team 1998-1999 * @@ -33,10 +32,8 @@ void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node); #elif defined(PAR) void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node); #else -void awakenBlockedQueue(StgTSO *tso); -#if defined(RTS_SUPPORTS_THREADS) -void awakenBlockedQueueNoLock(StgTSO *tso); -#endif +void awakenBlockedQueue (StgTSO *tso); +void awakenBlockedQueueNoLock (StgTSO *tso); #endif /* unblockOne() @@ -63,6 +60,9 @@ StgTSO *unblockOne(StgTSO *tso); void raiseAsync(StgTSO *tso, StgClosure *exception); void raiseAsyncWithLock(StgTSO *tso, StgClosure *exception); +/* raiseExceptionHelper */ +StgWord raiseExceptionHelper (StgTSO *tso, StgClosure *exception); + /* awaitEvent(rtsBool wait) * * Checks for blocked threads that need to be woken. @@ -127,11 +127,11 @@ void initThread(StgTSO *tso, nat stack_size); /* Context switch flag. * Locks required : sched_mutex */ -extern nat context_switch; -extern rtsBool interrupted; +extern nat RTS_VAR(context_switch); +extern rtsBool RTS_VAR(interrupted); /* In Select.c */ -extern nat timestamp; +extern nat RTS_VAR(timestamp); /* Thread queues. * Locks required : sched_mutex @@ -141,25 +141,23 @@ extern nat timestamp; #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; -extern StgTSO *sleeping_queue; +extern StgTSO *RTS_VAR(run_queue_hd), *RTS_VAR(run_queue_tl); +extern StgTSO *RTS_VAR(blocked_queue_hd), *RTS_VAR(blocked_queue_tl); +extern StgTSO *RTS_VAR(sleeping_queue); #endif /* Linked list of all threads. */ -extern StgTSO *all_threads; +extern StgTSO *RTS_VAR(all_threads); #if defined(RTS_SUPPORTS_THREADS) /* Schedule.c has detailed info on what these do */ -extern Mutex sched_mutex; -extern Condition thread_ready_cond; -extern Condition returning_worker_cond; -extern nat rts_n_waiting_workers; -extern nat rts_n_waiting_tasks; +extern Mutex RTS_VAR(sched_mutex); +extern Condition RTS_VAR(returning_worker_cond); +extern nat RTS_VAR(rts_n_waiting_workers); +extern nat RTS_VAR(rts_n_waiting_tasks); #endif StgBool rtsSupportsBoundThreads(void); StgBool isThreadBound(StgTSO *tso); -StgInt forkProcess(HsStablePtr *entry); extern SchedulerStatus rts_mainLazyIO(HaskellObj p, /*out*/HaskellObj *ret); @@ -204,6 +202,7 @@ typedef struct StgMainThread_ { Condition wakeup; #endif #endif + struct StgMainThread_ *prev; struct StgMainThread_ *link; } StgMainThread; @@ -258,17 +257,17 @@ void labelThread(StgPtr tso, char *label); /* Pop the first thread off the runnable queue. */ -#define POP_RUN_QUEUE() \ - ({ StgTSO *t = run_queue_hd; \ - if (t != END_TSO_QUEUE) { \ - run_queue_hd = t->link; \ - t->link = END_TSO_QUEUE; \ +#define POP_RUN_QUEUE(pt) \ + do { StgTSO *__tmp_t = run_queue_hd; \ + if (__tmp_t != END_TSO_QUEUE) { \ + run_queue_hd = __tmp_t->link; \ + __tmp_t->link = END_TSO_QUEUE; \ if (run_queue_hd == END_TSO_QUEUE) { \ run_queue_tl = END_TSO_QUEUE; \ } \ } \ - t; \ - }) + pt = __tmp_t; \ + } while(0) /* Add a thread to the end of the blocked queue. */ @@ -314,4 +313,9 @@ void startSchedulerTaskIfNecessary(void); #endif +#ifdef DEBUG +extern void sched_belch(char *s, ...) + GNU_ATTRIBUTE(format (printf, 1, 2)); +#endif + #endif /* __SCHEDULE_H__ */