morit****@razil*****
morit****@razil*****
2009年 7月 2日 (木) 14:15:41 JST
森です。
手元で試してみたところ、SIGABRTやSIGSEGVは再現しませんが、
Groonga::Databaseオブジェクトが二重に解放されていることを確認しました。
ruby -rgroonga -e "Groonga::Database.open('testdb')"を実行すると、
rb_grn_object_alloc
↓
grn_ctx_init
↓
grn_db_open
↓
grn_db_close
↓
grn_ctx_fin
↓
rb_grn_object_free
以上のようなシーケンスで、grn_db_closeで解放したオブジェクトを、
rb_grn_object_freeで再度解放しようとしています。
これを回避するためのruby-groongaに当てるpatchを作りました。
手元の環境ではこれで二重に解放されなくなりました。
試してみていただけると幸いです。
Index: ext/rb-grn-database.c
===================================================================
--- ext/rb-grn-database.c (リビジョン 412)
+++ ext/rb-grn-database.c (作業コピー)
@@ -71,6 +71,12 @@
return rb_grn_object_close(self);
}
+static VALUE
+rb_grn_database_alloc (VALUE klass)
+{
+ return Data_Wrap_Struct(klass, NULL, NULL, NULL);
+}
+
/*
* call-seq:
* Groonga::Database.create(options=nil) -> Groonga::Database
@@ -123,7 +129,7 @@
database = grn_db_create(context, path, &create_args);
rb_grn_context_check(context, rb_ary_new4(argc, argv));
- rb_database = rb_grn_object_alloc(klass);
+ rb_database = rb_grn_database_alloc(klass);
rb_grn_object_assign(rb_database, rb_context, context,
database, RB_GRN_TRUE);
rb_iv_set(rb_database, "context", rb_context);
@@ -203,7 +209,7 @@
{
VALUE database;
- database = rb_grn_object_alloc(klass);
+ database = rb_grn_database_alloc(klass);
rb_grn_database_initialize(argc, argv, database);
if (rb_block_given_p())
return rb_ensure(rb_yield, database, rb_grn_database_close, database);