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);