[#13087] importing forwardable — "Akinori MUSHA" <knu@...>

 石塚さんの forwardable.rb を標準添付ライブラリにするべく、

11 messages 2001/05/02

[#13169] SizedQueue#pop causes deadlock — "Okada Jun" <yun@...>

岡田です。

18 messages 2001/05/13
[#13171] Re: SizedQueue#pop causes deadlock — "Akinori MUSHA" <knu@...> 2001/05/13

At Sun, 13 May 2001 14:11:18 +0900,

[#13176] Re: SizedQueue#pop causes deadlock — matz@... (Yukihiro Matsumoto) 2001/05/13

まつもと ゆきひろです

[#13177] Re: SizedQueue#pop causes deadlock — "Akinori MUSHA" <knu@...> 2001/05/13

At Mon, 14 May 2001 00:24:45 +0900,

[#13187] Re: SizedQueue#pop causes deadlock — matz@... (Yukihiro Matsumoto) 2001/05/13

まつもと ゆきひろです

[#13202] Re: [ruby-list:29672] Re: Enumerator — "Akinori MUSHA" <knu@...>

 ruby-dev に移ります。

26 messages 2001/05/15
[#13208] Re: [ruby-list:29672] Re: Enumerator — matz@... (Yukihiro Matsumoto) 2001/05/15

まつもと ゆきひろです

[#13259] Enumerator -- Round 2 — "Akinori MUSHA" <knu@...>

 もう一度、 Enumerable/Enumerator についてみなさんのご意見を

29 messages 2001/05/20
[#13260] Re: Enumerator -- Round 2 — matz@... (Yukihiro Matsumoto) 2001/05/20

まつもと ゆきひろです

[#13265] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/21

At Mon, 21 May 2001 06:04:32 +0900,

[#13268] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/21

原です。

[#13270] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/21

At Mon, 21 May 2001 15:00:11 +0900,

[#13289] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/22

原です。

[#13290] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/22

At Tue, 22 May 2001 19:02:10 +0900,

[#13291] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/22

原です。

[#13293] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/22

At Tue, 22 May 2001 20:57:02 +0900,

[#13305] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/24

原です。

[#13322] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/24

At Thu, 24 May 2001 15:44:14 +0900,

[#13277] ext/dbm in ruby 1.7 — Kazuhiro NISHIYAMA <zn@...>

ruby 1.7のext/dbmですが、

16 messages 2001/05/21
[#13280] Re: ext/dbm in ruby 1.7 — matz@... (Yukihiro Matsumoto) 2001/05/21

まつもと ゆきひろです

[#13292] Integer("X") rescue -1 が parse error — YASUI Kentarow <kenyasui@...>

安井です。

18 messages 2001/05/22
[#13294] Re: Integer("X") rescue -1 が parse error — matz@... (Yukihiro Matsumoto) 2001/05/22

まつもと ゆきひろです

[#13295] Re: Integer("X") rescue -1 が parse error — "Akinori MUSHA" <knu@...> 2001/05/23

At Wed, 23 May 2001 08:59:50 +0900,

[#13300] 1.6.4 preview3 (Re: Re: Integer("X") rescue -1 が parse error) — matz@... (Yukihiro Matsumoto) 2001/05/24

[#13304] Re: 1.6.4 preview3 (Re: Re: Integer("X") rescue -1 が parse error) — "Akinori MUSHA" <knu@...> 2001/05/24

At Thu, 24 May 2001 14:15:04 +0900,

[#13428] mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

19 messages 2001/05/31
[#13435] Re: mswin32/ming32 system patch (experimental) — nobu.nakada@... 2001/06/01

なかだです。

[#13442] Re: mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...> 2001/06/01

こんにちは、なかむら(う)です。

[#13446] Re: mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...> 2001/06/02

こんにちは、なかむら(う)です。

[#13450] Re: mswin32/ming32 system patch (experimental) — nobu.nakada@... 2001/06/04

なかだです。

[ruby-dev:13094] Re: patch for ext/gdbm

From: Koji Arai <JCA02266@...>
Date: 2001-05-03 07:25:24 UTC
List: ruby-dev #13094
新井です。

ruby 1.7.0 (2001-05-02) [i586-linux]

ですが、パッチのようにした方が GDBM#clear は速いようです。

    file = "/tmp/foo.gdbm"
    File.delete(file) rescue nil
    gdbm = GDBM.new(file)

    10000.times {|i|
      gdbm[i.to_s] = i.to_s
    }
    start = Time.now
    gdbm.clear
    p Time.now - start

    => (パッチ前) 18.167391
    => (パッチ後) 1.122306

あと、GDBM#delete を Hash のインタフェースにあわせてみました。

パッチ前
  o 削除した後 self を返す
  o 値がなければ nil を返す。ブロックがあればそれを評価した後 nil を返す

パッチ後
  o 削除した値を返す
  o 値がなければnilを返す。ただしブロックが指定されていればその結果を返す。

# test が同梱されてない...


Index: ext/gdbm/gdbm.c
===================================================================
RCS file: /src/ruby/ext/gdbm/gdbm.c,v
retrieving revision 1.15
diff -u -p -u -r1.15 gdbm.c
--- ext/gdbm/gdbm.c	2001/05/02 04:22:18	1.15
+++ ext/gdbm/gdbm.c	2001/05/03 07:12:11
@@ -354,31 +354,11 @@ static VALUE
 fgdbm_delete(obj, keystr)
     VALUE obj, keystr;
 {
-    datum key;
-    struct dbmdata *dbmp;
-    GDBM_FILE dbm;
-
-    rb_secure(4);
-    StringValue(keystr);
-    key.dptr = RSTRING(keystr)->ptr;
-    key.dsize = RSTRING(keystr)->len;
+    VALUE valstr;
 
-    GetDBM(obj, dbmp);
-    dbm = dbmp->di_dbm;
-
-    if (!gdbm_exists(dbm, key)) {
-	if (rb_block_given_p()) rb_yield(keystr);
-	return Qnil;
-    }
-
-    if (gdbm_delete(dbm, key)) {
-	dbmp->di_size = -1;
-	rb_raise(rb_eGDBMError, "%s", gdbm_strerror(gdbm_errno));
-    }
-    else if (dbmp->di_size >= 0) {
-	dbmp->di_size--;
-    }
-    return obj;
+    valstr = fgdbm_fetch(obj, keystr, Qnil);
+    rb_gdbm_delete(obj, keystr);
+    return valstr;
 }
 
 static VALUE
@@ -438,7 +418,7 @@ static VALUE
 fgdbm_clear(obj)
     VALUE obj;
 {
-    datum key;
+    datum key, nextkey;
     struct dbmdata *dbmp;
     GDBM_FILE dbm;
 
@@ -447,6 +427,7 @@ fgdbm_clear(obj)
     dbm = dbmp->di_dbm;
     dbmp->di_size = -1;
 
+#if 0
     while (key = gdbm_firstkey(dbm), key.dptr) {
 	if (gdbm_delete(dbm, key)) {
 	    free(key.dptr);
@@ -454,6 +435,19 @@ fgdbm_clear(obj)
 	}
 	free(key.dptr); 
     }
+#else
+    while (key = gdbm_firstkey(dbm), key.dptr) {
+        for (; key.dptr; key = nextkey) {
+            nextkey = gdbm_nextkey(dbm, key);
+            if (gdbm_delete(dbm, key)) {
+                free(key.dptr);
+                if (nextkey.dptr) free(nextkey.dptr);
+                rb_raise(rb_eGDBMError, "%s", gdbm_strerror(gdbm_errno));
+            }
+            free(key.dptr);
+        }
+    }
+#endif
     dbmp->di_size = 0;
 
     return obj;

--
新井康司 (Koji Arai)

In This Thread