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:[EMAIL PROTECTED]] | Sent: 02 June 2002 18:03 | To: John Meacham | Cc: [EMAIL PROTECTED] | Subject: Re: Problem with FFI? | | | | [reply redirected to [EMAIL PROTECTED]] | | John Meacham <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED] | http://www.cs.utah.edu/~reid/ | | | | | _______________________________________________ | FFI mailing list | [EMAIL PROTECTED] | http://www.haskell.org/mailman/listinfo/ffi | _______________________________________________ FFI mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/ffi
