[#25636] [Oniguruma 3.X] reggnu.c — "K.Kosako" <sndgk393@...>

さっき気がついたのですが、元々は

15 messages 2005/02/05

[#25655] openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — Tanaka Akira <akr@...17n.org>

open-uri で https を扱うことを考えていろいろと調べていた所、openssl で、

9 messages 2005/02/08
[#25670] Re: openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — GOTOU Yuuzou <gotoyuzo@...> 2005/02/10

In message <876513vce0.fsf@serein.a02.aist.go.jp>,

[#25713] pthread trouble on sighandler — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

17 messages 2005/02/18
[#25714] Re: pthread trouble on sighandler — Yukihiro Matsumoto <matz@...> 2005/02/18

まつもと ゆきひろです

[#25755] I/O operation differs signal handler — Minero Aoki <aamine@...>

青木です。

14 messages 2005/02/24
[#25756] Re: I/O operation differs signal handler — Tanaka Akira <akr@...17n.org> 2005/02/24

In article <20050224091450P.aamine@loveruby.net>,

[ruby-dev:25656] Re: some problems on ext/tk/sample/**/*.rb

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2005-02-08 06:37:00 UTC
List: ruby-dev #25656
山本です。

>添付のパッチではいかがでしょう?

require 'mkmf'
if compiled?('tk')
  create_makefile('tkutil')
end

を ext/tk/tkutil/extconf.rb として作成し、
試した限りでは落ちなくなったようです。ただ、multi-ip の
サンプルがうまく動いていないようでした。

ext/tk/sample/multi-ip_sample.rb を実行して
最後に残ったタイマの "Stop" を何度か押していると、
下のようなメッセージを吐いて落ちてしまいます。

E:/ruby-cvs/bcc32/.ext/multi-tk.rb:1808: [BUG] Segmentation fault
ruby 1.9.0 (2005-02-07) [i386-bccwin32]


Abnormal program termination
TkpGetOtherWindow couldn't find window

パッチを当てる前(Rev1.2)はタイマが正しく動いていない
ようでしたが、Rev1.1も "Stop"で落ちました。

また、multi-ip_sample2.rb を実行すると、slaveが表示されないまま
固まってしまいます。パッチを当てる前は slave も表示されていました。

//////////////////////////////////////////////////////////////////////////

require 'tk'

menu_spec = [
  [['File', 0],
  ['exit(Crash)', proc{exit}, 0]]
]

TkMenubar.new(nil, menu_spec).pack
Tk.mainloop

でメニューから終了すると、画面中央に一瞬何かのウィンドウが表示される
ことがあります。すぐ閉じるので、なんて書いてあるのかは読めません。

#if 0 /* REMOVE : fail to rescue SystemExit */
            /* Tcl_Eval(interp, "destroy ."); */
            if (Tk_GetNumMainWindows() > 0) {
                Tk_Window main_win = Tk_MainWindow(interp);
                if (main_win != (Tk_Window)NULL) {
                    Tk_DestroyWindow(main_win);
                }
            }
#endif

を復活させると、表示されなくなりました。

//////////////////////////////////////////////////////////////////////////

+    if (!Tcl_InterpDeleted(ptr->ip)
+#if NAMESPACE_DEBUG
+        && !rbtk_invalid_namespace(ptr)
+#endif
+        && Tcl_Eval(ptr->ip, DEF_CANCEL_AFTER_SCRIPTS_PROC) == TCL_OK) {
+        if (!Tcl_InterpDeleted(ptr->ip) 
+#if NAMESPACE_DEBUG
+            && !rbtk_invalid_namespace(ptr)
+#endif
+            && Tcl_GetCommandInfo(ptr->ip, CANCEL_AFTER_SCRIPTS, &info)) {
+            DUMP2("call cancel after scripts proc '%s'", 
+                  CANCEL_AFTER_SCRIPTS);
+            Tcl_Eval(ptr->ip, CANCEL_AFTER_SCRIPTS);
+        }
+    }

ですが、落ちる原因がコマンド置換になかったので、

Tcl_Eval(ptr->ip, "foreach id [after info] {after cancel $id}");

に戻してもいいんじゃないかと思います。(こういうリファクタリングは大好きです)

////////////////////////////////////////////////////////////////////

私も、Tcl環境を抜けた後例外を再送することまでは考えていましたが、
どのTcl関数がruby側のコールバックを呼ぶかわからないので、その点で
引っかかっていました。

static VALUE foo = Qnil; // 例外を保存(シングルスレッドなので大丈夫なはず)

void hoge(void) {
    if (!NIL_P(foo)) {
        volatile VALUE res = foo;
        foo = Qnil;
        rb_raise(rb_eSystemExit, RSTRING(res)->ptr);
    }
}

....

    Tcl_DoOneEvent(...
    hoge();

....

    Tcl_Eval(.... // hoge を後ろに置く必要があるのは、他にもあるだろう
    hoge();

....

    ip_ruby_eval()
    {
        rb_protect(ip_ruby_eval_body, ....

        // 例外がおきたとき

        foo = res;

        return TCL_ERROR;
    }


In This Thread