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