[erlang-questions] FFI for Erlang: patches and draft EEP
Alceste Scalas
alceste@REDACTED
Tue Sep 11 15:52:10 CEST 2007
Il giorno mar, 11/09/2007 alle 15.05 +0200, Claes Wikstrom ha scritto:
> call erlang--> C and binary() data: Is the binary data copied
> or does the C function get a pointer/size pair - the latter
> would be optimal.
The C side just gets a pointer to the beginning of the binary data, that
is never copied. If the binary size is also required, you could pass
size(Binary) as a function call argument.
> return C --> erlang - I can't seem to find any ways for the
> C code to return a binary() back to erlang ?? This is IMHO
> necessary
The current FFI implementation, taken alone, does *not* allow the C side
to fiddle with the Erlang VM (e.g. by allocating binaries or other
terms).
This issue could be overcomed in three ways:
1. using a complete API for handling Erlang terms on the C side
(not existing yet for linked-in drivers);
2. developing a small linked-in driver, that uses
erlang:port_control/3 for stuff like returning binaries
(allocated with driver_alloc_binary()). Other functions that
don't play with Erlang terms may be called directly with
ffi:call/2 and ffi:call/3, without having to increase the driver
glue code;
3. another way I didn't think about :-)
The ideal solution would be (1), and it could even be an extension of
the Erlang FFI draft EEP [1]. My idea, however, was to do one thing a
time.
Regards,
alceste
Notes:
[1] Indeed, it would be trivial to extend the FFI interface to
pass Erlang terms to the C side, thus allowing to develop
functions with the power of BIFs. These functions, however,
would need to be compiled against the Erlang VM header files;
and since they are not "public", they would need to be
recompiled in order to match the Erlang/OTP version in use.
This is a complex issue, that is probably worth a dedicated
EEP.
--
Alceste Scalas <alceste@REDACTED>
CRS4 - http://www.crs4.it/
More information about the erlang-questions
mailing list