Would be nice if rts_lock (or similar) would fail when the RTS is not started
If you export a Haskell function and then call it from C code you have got to remember to start up the RTS before calling the exported C function, otherwise it segfaults.
As a slightly nicer way of reminding people to initialise the RTS, perhaps one of the functions on the code path for calling exported functions (ie the calls in the _stub.c files) could check if the RTS is started and if not do something a little nicer than segfault.
The code typically looks like
cap=rts_lock();
cap=rts_evalIO(cap,
rts_apply(cap,(HaskellObj)runIO_closure,
rts_apply(cap,&Foo_zdffoozuads_closure,
rts_mkInt(cap,a1))) ,&ret);
rts_checkSchedStatus("foo",cap);
cret=rts_getInt(ret);
The first bit to segfault is allocateLocal
, probably inside rts_mkInt
. Note that rts_lock
succeeds and returns a non-null capability.
On similar lines, we might want to think about the use case of building Haskell libs that export C functions to be used by other projects and ways to make initialising that library either nicer or automatic. We all complain when we use C libs that require a global initialiser (implying some global state) and yet that's exactly what we impose on callers.
Trac metadata
Trac field | Value |
---|---|
Version | 6.11 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Runtime System |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |