Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information