[#26266] pragma on ripper — nobuyoshi nakada <nobuyoshi.nakada@...>
なかだです。
こんにちは、なかむら(う)です。
なかだです。
[#26284] ext/tk/sample/tkextlib/tile/demo.rb で TypeError — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
山本です。
[#26298] ext/tk/sample/tkextlib/tile/themes — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
山本です。
[#26305] ext/tk/sample/tkextlib/ICONS/viewIcons.rb — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
山本です。
永井@知能.九工大です.
[#26312] rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org>
最近、とあるプログラム(五月雨)が、無限ループに陥ることが何回かありました。
なかだです。
In article <TYOMLEM04FRaqbC8wSA00000024@tyomlvem02.e2k.ad.ge.com>,
なかだです。
In article <TYOMLEM04FRaqbC8wSA00000025@tyomlvem02.e2k.ad.ge.com>,
なかだです。
In article <TYOMLEM04Rqf69aZbLA0000002d@tyomlvem02.e2k.ad.ge.com>,
なかだです。
In article <200506101543.j5AFhToG009328@sharui.nakada.niregi.kanuma.tochigi.jp>,
In article <8764wlil9l.fsf@m17n.org>,
なかだです。
In article <200506111335.j5BDZkoG019423@sharui.nakada.niregi.kanuma.tochigi.jp>,
まつもと ゆきひろです
In article <1118583170.298416.26464.nullmailer@x31.priv.netlab.jp>,
まつもと ゆきひろです
In article <1118586617.180748.27381.nullmailer@x31.priv.netlab.jp>,
[#26324] XMLRPC charset — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#26358] test failures and errors — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#26387] warningを減らす — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#26405] WEBrick DoS vulnerability — Tanaka Akira <akr@...17n.org>
NetBSD 2.0 で WEBrick を使って HTTP サーバを動かした場合、クライアント
ごとうゆうぞうです。
In article <20050708.175802.957830318.gotoyuzo@sawara.does.notwork.org>,
In message <87fyupzgcq.fsf@m17n.org>,
In article <20050708.211519.179953950.gotoyuzo@sawara.does.notwork.org>,
In message <87d5ptzdpc.fsf@m17n.org>,
前田です。
In article <42CF1AF2.5000407@ruby-lang.org>,
In message <878y0erpv7.fsf@m17n.org>,
[#26410] irbのlexerが数値認識に失敗 — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#26417] test.rb failed 167W: ruby 1.9.0 (2005-06-30) [i686-linux] (boron) — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#26421] Subversion — Shugo Maeda <shugo@...>
前田です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
山本です。
須藤です.
In article <20050703.152549.41008576.kou@cozmixng.org>,
[ruby-dev:26360] win32版ではDBM系のtestでErrorがいっぱい
こんにちは、なかむら(う)です。
最近忙しくて全然rubyを触れてないんですが、久しぶりにmswin32で
1.8の先っぽをコンパイルしてtest-allしてみたところ、山のように
エラーが出るようになっていることが判明しました。
何種類かのエラーがあるんですが、とりあえず数が多くて原因が同
じっぽいものをまとめてみたところ、dbm, gdbm, sdbmのテストの
teardownの中で、
(1) まだクローズされていないファイルを削除しようとしている
(2) 書き込み権限のないファイルを削除しようとしている
のが主たる原因のようです。
どっちもWindows(かそれに類する環境)でしか発生しない問題だろう
と思うのですが、これでは困っちゃうのでちょっと考えてみました。
(1)については、現状のテストを見ると GC.start を実行することに
よってGCされてファイルがクローズされていることを期待している
ように思うのですが、現実問題としてそうなっていません(それが問
題かどうかは私には判断できません)。
なので、より確実に、残存するDBM/GDBM/SDBMオブジェクトを集めて、
それらを片っ端からcloseすればいいかと思ったのですが、いずれも
既にcloseされているものを再度closeすると例外が発生する上に、
closeされているかどうかを判定する手段がないということに気づき
ました。
そこで、DBM/GDBM/SDBMの各クラスにclosed?というメソッドを追加
した上で、各テストのteardownで残存オブジェクトをcloseする、と
いう変更を提案します。
(2)については、MSVCRT.dllのunlink(2)がリードオンリーのファイ
ルを削除できないのが理由なので、単純にリードオンリー属性を落
としてから削除するようにしてみました。
こっちは純粋にwin32版のみに影響します。
以上をまとめたパッチです。
これでとりあえずtest-allのErrorが110個ほど減ります :)
Index: ext/dbm/dbm.c
===================================================================
RCS file: /home/cvs/ruby/ext/dbm/dbm.c,v
retrieving revision 1.24.2.6
diff -u -1 -p -r1.24.2.6 dbm.c
--- ext/dbm/dbm.c 9 Dec 2004 02:35:29 -0000 1.24.2.6
+++ ext/dbm/dbm.c 20 Jun 2005 06:14:05 -0000
@@ -73,2 +73,17 @@ fdbm_close(obj)
+static VALUE
+fdbm_closed(obj)
+ VALUE obj;
+{
+ struct dbmdata *dbmp;
+
+ Data_Get_Struct(obj, struct dbmdata, dbmp);
+ if (dbmp == 0)
+ return Qtrue;
+ if (dbmp->di_dbm == 0)
+ return Qtrue;
+
+ return Qfalse;
+}
+
static VALUE fdbm_alloc _((VALUE));
@@ -752,2 +767,3 @@ Init_dbm()
rb_define_method(rb_cDBM, "close", fdbm_close, 0);
+ rb_define_method(rb_cDBM, "closed?", fdbm_closed, 0);
rb_define_method(rb_cDBM, "[]", fdbm_aref, 1);
Index: ext/gdbm/gdbm.c
===================================================================
RCS file: /home/cvs/ruby/ext/gdbm/gdbm.c,v
retrieving revision 1.27.2.4
diff -u -1 -p -r1.27.2.4 gdbm.c
--- ext/gdbm/gdbm.c 9 Dec 2004 02:35:28 -0000 1.27.2.4
+++ ext/gdbm/gdbm.c 20 Jun 2005 06:14:05 -0000
@@ -74,2 +74,17 @@ fgdbm_close(obj)
+static VALUE
+fgdbm_closed(obj)
+ VALUE obj;
+{
+ struct dbmdata *dbmp;
+
+ Data_Get_Struct(obj, struct dbmdata, dbmp);
+ if (dbmp == 0)
+ return Qtrue;
+ if (dbmp->di_dbm == 0)
+ return Qtrue;
+
+ return Qfalse;
+}
+
static VALUE fgdbm_s_alloc _((VALUE));
@@ -943,2 +958,3 @@ Init_gdbm()
rb_define_method(rb_cGDBM, "close", fgdbm_close, 0);
+ rb_define_method(rb_cGDBM, "closed?", fgdbm_closed, 0);
rb_define_method(rb_cGDBM, "[]", fgdbm_aref, 1);
Index: ext/sdbm/init.c
===================================================================
RCS file: /home/cvs/ruby/ext/sdbm/init.c,v
retrieving revision 1.18.2.7
diff -u -1 -p -r1.18.2.7 init.c
--- ext/sdbm/init.c 9 Dec 2004 07:31:22 -0000 1.18.2.7
+++ ext/sdbm/init.c 20 Jun 2005 06:14:06 -0000
@@ -64,2 +64,17 @@ fsdbm_close(obj)
+static VALUE
+fsdbm_closed(obj)
+ VALUE obj;
+{
+ struct dbmdata *dbmp;
+
+ Data_Get_Struct(obj, struct dbmdata, dbmp);
+ if (dbmp == 0)
+ return Qtrue;
+ if (dbmp->di_dbm == 0)
+ return Qtrue;
+
+ return Qfalse;
+}
+
static VALUE fsdbm_alloc _((VALUE));
@@ -736,2 +751,3 @@ Init_sdbm()
rb_define_method(rb_cDBM, "close", fsdbm_close, 0);
+ rb_define_method(rb_cDBM, "closed?", fsdbm_closed, 0);
rb_define_method(rb_cDBM, "[]", fsdbm_aref, 1);
Index: test/dbm/test_dbm.rb
===================================================================
RCS file: /home/cvs/ruby/test/dbm/test_dbm.rb,v
retrieving revision 1.1.2.3
diff -u -1 -p -r1.1.2.3 test_dbm.rb
--- test/dbm/test_dbm.rb 4 Jun 2005 05:59:16 -0000 1.1.2.3
+++ test/dbm/test_dbm.rb 20 Jun 2005 06:14:10 -0000
@@ -44,3 +44,5 @@ if defined? DBM
assert_nil(@dbm_rdonly.close)
- GC.start
+ ObjectSpace.each_object(DBM) do |obj|
+ obj.close unless obj.closed?
+ end
File.delete *Dir.glob("tmptest_dbm*").to_a
Index: test/gdbm/test_gdbm.rb
===================================================================
RCS file: /home/cvs/ruby/test/gdbm/test_gdbm.rb,v
retrieving revision 1.1.2.4
diff -u -1 -p -r1.1.2.4 test_gdbm.rb
--- test/gdbm/test_gdbm.rb 4 Jun 2005 05:59:15 -0000 1.1.2.4
+++ test/gdbm/test_gdbm.rb 20 Jun 2005 06:14:10 -0000
@@ -41,3 +41,5 @@ if defined? GDBM
assert_nil(@gdbm_rdonly.close)
- GC.start
+ ObjectSpace.each_object(GDBM) do |obj|
+ obj.close unless obj.closed?
+ end
File.delete *Dir.glob("tmptest_gdbm*").to_a
Index: test/sdbm/test_sdbm.rb
===================================================================
RCS file: /home/cvs/ruby/test/sdbm/test_sdbm.rb,v
retrieving revision 1.1.2.1
diff -u -1 -p -r1.1.2.1 test_sdbm.rb
--- test/sdbm/test_sdbm.rb 3 Jun 2005 16:43:39 -0000 1.1.2.1
+++ test/sdbm/test_sdbm.rb 20 Jun 2005 06:14:10 -0000
@@ -14,3 +14,5 @@ class TestSDBM < Test::Unit::TestCase
assert_nil(@sdbm.close)
- GC.start
+ ObjectSpace.each_object(SDBM) do |obj|
+ obj.close unless obj.closed?
+ end
File.delete *Dir.glob("tmptest_sdbm*").to_a
Index: win32/win32.c
===================================================================
RCS file: /home/cvs/ruby/win32/win32.c,v
retrieving revision 1.103.2.27
diff -u -1 -p -r1.103.2.27 win32.c
--- win32/win32.c 18 May 2005 14:39:27 -0000 1.103.2.27
+++ win32/win32.c 20 Jun 2005 06:14:10 -0000
@@ -3435,2 +3435,22 @@ rb_w32_rmdir(const char *path)
+#undef unlink
+int
+rb_w32_unlink(const char *path)
+{
+ DWORD attr;
+ int ret;
+ RUBY_CRITICAL({
+ attr = GetFileAttributes(path);
+ if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_READONLY)) {
+ attr &= ~FILE_ATTRIBUTE_READONLY;
+ SetFileAttributes(path, attr);
+ }
+ ret = unlink(path);
+ if (ret < 0 && attr != (DWORD)-1) {
+ SetFileAttributes(path, attr);
+ }
+ });
+ return ret;
+}
+
#if !defined(__BORLANDC__) && !defined(_WIN32_WCE)
Index: win32/win32.h
===================================================================
RCS file: /home/cvs/ruby/win32/win32.h,v
retrieving revision 1.46.2.10
diff -u -1 -p -r1.46.2.10 win32.h
--- win32/win32.h 16 May 2005 13:22:09 -0000 1.46.2.10
+++ win32/win32.h 20 Jun 2005 06:14:10 -0000
@@ -130,2 +130,4 @@ extern "C++" {
#define rmdir(p) rb_w32_rmdir(p)
+#undef unlink
+#define unlink(p) rb_w32_unlink(p)
@@ -193,2 +195,3 @@ extern int rb_w32_mkdir(const char *, in
extern int rb_w32_rmdir(const char *);
+extern int rb_w32_unlink(const char*);
で、他にも、dbm系のテストの問題としては、
(3) Windowsには「読み込み禁止」という属性がない。
厳密にはNTFS上では実現できるがrubyではさしあたってサポー
トしてない。
(4) 例によってforkがない。
とかいうのも残ってるんですが、その辺はまた次回。
それでは。
--
U.Nakamura <usa@garbagecollect.jp>