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