DL.callback as free function causes errors

こんにちは、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 ã—ã¦ã„ã‚‹åŽŸå› ãŒé•ã£ã¦ã„ã‚‹ãªã‚‰ã€ã“ã®ãƒ‘ãƒƒãƒã¯ç„¡ç”¨ã®ã‚‚ã®ã«ãªã‚Šã¾ã™ã€‚

e$B$J$+$@$G$9!#e(B

At Sun, 18 Mar 2007 10:43:11 +0900,
sheepman wrote in [ruby-dev:30620]:

DL::PtrData e$B%*%V%8%’%/%H$G$Oe(B ruby e$B$,e(B GC e$B$r$9$k;~$K8F$Ve(B
free function e$B$r;XDj$9$k$3$H$,$G$-$^$9!#e(B

e$BJ9$/$+$i$K4m81$=$&$J5!G=$G$9$,!#e(B

e$B$7$+$7!"$3$l$Oe(B segv e$B$7$^$9!#860x$r@53N$KDI$&$3$H$,$G$-$F$$$J$$$N$G$9$,!"e(B
e$B$*$=$i$/e(B GC e$B$N??:GCf$K%V%m%C%/$,8F$P$l$k$3$H$G5/$-$F$$$k$s$@$H;W$$$^$9!#e(B

e$B$H$$$&$o$1$G!"e(BDL::Symbol e$B%*%V%8%’%/%H$Ke(Bcallbacke$B$+$I$&$+$N%U%i%0$r;}$?$;$F!"e(B
callback e$B$Oe(B PtrData e$B$Ne(B free e$B4X?t$H$7$F;XDj$G$-$J$$$h$&$K%Q%C%A$r=q$$$F$_$^$7$?!#e(B

callbacke$B$Oe(Bfinalizere$B$KJQ49$7$FEPO?$9$k!"$H$$$&$N$O$I$&$G$7$g$&$+!#e(B
finalizere$B$Oe(BGCe$B=*N;D>8e$K<B9T$5$l$^$9!#e(B

e$B$3$s$P$s$O!"e(Bsheepman e$B$G$9!#e(B

On Sun, 18 Mar 2007 11:46:59 +0900
Nobuyoshi N. [email protected] wrote:

callbacke$B$Oe(Bfinalizere$B$KJQ49$7$FEPO?$9$k!"$H$$$&$N$O$I$&$G$7$g$&$+!#e(B
finalizere$B$Oe(BGCe$B=*N;D>8e$K<B9T$5$l$^$9!#e(B

e$B9M$($F$_$?$s$G$9$,!"$I$&e(B finalizer
e$B$r;H$($PNI$$$N$+$o$+$j$^$;$s$G$7$?!#e(B

sheepman wrote:

DL::PtrData e$B%*%V%8%’%/%H$G$Oe(B ruby e$B$,e(B GC e$B$r$9$k;~$K8F$Ve(B
free function e$B$r;XDj$9$k$3$H$,$G$-$^$9!#e(B

e$B$G!"$?$H$($Pe(B regex e$B%i%$%V%i%j$@$He(B regfree e$B$7$?$"$H$K!"e(B
free e$B$r8F$S$?$$$N$G!"0J2<$N$h$&$Je(B DL.callback e$B$r;H$C$?%3!<%I$re(B
e$B=q$-$?$/$J$j$^$9!#e(B

e$B$J$k$[$I!#e(B

e$B$H$$$&$o$1$G!"e(BDL::Symbol e$B%*%V%8%’%/%H$Ke(Bcallbacke$B$+$I$&$+$N%U%i%0$r;}$?$;$F!“e(B
callback e$B$Oe(B PtrData e$B$Ne(B free e$B4X?t$H$7$F;XDj$G$-$J$$$h$&$K%Q%C%A$r=q$$$F$_$^$7$?!#e(B
segv e$B$7$F$$$k860x$,0c$C$F$$$k$J$i!”$3$N%Q%C%A$OL5MQ$N$b$N$K$J$j$^$9!#e(B

e$B9*$/2r7h$G$-$k$^$G$O!"$R$H$^$:%Q%C%A$r<u$1F~$l$F;XDj$G$-$J$$$h$&$K$7$F$*$3$&$H;W$$$^$9!#e(B