Cope with libraries in libraries/foo/bar rather than just libraries/foo
[ghc-hetmet.git] / includes / RtsAPI.h
1 /* ----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 1998-2004
4  *
5  * API for invoking Haskell functions via the RTS
6  *
7  * --------------------------------------------------------------------------*/
8
9 #ifndef RTSAPI_H
10 #define RTSAPI_H
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 #include "HsFFI.h"
17
18 /*
19  * Running the scheduler
20  */
21 typedef enum {
22     NoStatus,    /* not finished yet */
23     Success,     /* completed successfully */
24     Killed,      /* uncaught exception */
25     Interrupted  /* stopped in response to a call to interruptStgRts */
26 } SchedulerStatus;
27
28 typedef StgClosure *HaskellObj;
29
30 /*
31  * An abstract type representing the token returned by rts_lock() and
32  * used when allocating objects and threads in the RTS.
33  */
34 typedef struct Capability_ Capability;
35
36 /* ----------------------------------------------------------------------------
37    Starting up and shutting down the Haskell RTS.
38    ------------------------------------------------------------------------- */
39 extern void startupHaskell         ( int argc, char *argv[], 
40                                      void (*init_root)(void) );
41 extern void shutdownHaskell        ( void );
42 extern void shutdownHaskellAndExit ( int exitCode );
43 extern void getProgArgv            ( int *argc, char **argv[] );
44 extern void setProgArgv            ( int argc, char *argv[] );
45 extern void getFullProgArgv        ( int *argc, char **argv[] );
46 extern void setFullProgArgv        ( int argc, char *argv[] );
47
48 /* exit() override */
49 extern void (*exitFn)(int);
50
51 /* ----------------------------------------------------------------------------
52    Locking.
53    
54    You have to surround all access to the RtsAPI with these calls.
55    ------------------------------------------------------------------------- */
56    
57 // acquires a token which may be used to create new objects and
58 // evaluate them.
59 Capability *rts_lock (void);
60
61 // releases the token acquired with rts_lock().
62 void rts_unlock (Capability *token);
63
64 /* ----------------------------------------------------------------------------
65    Building Haskell objects from C datatypes.
66    ------------------------------------------------------------------------- */
67 HaskellObj   rts_mkChar       ( Capability *, HsChar   c );
68 HaskellObj   rts_mkInt        ( Capability *, HsInt    i );
69 HaskellObj   rts_mkInt8       ( Capability *, HsInt8   i );
70 HaskellObj   rts_mkInt16      ( Capability *, HsInt16  i );
71 HaskellObj   rts_mkInt32      ( Capability *, HsInt32  i );
72 HaskellObj   rts_mkInt64      ( Capability *, HsInt64  i );
73 HaskellObj   rts_mkWord       ( Capability *, HsWord   w );
74 HaskellObj   rts_mkWord8      ( Capability *, HsWord8  w );
75 HaskellObj   rts_mkWord16     ( Capability *, HsWord16 w );
76 HaskellObj   rts_mkWord32     ( Capability *, HsWord32 w );
77 HaskellObj   rts_mkWord64     ( Capability *, HsWord64 w );
78 HaskellObj   rts_mkPtr        ( Capability *, HsPtr    a );
79 HaskellObj   rts_mkFunPtr     ( Capability *, HsFunPtr a );
80 HaskellObj   rts_mkFloat      ( Capability *, HsFloat  f );
81 HaskellObj   rts_mkDouble     ( Capability *, HsDouble f );
82 HaskellObj   rts_mkStablePtr  ( Capability *, HsStablePtr s );
83 HaskellObj   rts_mkBool       ( Capability *, HsBool   b );
84 HaskellObj   rts_mkString     ( Capability *, char    *s );
85
86 HaskellObj   rts_apply        ( Capability *, HaskellObj, HaskellObj );
87
88 /* ----------------------------------------------------------------------------
89    Deconstructing Haskell objects
90    ------------------------------------------------------------------------- */
91 HsChar       rts_getChar      ( HaskellObj );
92 HsInt        rts_getInt       ( HaskellObj );
93 HsInt8       rts_getInt8      ( HaskellObj );
94 HsInt16      rts_getInt16     ( HaskellObj );
95 HsInt32      rts_getInt32     ( HaskellObj );
96 HsInt64      rts_getInt64     ( HaskellObj );
97 HsWord       rts_getWord      ( HaskellObj );
98 HsWord8      rts_getWord8     ( HaskellObj );
99 HsWord16     rts_getWord16    ( HaskellObj );
100 HsWord32     rts_getWord32    ( HaskellObj );
101 HsWord64     rts_getWord64    ( HaskellObj );
102 HsPtr        rts_getPtr       ( HaskellObj );
103 HsFunPtr     rts_getFunPtr    ( HaskellObj );
104 HsFloat      rts_getFloat     ( HaskellObj );
105 HsDouble     rts_getDouble    ( HaskellObj );
106 HsStablePtr  rts_getStablePtr ( HaskellObj );
107 HsBool       rts_getBool      ( HaskellObj );
108
109 /* ----------------------------------------------------------------------------
110    Evaluating Haskell expressions
111
112    The versions ending in '_' allow you to specify an initial stack size.
113    Note that these calls may cause Garbage Collection, so all HaskellObj
114    references are rendered invalid by these calls.
115    ------------------------------------------------------------------------- */
116 Capability * 
117 rts_eval (Capability *, HaskellObj p, /*out*/HaskellObj *ret);
118
119 Capability * 
120 rts_eval_ (Capability *, HaskellObj p, unsigned int stack_size, 
121            /*out*/HaskellObj *ret);
122
123 Capability * 
124 rts_evalIO (Capability *, HaskellObj p, /*out*/HaskellObj *ret);
125
126 Capability *
127 rts_evalStableIO (Capability *, HsStablePtr s, /*out*/HsStablePtr *ret);
128
129 Capability * 
130 rts_evalLazyIO (Capability *, HaskellObj p, /*out*/HaskellObj *ret);
131
132 Capability * 
133 rts_evalLazyIO_ (Capability *, HaskellObj p, unsigned int stack_size, 
134                  /*out*/HaskellObj *ret);
135
136 void
137 rts_checkSchedStatus (char* site, Capability *);
138
139 SchedulerStatus
140 rts_getSchedStatus (Capability *cap);
141
142 /* --------------------------------------------------------------------------
143    Wrapper closures
144
145    These are used by foreign export and foreign import "wrapper" stubs.
146    ----------------------------------------------------------------------- */
147
148 extern StgWord base_GHCziTopHandler_runIO_closure[];
149 extern StgWord base_GHCziTopHandler_runNonIO_closure[];
150 #define runIO_closure             base_GHCziTopHandler_runIO_closure
151 #define runNonIO_closure          base_GHCziTopHandler_runNonIO_closure
152
153 /* ------------------------------------------------------------------------ */
154
155 #ifdef __cplusplus
156 }
157 #endif
158
159 #endif /* RTSAPI_H */