Problem with FFI?
Simon Peyton-Jones
simonpj at microsoft.com
Thu Jun 6 05:20:17 EDT 2002
Manuel:
Do you agree that something in the FFI spec needs to be fixed?
And hence is on your to-do list?
(Just wanting to be sure this one doesn't fall off the radar.)
Simon
| -----Original Message-----
| From: Alastair Reid [mailto:reid at cs.utah.edu]
| Sent: 02 June 2002 18:03
| To: John Meacham
| Cc: ffi at haskell.org
| Subject: Re: Problem with FFI?
|
|
|
| [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/
|
|
|
|
| _______________________________________________
| FFI mailing list
| FFI at haskell.org
| http://www.haskell.org/mailman/listinfo/ffi
|
More information about the FFI
mailing list