From: matz@... (Yukihiro Matsumoto) Date: 2001-03-26T17:47:06+09:00 Subject: [ruby-dev:12677] Re: errno on non-blocking flock() by fcntl() まつもと ゆきひろです In message "[ruby-dev:12670] errno on non-blocking flock() by fcntl()" on 01/03/25, Koji Arai writes: |fcntl(fd, F_SETLK, &lock) | |は、ロック済みの場合うちの48の環境では EACCES を返すので |flock() が false を返さず例外になります。lockf() を使う実装 |ではEACCES、EAGAIN をEWOULDBLOCKに直しているのでそれにあわせ |ました。 | |# glibc のマニュアルを見ると、fcntl() もEAGAINまたはEACCESのようなので | |ただ、EWOULDBLOCK は定義されているとは限らないようなので呼び |出し側で EWOULDBLOCK、EAGAIN、EACCES それぞれをtrapするよう |な修正にしてます。 | |以上、missing/flock.c file.c:rb_file_flock() の修正 | |さらに、今は使ってない file.c:rb_thread_flock() は |EWOULDBLOCK 等でbreak してましたが、continue なんではないか |なと思います。そして、EINTR が発生するかどうかはわからないの |ですが発生すれば-1 で return しても良いかと思い、case をはず |しました。 これらを取り込むことにします。 |そして、error.c の修正は上記とは関係ないのですが、現在のrubyでは | EWOULDBLOCK と EAGAIN が同じ値のシステム |の場合どちらの例外があがるかはrubyの実装依存になります。 | |これは利用者が困る場合があるのではないかと思い、 |同じ値の errno に対してクラスを1つにし、他はそれを代入した |定数にしてみました。 こっちは皆さんの意見を聞いてからにします。私は |p Errno::EWOULDBLOCK |=> Errno::EAGAIN にちょっと違和感があるのですが。たしかに困ることもありえます よね。 まつもと ゆきひろ /:|)