[project @ 2005-03-27 13:41:13 by panne]
[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 #if defined(PAR) || defined(SMP)
30 extern void taskStart(void);
31 #endif
32 extern void scheduleThread(StgTSO *tso);
33 extern SchedulerStatus scheduleWaitThread(StgTSO *tso, /*out*/HaskellObj* ret,
34                                           Capability *initialCapability);
35
36 INLINE_HEADER void pushClosure   (StgTSO *tso, StgWord c) {
37   tso->sp--;
38   tso->sp[0] = (W_) c;
39 }
40
41 INLINE_HEADER StgTSO *
42 createGenThread(nat stack_size,  StgClosure *closure) {
43   StgTSO *t;
44 #if defined(GRAN)
45   t = createThread(stack_size, NO_PRI);
46 #else
47   t = createThread(stack_size);
48 #endif
49   pushClosure(t, (W_)closure);
50   pushClosure(t, (W_)&stg_enter_info);
51   return t;
52 }
53
54 INLINE_HEADER StgTSO *
55 createIOThread(nat stack_size,  StgClosure *closure) {
56   StgTSO *t;
57 #if defined(GRAN)
58   t = createThread(stack_size, NO_PRI);
59 #else
60   t = createThread(stack_size);
61 #endif
62   pushClosure(t, (W_)&stg_noforceIO_info);
63   pushClosure(t, (W_)&stg_ap_v_info);
64   pushClosure(t, (W_)closure);
65   pushClosure(t, (W_)&stg_enter_info);
66   return t;
67 }
68
69 /*
70  * Same as above, but also evaluate the result of the IO action
71  * to whnf while we're at it.
72  */
73
74 INLINE_HEADER StgTSO *
75 createStrictIOThread(nat stack_size,  StgClosure *closure) {
76   StgTSO *t;
77 #if defined(GRAN)
78   t = createThread(stack_size, NO_PRI);
79 #else
80   t = createThread(stack_size);
81 #endif
82   pushClosure(t, (W_)&stg_forceIO_info);
83   pushClosure(t, (W_)&stg_ap_v_info);
84   pushClosure(t, (W_)closure);
85   pushClosure(t, (W_)&stg_enter_info);
86   return t;
87 }
88
89
90 /* 
91  * Killing threads
92  */
93 extern void deleteThread(StgTSO *tso);
94 extern void deleteAllThreads ( void );
95 extern int  howManyThreadsAvail ( void );
96 /*
97  * Run until there are no more threads.
98  */
99 extern void finishAllThreads ( void );
100
101 #endif