On 08/07/2010 23:25, J. Garrett Morris wrote:
Hello everyone,

I'm currently in the process of wrapping a C API, and I've run across
an interesting possibility.  Basically, the C API exposes non-blocking
versions of some potentially long-running operations, and will invoke
a callback to indicate that the long running operation has finished.
For instance, I have something like:

int longRunningReadOperation(int length, byte * buf, void (*callback)())

When callback is called, then there are length bytes in buf.  What I'd
like to do is wrap this in Haskell function like:

longRunningReadOperation :: Int ->  IO [Byte]

such that the function returns immediately, and only blocks when
someone pulls on the results if the callback hasn't been triggered
yet.  I figure I'm going to need unsafeInterleaveIO, but I'm not sure
what to do in the computation I pass to it.  I had a small hope that
if the callback put the results into an MVar (say var), and I returned
(unsafeInterleaveIO (readMVar var)) that might work, but it seems like
if the readMVar blocks then the callback doesn't execute either.

I don't see why that wouldn't work. You are compiling with -threaded, right?

Cheers,
        Simon
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to