Problem with FFI?
Alastair Reid
reid at cs.utah.edu
Sun Jun 2 13:02:44 EDT 2002
[reply redirected to ffi at haskell.org]
John Meacham <john at repetae.net> writes:
> I may be missing something obvious here, but from the current FFI
> spec it appears that it is impossible to create libraries in haskell
> which are meant to be called from c code without running into
> undefined behavior. The problem is in the definition of hs_init()
> and hs_exit() . now, it is acceptable to have hs_init and hs_exit
> called in the initialization and finalization of your library, but
> the problem arrises when you link against more than one library
> which is implemented in haskell, suddenly whichever library is
> initialized secondly segfaults! (or whatever undefined behaviour
> means.). programs could suddenly stop working when a library is
> changed from a c implementation to a haskell one, which seems to be
> a bad thing.
Hmmm, I see what you mean.
> proposed fix: allow nested calls to hs_init, hs_exit, a counter is
> incremented when hs_init is called more than once, and decremented
> on hs_exit. only the last call to hs_exit will actually do whatever
> needs to be done.
The hs_init function takes arguments - what if each call to hs_init
specifies a different set of arguments? How about:
hs_set_hs_argv (int argc, char *argv[]);
hs_set_prog_argv (int argc, char *argv[]);
hs_init ();
hs_exit ();
Where:
hs_set_hs_argv sets command line parameters for the Haskell
runtime system
It can be called at most once and that call must be before the
first call to hs_init
Warning! The flags are not remotely portable between different
Haskell runtimes.
hs_set_prog_argv sets arguments seen by getProgName and getArgs
It can be called at most once and that call must be before the
first call to hs_init
hs_init initializes the Haskell runtime
It can be called multiple times and must be called before the first
call to any function exported by the Haskell code.
hs_exit finalizes the Haskell runtime
hs_init and hs_exit are required to satisfy the usual bracketing rules:
1) At any time, the number of calls that have been made to hs_exit must be
no more than the number of calls that have been made to hs_init.
2) If the number of calls to hs_exit is equal to the number of calls
to hs_init, then no further calls to hs_init may be made.
By the way, the name 'hs_exit' is a little confusing - I expected it
to have an ExitCode argument. 'hs_fini' would better match its actual
purpose.
> note that this cannot be implemented by the programmer himself since
> there might be several third party libraries also implemented in
> haskell which an app wishes to link against.
You can implement the modified API (or your modified semantics) quite
readily as a little library which you link against your program. All
you have to do is tweak the names a little (e.g., s/hs/HS/) to avoid
name clashes.
--
Alastair Reid reid at cs.utah.edu http://www.cs.utah.edu/~reid/
More information about the FFI
mailing list