[#4754] Now,I am starting ruby. — mamoru@... (Mamoru Matushita)

先日、初めて投稿したつもりだったのですが間違えて

14 messages 1997/10/02

[#4891] mixin - singleton method inheritance, const etc... — shugo@... (Shugo Maeda)

前田です。

13 messages 1997/10/10

[#5000] ruby 1.0-971015 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

14 messages 1997/10/15

[#5056] RubyでOODB — hisanori@...

松尾です。

20 messages 1997/10/20
[#5057] Re: RubyでOODB — matz@... (Yukihiro Matsumoto) 1997/10/20

まつもと ゆきひろです

[#5065] Re: RubyでOODB — hisanori@... 1997/10/20

松尾です。

[#5066] Re: RubyでOODB — matz@... (Yukihiro Matsumoto) 1997/10/20

まつもと ゆきひろです

[ruby-list:4966] Re: flock(mswin32)

From: KIMURA Koichi <kkimura@...>
Date: 1997-10-14 09:34:27 UTC
List: ruby-list #4966
木村です。

	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

In This Thread