[erlang-questions] Type-tagged FFI interface
Raimo Niskanen
raimo+erlang-questions@REDACTED
Thu Sep 13 11:03:16 CEST 2007
Aah, I see! As we say in swedish - I did not hear the beauty in the
crow's song. Then the tagged calls would be implemented in Erlang
and themselves call the untagged BIFs.
The name ffi:untagged_call feels awkward, though.
On Thu, Sep 13, 2007 at 10:23:51AM +0200, Alceste Scalas wrote:
> Il giorno gio, 13/09/2007 alle 09.30 +0200, Raimo Niskanen ha scritto:
> > I thought [the Erlang FFI proposal] was very thought through,
> > and complete, but apparently it will benefit from more input from
> > erlang-questions to settle a bit.
>
> I definitely agree, and that's why I didn't send the draft to EEPs list
> yet... Anyway thanks for having adopted it!
>
>
> > Oh, and I have a suggestion about the actual ffi:call/2,3 functions.
> > Personally I would prefer an interface with tagged values:
> >
> > ffi:call(Port, {ReturnType,Function}, [TaggedVal]) ->
> > {ReturnType,term()}
> > ReturnType = type_tag()
> > TaggedVal = {type_tag(),Val}
> > Val = term()
> > type_tag() = uchar|schar|...|pointer|size_t|ssize_t
> >
> > e.g
> >
> > Pointer = {pointer,PointerVal} =
> > ffi:call(Port, {pointer,malloc}, [{size_t,1024}]),
> > void = ffi:call(Port, {void,free}, [Pointer]),
> >
> > This would make the code more readable (resembling the C calls) IMHO,
> > and make the ffi values more self-contained; a return value can
> > directly be passed to another ffi function.
>
> A tagged interface would be *very* nice, and more type-safe --- but it
> would be a performance killer, too [1].
>
> Maybe something like this would be a good compromise:
>
> 1. move ffi:call/3 and ffi:call/2 to ffi.erl (part of the Erlang
> kernel library?), with the tagged interface you are proposing;
> 2. rename the "old" FFI BIFs to something like ffi:untagged_call/3
> and ffi:untagged_call/2.
>
> In general, every FFI function could have a "standard" and recommended
> version implemented in Erlang, that will support (and check) the type
> tags. The "real FFI work" would be performed by the untagged_ BIFs.
> Developers may choose between the tagged and untagged interfaces,
> depending on the performance/safety/readability tradeoff they're looking
> for.
>
> What do you think?
>
> Regards,
>
> alceste
>
> Notes:
>
> [1] The current FFI interface is tuple-based on pourpose: it avoids
> unrolling lists when counting function call parameters, and
> Erlang terms are handled with very simple pointer arithmetics.
> --
> Alceste Scalas <alceste@REDACTED>
> CRS4 - http://www.crs4.it/
--
/ Raimo Niskanen, Erlang/OTP, Ericsson AB
More information about the erlang-questions
mailing list