From: KIMURA Koichi Date: 1997-10-14T18:34:27+09:00 Subject: [ruby-list:4966] Re: flock(mswin32) 木村です。 In: [ruby-list:4956] >NTでの話ですよね? >windows95上のmswin32版では発生しませんでした。 > >fp = File.new("lock.txt", "w") >print fp.flock(File::LOCK_UN), "\n" >fp.close >ってやると FALSE と表示されます。 こちらで作成した実行ファイルを使って上記のスクリプトを 試したところ、 NT (4.0) → Segmentation fault 95 → FALSEが表示される でした。 その後調べたところ、どーも分けわかんないです^^; 直接には LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i); を展開したものにある errno = GetLastError() が、 case LOCK_UN: /* unlock lock */ の部分で実行されたときに発生するということがわかりました。が、他 の部分でこれやってても大丈夫なんですよね。ひょっとしてコンパイラ のバグか? という気がしないでもないのですが、面倒なので調べてませ ん^^; この問題にとりあえず対処したパッチが↓です。 UnlockFileExに失敗したときのエラーコードを決め打ちしちゃってます けど、悪影響はないでしょう。 #助田さんのパッチを当てた直後の nt.cに当てるパッチです。 --- nt.c.orig Tue Oct 14 11:19:40 1997 +++ nt.c Tue Oct 14 15:39:22 1997 @@ -104,9 +104,16 @@ LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i); + if(errno == EDOM) errno = EWOULDBLOCK; break; case LOCK_UN: /* unlock lock */ - LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i); + if (UnlockFileEx(fh, 0, LK_LEN, 0, &o)) { + i = 0; + } + else { + /* GetLastError() must returns `ERROR_NOT_LOCKED' */ + errno = EWOULDBLOCK; + } break; default: /* unknown */ errno = EINVAL; -- 木村浩一 e-mail koichi-ki@aix.or.jp kkimura@pure.cpdc.canon.co.jp