Hi, thanks I tried the new FFI and it is definitely faster.

Out of curiosity why do the stacks need to be seperate? Would it not be
possible to have a ForeignUnsafe for which they share the same stack? Thanks

On Sat, Oct 10, 2015 at 1:39 PM, David Matthews <
[email protected]> wrote:

> I was planning to announce the new foreign function interface on the list
> but Artella got in there before me.
>
> The old foreign function interface, CInterface, was designed more than
> twenty years.  That was before libffi and the standard basis library and in
> the days of the old persistent store.  I've done some work on it, in
> particular adapting it to libffi and adding some extra features such as
> callback functions, but the basic design and code haven't really changed.
> I decided it was time to update the design and rather than adapt CInterface
> it was easiest to start from scratch.
>
> The new design, in the Foreign structure, provides very similar high level
> functions to CInterface.  In fact it should be a simple process to convert
> function calls over.  I haven't used the old names because they began with
> capital letters and there is a convention now that initial capitals are
> reserved for constructors.
>
> The lower levels are very different.  In particular C addresses and the
> conversion between C and ML values are handled entirely by ML code rather
> than the run-time system.  A consequence of this is that there is no
> garbage collection of C data; all data structures allocated in C memory
> must be explicitly freed.  The "converters" in Foreign, such as cString,
> that allocate space to pass values, automatically deallocate the space when
> the function returns.  When a function is passed as an argument the
> function closure is freed when the calling function returns.  Since that
> isn't always what is required, for example when registering a callback for
> use later, there is an easy way to override this.
>
> The intention is that this should be much more efficient than CInterface.
> Nevertheless, there is still a significant overhead in calling a foreign
> function compared with one in ML.  To allow for garbage collection each
> thread has separate stacks for ML and C code and there is at the very least
> the need to switch between them.  I haven't produced any documentation yet
> but I've adapted the old example code and produced a new example in
> mlsource/extra/CInterface/Examples/NewForeignTest.sml.
>
> David
>
> _______________________________________________
> polyml mailing list
> [email protected]
> http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
>
_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to