[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: non-local exits are icky



>>>>> "Tom" == Tom Lord <lord@xxxxxxx> writes:

>> From: Michael Sperber <sperber@xxxxxxxxxxxxxxxxxxxxxxxxxxx>

Tom> Since the mechanism of these non-local exits is not
Tom> specified and can not be modified by C code, the FFI
Tom> contains no provision for them to perform unwind protection
Tom> --- that's a serious omission.

>> But SCHEME_CALL takes you back to Scheme, where you can use
>> DYNAMIC-WIND.

>> I think I misunderstand your point.


Tom> A sketch that illustrates the issue:


Tom>   my_fn ()
Tom>   {
Tom>     int fd;

Tom>     fd = open ("somefile", O_RDONLY, 0);

Tom>     SCHEME_CALL ( [...] );

Tom>     close (fd);
Tom>   }


Of course, you're not supposed to do this.  You're supposed to do
(very roughly):

scheme_value my_open()
{
    return SCHEME_ENTER_LONG((long) open ("somefile", O_RDONLY, 0));
}

...

scheme_value my_close(scheme_value fd)
{
    close((int) SCHEME_EXTRACT_LONG(fd));
}

... and handle the non-local control flow from Scheme.  C just isn't
powerful enough to play these games gracefully.

-- 
Cheers =8-} Mike
Friede, Völkerverständigung und überhaupt blabla