
On Sun, Mar 6, 2011 at 2:38 PM, Remi Turk
I am happy to finally announce cinvoke 0.1, a binding to the C library cinvoke[1], allowing functions to be loaded and called whose names and types are not known before run-time.
Why?
Sometimes you can't use the Haskell foreign function interface because you parse the type of the function from somewhere else, i.e. you're writing an interpreter for a language that has an FFI itself.
What?
The main function it exports is:
cinvoke :: Symbol -> RetType b -> [Arg] -> IO b
And because code is worth a thousand words, here's a small program that uses libc to write a 1Gb buffer of random garbage to a file:
module Main where
import Foreign.CInvoke
main = do cxt <- newContext libc <- loadLibrary cxt "libc.so.6" malloc <- loadSymbol libc "malloc" creat <- loadSymbol libc "creat" write <- loadSymbol libc "write" free <- loadSymbol libc "free" let sz = 2^30 buf <- cinvoke malloc (retPtr retVoid) [argCSize sz] fd <- cinvoke creat retCInt [argString "/tmp/test", argCUInt 0o644] n <- cinvoke write retCSize [argCInt fd, argPtr buf, argCSize sz] cinvoke free (retPtr retVoid) [argPtr buf]
It hopefully works on any machine on which cinvoke works, but has only been tested on linux x86_64. As the current version of cinvoke only installs a static library, it does not work from GHCi at the moment (without hacking cinvoke to build a shared library). More interesting examples are included in examples/ in the package.
Where? Hackage: http://hackage.haskell.org/package/cinvoke
Cheers, Remi
Is there any information on how this (and libffi I guess) compare to GHC's FFI in terms of performance? Is it equivalent? Once you've loaded a function with loadSymbol and are cinvoking it with various arguments, versus a plain "foreign import" of the same. (Also, I assume cinvoke corresponds to the FFI's 'unsafe' calls, i.e. if the function tries to call back into the GHC runtime then Bad Things will happen, and it'll block threads on the same 'Capability' if it runs too long?)
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Work is punishment for failing to procrastinate effectively.