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