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 < [EMAIL PROTECTED]> 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] [EMAIL PROTECTED] > system administrator [openafs,heimdal,too many hats] [EMAIL PROTECTED] > electrical and computer engineering, carnegie mellon university KF8NH > > >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe