[Haskell-cafe] Re: POSIX AIO (asych I/O) ...
Galchin, Vasili
vigalchin at gmail.com
Thu Jul 3 00:49:39 EDT 2008
Hi Brandon,
Most of what you say makes sense. However, at some places in your
narrative aren't you mixing up my aioError and aioReturn?(or aio_error and
aio_return, respectively). E.g. aioReturn should return the byte count and
not errno?
If you want to stick close to the C interface:
aioReturn :: AIOCB -> IO (AIOCB, Errno)
aioReturn aiocb = do
allocaBytes (#const sizeof(struct aiocb)) $ \ p_aiocb -> do
poke p_aiocb aiocb
err <- c_aio_return p_aiocb
aiocb <- peek p_aiocb
return (aiocb, Errno err)
Vasili
On Wed, Jul 2, 2008 at 1:07 AM, Brandon S. Allbery KF8NH <
allbery at ece.cmu.edu> wrote:
>
> On 2008 Jul 2, at 1:42, Galchin, Vasili wrote:
>
> errno <- throwErrnoIfMinus1 "aioError" (c_aio_error p_aiocb)
>
> "ghc" thinks that "Errno" should be an instance of "Num":
>
> System/Posix/Aio.hsc:117:15:
> No instance for (Num Errno)
>
>
> I expect so it can compare it to -1(throwErrnoIfMinusOne). But if the
> return value is actually an errno and not -1 to indicate error (which it is
> if I read the manpage correctly), you don't want throwErrnoIfMinus1 anyway;
> I suspect you want to wrap the return value of c_aio_return (which should be
> IO CInt) in an Errno constructor, then use errnoToIOError if you really want
> to raise an IOError.
>
> (What were you expecting for "count"? I see none, just an errno.)
>
> Note that it *never* returns -1; it returns 0 for successful completion for
> the aiocb, EINPROGRESS if it's still working, and the appropriate errno if
> it failed.
>
> You might want to decide if you want to use the aio_return style interface
> or something more Haskell-ish before designing this part of the API. If you
> want to stick close to the C interface:
>
> aioReturn :: AIOCB -> IO (AIOCB, Errno)
> aioReturn aiocb = do
> allocaBytes (#const sizeof(struct aiocb)) $ \ p_aiocb -> do
> poke p_aiocb aiocb
> err <- c_aio_return p_aiocb
> aiocb <- peek p_aiocb
> return (aiocb, Errno err)
> I'd actually consider something more Haskellish, e.g. a variant of StateT
> IO where the state is the aiocb and errno, the errno initialized to
> eINPROGRESS and set by aioReturn and aioError (and once aioReturn is called,
> it can't be called again so return the cached value if needed).
>
> --
> brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
> system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
> electrical and computer engineering, carnegie mellon university KF8NH
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20080702/d18dc3a1/attachment.htm
More information about the Haskell-Cafe
mailing list