1 /* -----------------------------------------------------------------------------
2 * $Id: Schedule.h,v 1.12 2000/01/12 15:15:18 simonmar Exp $
4 * (c) The GHC Team 1998-1999
6 * Prototypes for functions in Schedule.c
7 * (RTS internal scheduler interface)
9 * ---------------------------------------------------------------------------*/
11 /* initScheduler(), exitScheduler(), startTasks()
13 * Called from STG : no
14 * Locks assumed : none
16 void initScheduler( void );
17 void exitScheduler( void );
19 void startTasks( void );
22 /* awakenBlockedQueue()
24 * Takes a pointer to the beginning of a blocked TSO queue, and
25 * wakes up the entire queue.
27 * Called from STG : yes
28 * Locks assumed : none
30 void awakenBlockedQueue(StgTSO *tso);
34 * Takes a pointer to the beginning of a blocked TSO queue, and
35 * removes the first thread, placing it on the runnable queue.
37 * Called from STG : yes
38 * Locks assumed : none
40 StgTSO *unblockOne(StgTSO *tso);
44 * Raises an exception asynchronously in the specified thread.
46 * Called from STG : yes
47 * Locks assumed : none
49 void raiseAsync(StgTSO *tso, StgClosure *exception);
53 * Raises an exception asynchronously in the specified thread.
55 * Called from STG : NO
56 * Locks assumed : sched_mutex
58 void awaitEvent(rtsBool wait); /* In Select.c */
60 /* Context switch flag.
61 * Locks required : sched_mutex
63 extern nat context_switch;
64 extern rtsBool interrupted;
66 extern nat ticks_since_select;
70 typedef StgRegTable Capability;
72 /* Free capability list.
73 * Locks required: sched_mutex.
76 extern Capability *free_capabilities;
77 extern nat n_free_capabilities;
79 extern Capability MainRegTable;
83 * Locks required : sched_mutex
85 extern StgTSO *run_queue_hd, *run_queue_tl;
86 extern StgTSO *blocked_queue_hd, *blocked_queue_tl;
89 extern void printThreadBlockage(StgTSO *tso);
93 extern pthread_mutex_t sched_mutex;
94 extern pthread_cond_t thread_ready_cond;
95 extern pthread_cond_t gc_pending_cond;
101 double elapsedtimestart;
108 extern task_info *task_ids;
113 void interruptStgRts ( void );
115 /* -----------------------------------------------------------------------------
116 * Some convenient macros...
119 #define END_TSO_QUEUE ((StgTSO *)(void*)&END_TSO_QUEUE_closure)
120 #define END_CAF_LIST ((StgCAF *)(void*)&END_TSO_QUEUE_closure)
122 /* Add a thread to the end of the run queue.
123 * NOTE: tso->link should be END_TSO_QUEUE before calling this macro.
125 #define APPEND_TO_RUN_QUEUE(tso) \
126 ASSERT(tso->link == END_TSO_QUEUE); \
127 if (run_queue_hd == END_TSO_QUEUE) { \
128 run_queue_hd = tso; \
130 run_queue_tl->link = tso; \
134 /* Push a thread on the beginning of the run queue. Used for
135 * newly awakened threads, so they get run as soon as possible.
137 #define PUSH_ON_RUN_QUEUE(tso) \
138 tso->link = run_queue_hd; \
139 run_queue_hd = tso; \
140 if (run_queue_tl == END_TSO_QUEUE) { \
141 run_queue_tl = tso; \
144 /* Pop the first thread off the runnable queue.
146 #define POP_RUN_QUEUE() \
147 ({ StgTSO *t = run_queue_hd; \
148 if (t != END_TSO_QUEUE) { \
149 run_queue_hd = t->link; \
150 t->link = END_TSO_QUEUE; \
151 if (run_queue_hd == END_TSO_QUEUE) { \
152 run_queue_tl = END_TSO_QUEUE; \
158 /* Add a thread to the end of the blocked queue.
160 #define APPEND_TO_BLOCKED_QUEUE(tso) \
161 ASSERT(tso->link == END_TSO_QUEUE); \
162 if (blocked_queue_hd == END_TSO_QUEUE) { \
163 blocked_queue_hd = tso; \
165 blocked_queue_tl->link = tso; \
167 blocked_queue_tl = tso;
169 /* Signal that a runnable thread has become available, in
170 * case there are any waiting tasks to execute it.
173 #define THREAD_RUNNABLE() \
174 if (free_capabilities != NULL) { \
175 pthread_cond_signal(&thread_ready_cond); \
179 #define THREAD_RUNNABLE() /* nothing */