FreeBSDでaio

id:hirose31:20070714:1184341432 の続き)

aio (aio_readとかaio_errorとかaio_returnとか) の習作中。

developerWorksBoost application performance using asynchronous I/Oのサンプルコードに毛が生えた程度の超絶シンプルなコードがLinuxでとりあえず動いたんで、次はとFreeBSD 6.2で試してみた。

けど、いまいち芳しくない。。。

  • my_aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL の場合
    • my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;でセットしたmy_aiocbが、シグナルハンドラの中で(struct aiocb *)info->si_value.sival_ptrとやっても取り出せない。(NULLが出てくる)
    • my_aiocbをグローバルにしちゃってそれを使えば一応一応、うまくいった。
  • my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD の場合
    • my_aiocb.aio_sigevent.sigev_notify_functionがない。
    • my_aiocb.aio_sigevent.sigev_notify_attributesもない。
    • /usr/include/sys/signal.hに「* XXX missing sigev_notify_function, sigev_notify_attributes.」というコメントがある。
    • sigev_notify_kqueueとかいうのがあるっぽい。
    • そういえば、こっちはスレッドの中の(struct aiocb *)sigval.sival_ptrでmy_aiocbがとれてるなぁ。
  • FreeBSDにはaio_waitcomplete(2)というのがあるらしい。

情報が少ない上にまだよくわかってないところがあるので試行錯誤中。

「オラ、FreeBSDでバリンバリンにaio_*使ってるヨ」という方と仲良く鳴りたい。



id:hirose31:20070721:1184950454 に続く…