[#30455] a[] += 1 で SEGV — "Hiroki Motoyoshi" <himotoyoshi.ml@...>
本吉と申します。
6 messages
2007/03/01
[#30477] ThreadError on shell.rb — "Akira ODA" <oda.org@...>
はじめまして、尾田といいます。
8 messages
2007/03/04
[#30478] Re: ThreadError on shell.rb
— keiju@... (石塚圭樹)
2007/03/04
けいじゅ@いしつかです.
[#30482] Ruby 1.8.6 preview3 has been released — "Akinori MUSHA" <knu@...>
Ruby 1.8.6 preview3 をリリースしました。
10 messages
2007/03/04
[#30489] Re: Ruby 1.8.6 preview3 has been released
— nekomaho <nekomaho@...>
2007/03/05
ねこまほです.
[#30486] str.lines[1..-1] — Minero Aoki <aamine@...>
青木です。
7 messages
2007/03/05
[#30487] Time#to_s format — OHARA Shigeki <os@...>
大原です。
6 messages
2007/03/05
[#30504] num_tとthread_initという名前について — "Yutaka Kanemoto" <kinpoco@...>
金本ともうします。
1 message
2007/03/07
[#30505] [BUG?] SIGTERM の取り扱い — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
10 messages
2007/03/08
[#30509] Re: [BUG?] SIGTERM の取り扱い
— Nobuyoshi Nakada <nobu@...>
2007/03/08
なかだです。
[#30510] Re: [BUG?] SIGTERM の取り扱い
— Yukihiro Matsumoto <matz@...>
2007/03/08
まつもと ゆきひろです
[#30531] DL::PtrData#to_a dumps core — sheepman <sheepman@...>
こんばんは、sheepman です。
4 messages
2007/03/11
[#30532] DL::PtrData#inspect — sheepman <sheepman@...>
こんばんは、sheepman です。
6 messages
2007/03/11
[#30537] Microsoft-IIS 上で cgi.rb がレスポンス行を2重に出力する — MIYASAKA Masaru <alkaid@...>
初めての投稿です。みやさか と申します。よろしくお願いいたします。
5 messages
2007/03/12
[#30549] [ANN] Ruby 1.8.6 has been released — "Akinori MUSHA" <knu@...>
Ruby 1.8.6 をリリースしました。
14 messages
2007/03/12
[#30555] Re: [ANN] Ruby 1.8.6 has been released
— "U.Nakamura" <usa@...>
2007/03/13
こんにちは、なかむら(う)です。
[#30558] Re: [ANN] Ruby 1.8.6 has been released
— moonwolf@...
2007/03/13
おひさしぶり、MoonWolfです。
[#30559] Re: [ANN] Ruby 1.8.6 has been released
— nekomaho <nekomaho@...>
2007/03/13
ねこまほです.
[#30553] help: lib/shell for ruby 1.9 — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
13 messages
2007/03/13
[#30585] Re: help: lib/shell for ruby 1.9
— Yukihiro Matsumoto <matz@...>
2007/03/15
まつもと ゆきひろです
[#30587] Re: help: lib/shell for ruby 1.9
— keiju@... (石塚圭樹)
2007/03/15
けいじゅ@いしつかです.
[#30588] Re: help: lib/shell for ruby 1.9
— Yukihiro Matsumoto <matz@...>
2007/03/15
まつもと ゆきひろです
[#30590] [BUG?] Mutex or ConditionVariable for ruby 1.8[Re: Re: help: lib/shell for ruby 1.9]
— keiju@... (石塚圭樹)
2007/03/15
けいじゅ@いしつかです.
[#30592] Re: [BUG?] Mutex or ConditionVariable for ruby 1.8[Re: Re: help: lib/shell for ruby 1.9]
— "Akinori MUSHA" <knu@...>
2007/03/15
At Thu, 15 Mar 2007 18:53:46 +0900,
[#30600] Re: [BUG?] Mutex or ConditionVariable for ruby 1.8[Re: Re: help: lib/shell for ruby 1.9]
— "Akinori MUSHA" <knu@...>
2007/03/16
At Thu, 15 Mar 2007 19:18:42 +0900,
[#30601] Re: [BUG?] Mutex or ConditionVariable for ruby 1.8[Re: Re: help: lib/shell for ruby 1.9]
— keiju@... (keiju ISHITSUKA)
2007/03/16
けいじゅ@いしつかです.
[#30564] release code and revision number — Nobuyoshi Nakada <nobu@...>
なかだです。
11 messages
2007/03/13
[#30566] Re: release code and revision number
— Urabe Shyouhei <shyouhei@...>
2007/03/14
卜部です
[#30581] [ruby-core:10580] Thread後のexecでENOTSUPPエラー対応 — "H.Holon" <holon@...>
相馬 - H.Holonです。
8 messages
2007/03/14
[#30646] Re: [ruby-core:10580] Thread後のexecでENOTSUPPエラー対応
— Nobuyoshi Nakada <nobu@...>
2007/03/19
なかだです。
[#30586] Etc.getgrgid が getgid の値に固定されています — 植田裕之 <ueda@...>
植田と申します。
5 messages
2007/03/15
[#30593] [BUG] waitpid for ruby-trunk — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
5 messages
2007/03/15
[#30612] stdout flush in fork — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
9 messages
2007/03/17
[#30614] Re: stdout flush in fork
— Yukihiro Matsumoto <matz@...>
2007/03/17
まつもと ゆきひろです
[#30616] Re: stdout flush in fork
— keiju@... (石塚圭樹)
2007/03/17
けいじゅ@いしつかです.
[#30620] DL.callback as free function causes errors — sheepman <sheepman@...>
こんにちは、sheepman です。
4 messages
2007/03/18
[#30627] [ ruby-Bugs-9360 ] Matrix inverse problem — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
4 messages
2007/03/19
[#30648] YARVでのalias名の取得方法 — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
5 messages
2007/03/20
[#30653] [BUG] queue 0x424010 freed with live thread(s) waiting — Masatoshi SEKI <m_seki@...>
咳といいます。
4 messages
2007/03/20
[#30655] win32/registry wtime — moonwolf@...
MoonWolfです。
11 messages
2007/03/20
[#30658] Unicode対応と文字化け(Re: win32/registry wtime)
— Yukihiro Matsumoto <matz@...>
2007/03/21
まつもと ゆきひろです
[#30659] Re: Unicode対応と文字化け(Re: win32/registry wtime)
— Tietew <tietew+ruby-dev@...>
2007/03/21
win32/registry.rb を書いた Tietew です。
[ruby-dev:30620] DL.callback as free function causes errors
From:
sheepman <sheepman@...>
Date:
2007-03-18 01:43:11 UTC
List:
ruby-dev #30620
こんにちは、sheepman です。
DL::PtrData オブジェクトでは ruby が GC をする時に呼ぶ
free function を指定することができます。
で、たとえば regex ライブラリだと regfree したあとに、
free を呼びたいので、以下のような DL.callback を使ったコードを
書きたくなります。
require 'dl'
include DL
h = dlopen(nil)
regcomp = h.sym('regcomp', 'IPSI')
regfree = h.sym('regfree', '0P')
free = callback('0P'){|ptr|
regfree[ptr]
FREE[ptr]
}
100000.times do |i|
ptr = PtrData.malloc(50, free)
regcomp.call(ptr, '123', 0)
end
しかし、これは segv します。原因を正確に追うことができていないのですが、
おそらく GC の真最中にブロックが呼ばれることで起きているんだと思います。
というわけで、DL::Symbol オブジェクトにcallbackかどうかのフラグを持たせて、
callback は PtrData の free 関数として指定できないようにパッチを書いてみました。
segv している原因が違っているなら、このパッチは無用のものになります。
--
sheepman / TAMURA Takashi
sheepman@sheepman.sakura.ne.jp
Attachments (1)
dl.pacth.txt
(3 KB, text/x-diff)
Index: dl.c
===================================================================
--- dl.c (revision 12087)
+++ dl.c (working copy)
@@ -653,7 +653,7 @@
rb_assoc_new(INT2NUM(rettype),INT2NUM(entry)),
rb_assoc_new(type,proc));
sprintf(fname, "rb_dl_callback_func_%d_%d", rettype, entry);
- return rb_dlsym_new((void (*)())rb_dl_callback_table[rettype][entry],
+ return rb_dlsym_callback_new((void (*)())rb_dl_callback_table[rettype][entry],
fname, RSTRING(type)->ptr);
}
Index: dl.h
===================================================================
--- dl.h (revision 12087)
+++ dl.h (working copy)
@@ -261,6 +261,7 @@
char *name;
char *type;
int len;
+ int is_callback;
};
enum DLPTR_CTYPE {
Index: ptr.c
===================================================================
--- ptr.c (revision 12087)
+++ ptr.c (working copy)
@@ -128,6 +128,15 @@
return rb_dlptr_new2(rb_cDLPtrData, ptr, size, func);
}
+static
+void
+dlptr_check_free_func(VALUE sym)
+{
+ if(rb_dlsym_is_callback(sym) == Qtrue){
+ rb_raise(rb_eDLTypeError, "free function must not be callbak defined by DL.callback");
+ }
+}
+
VALUE
rb_dlptr_malloc(long size, freefunc_t func)
{
@@ -200,6 +209,7 @@
case 3:
p = (void*)(DLNUM2LONG(rb_Integer(ptr)));
s = DLNUM2LONG(size);
+ dlptr_check_free_func(sym);
f = rb_dlsym2csym(sym);
break;
default:
@@ -233,6 +243,7 @@
break;
case 2:
s = NUM2INT(size);
+ dlptr_check_free_func(sym);
f = rb_dlsym2csym(sym);
break;
default:
@@ -285,6 +296,8 @@
{
struct ptr_data *data;
+ dlptr_check_free_func(val);
+
Data_Get_Struct(self, struct ptr_data, data);
data->free = DLFREEFUNC(rb_dlsym2csym(val));
Index: sym.c
===================================================================
--- sym.c (revision 12087)
+++ sym.c (working copy)
@@ -108,6 +108,17 @@
return val;
}
+VALUE
+rb_dlsym_callback_new(void (*func)(), const char *name, const char *type)
+{
+ VALUE val;
+ struct sym_data *data;
+ val = rb_dlsym_new(func, name, type);
+ Data_Get_Struct(val, struct sym_data, data);
+ data->is_callback = 1;
+ return val;
+}
+
freefunc_t
rb_dlsym2csym(VALUE val)
{
@@ -139,7 +150,8 @@
data->name = 0;
data->type = 0;
data->len = 0;
-
+ data->is_callback = 0;
+
return obj;
}
@@ -185,6 +197,14 @@
}
VALUE
+rb_dlsym_is_callback(VALUE self)
+{
+ struct sym_data *sym;
+ Data_Get_Struct(self, struct sym_data, sym);
+ return sym->is_callback ? Qtrue : Qfalse;
+}
+
+VALUE
rb_dlsym_name(VALUE self)
{
struct sym_data *sym;
@@ -974,6 +994,7 @@
rb_define_method(rb_cDLSymbol, "call", rb_dlsym_call, -1);
rb_define_method(rb_cDLSymbol, "[]", rb_dlsym_call, -1);
rb_define_method(rb_cDLSymbol, "name", rb_dlsym_name, 0);
+ rb_define_method(rb_cDLSymbol, "is_callback?", rb_dlsym_is_callback, 0);
rb_define_method(rb_cDLSymbol, "proto", rb_dlsym_proto, 0);
rb_define_method(rb_cDLSymbol, "cproto", rb_dlsym_cproto, 0);
rb_define_method(rb_cDLSymbol, "inspect", rb_dlsym_inspect, 0);