[project @ 2004-02-12 02:04:59 by mthomas]
[ghc-hetmet.git] / ghc / includes / SchedAPI.h
1 /* -----------------------------------------------------------------------------
2  * $Id: SchedAPI.h,v 1.19 2003/11/12 17:27:03 sof Exp $
3  *
4  * (c) The GHC Team 1998-2002
5  *
6  * External API for the scheduler.  For most uses, the functions in
7  * RtsAPI.h should be enough.
8  *
9  * ---------------------------------------------------------------------------*/
10
11 #ifndef SCHEDAPI_H
12 #define SCHEDAPI_H
13
14 #if defined(GRAN)
15 // Dummy def for NO_PRI if not in GranSim
16 #define NO_PRI  0
17 #endif
18
19 extern SchedulerStatus waitThread(StgTSO *main_thread, /*out*/StgClosure **ret,
20                                   Capability *initialCapability);
21
22 /* 
23  * Creating threads
24  */
25 #if defined(GRAN)
26 extern StgTSO *createThread(nat stack_size, StgInt pri);
27 #else
28 extern StgTSO *createThread(nat stack_size);
29 #endif
30 #if defined(PAR) || defined(SMP)
31 extern void taskStart(void);
32 #endif
33 extern void scheduleThread(StgTSO *tso);
34 extern SchedulerStatus scheduleWaitThread(StgTSO *tso, /*out*/HaskellObj* ret,
35                                           Capability *initialCapability);
36
37 INLINE_HEADER void pushClosure   (StgTSO *tso, StgWord c) {
38   tso->sp--;
39   tso->sp[0] = (W_) c;
40 }
41
42 INLINE_HEADER StgTSO *
43 createGenThread(nat stack_size,  StgClosure *closure) {
44   StgTSO *t;
45 #if defined(GRAN)
46   t = createThread(stack_size, NO_PRI);
47 #else
48   t = createThread(stack_size);
49 #endif
50   pushClosure(t, (W_)closure);
51   pushClosure(t, (W_)&stg_enter_info);
52   return t;
53 }
54
55 INLINE_HEADER StgTSO *
56 createIOThread(nat stack_size,  StgClosure *closure) {
57   StgTSO *t;
58 #if defined(GRAN)
59   t = createThread(stack_size, NO_PRI);
60 #else
61   t = createThread(stack_size);
62 #endif
63   pushClosure(t, (W_)&stg_noforceIO_info);
64   pushClosure(t, (W_)&stg_ap_v_info);
65   pushClosure(t, (W_)closure);
66   pushClosure(t, (W_)&stg_enter_info);
67   return t;
68 }
69
70 /*
71  * Same as above, but also evaluate the result of the IO action
72  * to whnf while we're at it.
73  */
74
75 INLINE_HEADER StgTSO *
76 createStrictIOThread(nat stack_size,  StgClosure *closure) {
77   StgTSO *t;
78 #if defined(GRAN)
79   t = createThread(stack_size, NO_PRI);
80 #else
81   t = createThread(stack_size);
82 #endif
83   pushClosure(t, (W_)&stg_forceIO_info);
84   pushClosure(t, (W_)&stg_ap_v_info);
85   pushClosure(t, (W_)closure);
86   pushClosure(t, (W_)&stg_enter_info);
87   return t;
88 }
89
90
91 /* 
92  * Killing threads
93  */
94 extern void deleteThread(StgTSO *tso);
95 extern void deleteAllThreads ( void );
96 extern int  howManyThreadsAvail ( void );
97 /*
98  * Run until there are no more threads.
99  */
100 extern void finishAllThreads ( void );
101
102 #endif