[plt-scheme] Proposal: Async FFI

From: Hans Oesterholt-Dijkema (hdnews at gawab.com)
Date: Sun Jul 8 09:28:26 EDT 2007

Although, it would already be a good thing to be able to call 1 C 
function a time, while still
being able to run scheme code in threads? And one maybe could introduce 
an unsafe construct
when the programmer "knows" (or hopes so) that his code won't break 
mzscheme.

I use scheme_block_until in my C call.

Eli Barzilay schreef:
> On Jul  8, Hans Oesterholt-Dijkema wrote:
>   
>> Dear All,
>>
>> In my sqld-psql-c driver (see PLaneT) I've used an asynchronous mechanism
>> to call pqexec (a synchronous function call for PostgreSQL). I've done this
>> to enable scheme threads to run, while processing SQL queries.
>>
>> I'd like to add such a mechanism to the FFI. Maybe through PLaneT, but
>> eventually I'd like this to be added to the FFI code. This will help greatly
>> for using certain libraries through the FFI, where functions can block for
>> a long time, e.g. DB2CLI, MySQL. But other C libraries, e.g. for image
>> processing can also be thought of.
>>
>> My idea is to provide a set of basic C functions, like:
>>
>> int f(int)
>> void f(int)
>> int f(string)
>> ...
>>
>> The C code for these functions can be generated. These functions do
>> the trick that can be reviewed in the sqld-psql-c PLaneT package, in
>> a generic way.
>>
>> The FFI could be extended with get-ffi-obj/async. To provide calls
>> of these asynchronous functions. Of course this variant will have a
>> lot of restrictions, but this basic support would be quite good
>> already.
>>     
>
> A `get-ffi-obj/async' doesn't sound good.  I think that a better way
> to have async calls is some new primitive like
>
>   (ffi-call/async ptr in-types out-type)
>
> that is similar to `ffi-call' (which is the primitive that the
> foreign.ss library builds on) -- the result is a Scheme procedure that
> expects one more argument which is a callback function.  For example,
> with `ffi-call' you do something like this (this is a rough
> approximation to how "foreign.ss" does things):
>
>   (define cfun (ffi-call some-fun-pointer (list _int _bool) _int))
>   (printf "cfun returned ~s\n" (cfun 15 #f))
>
> and with `ffi-call/async':
>
>   (define cfun* (ffi-call/async some-fun-pointer (list _int _bool) _int))
>   (cfun (lambda (r) (printf "cfun returned ~s\n" r))
>         15 #f)
>
> But there is one major problem with all this...  MzScheme assumes that
> all calls to C are atomic, so it will be easy to make things break in
> unexpected ways.  (The simplest would be to have the asynchroneous
> call use a Scheme callback.)
>
> (This is on top of the usual problems like making whatever code yo
> write work on everything, including Windows, Solaris, OSX, *BSD, etc.)
>
>   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20070708/cb5abfae/attachment.html>

Posted on the users mailing list.