[#14850] str[re, -1] raises NoMemoryError — nobu.nakada@...
なかだです。
6 messages
2001/10/03
[#14888] perl6 apocalypse 3 — nobu.nakada@...
なかだです。
7 messages
2001/10/04
[#14903] Re: [rubyist:0825] Re: Thread — nobu.nakada@...
なかだです。
8 messages
2001/10/09
[#14909] ext/socket h_addr_list — WATANABE Tetsuya <tetsu@...>
渡辺哲也です。
9 messages
2001/10/11
[#14922] alias $gvar — Koji Arai <JCA02266@...>
新井です。
19 messages
2001/10/14
[#14941] Re: alias $gvar
— matz@... (Yukihiro Matsumoto)
2001/10/16
まつもと ゆきひろです
[#14924] Re: alias $gvar
— nobu.nakada@...
2001/10/14
なかだです。
[#14932] Re: alias $gvar
— nobu.nakada@...
2001/10/15
なかだです。
[#14934] Re: alias $gvar
— Koji Arai <JCA02266@...>
2001/10/15
新井です。
[#14942] [BUG] SEGV: module_eval — Satoru Takabayashi <satoru@...>
こんなことする方が悪いという気がしますが、次のコードを実行す
5 messages
2001/10/16
[#14961] [PATCH] Marshal.load/dump — nobu.nakada@...
なかだです。
9 messages
2001/10/18
[#14962] alias var and trace_var — "K.Kosako" <kosako@...>
新井さんの指摘から、中田さんのパッチで
12 messages
2001/10/19
[#14963] Re: alias var and trace_var
— nobu.nakada@...
2001/10/19
なかだです。
[#14965] Re: alias var and trace_var
— "K.Kosako" <kosako@...>
2001/10/19
nobu.nakada@nifty.ne.jpさんの
[#14967] Re: alias var and trace_var
— nobu.nakada@...
2001/10/19
なかだです。
[#14971] Re: alias var and trace_var
— "K.Kosako" <kosako@...>
2001/10/22
nobu.nakada@nifty.ne.jpさんの
[#14984] [PATCH] stack overflow while GC marking. — nobu.nakada@...
なかだです。
7 messages
2001/10/23
[#14987] tracer.rb — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
5 messages
2001/10/23
[#14998] TCPSocket.gethostbyname で Segmentation fault — tomohiko machida <machida@...>
はじめまして。
4 messages
2001/10/25
[#15001] finalizer problem — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
3 messages
2001/10/25
[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>
わたなべです。
13 messages
2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error
— Shugo Maeda <shugo@...>
2001/10/26
前田です。
[#15207] Re: eval.c (rb_stack_check): prohibit recursive raising error
— nobu.nakada@...
2001/11/19
なかだです。
[#15209] Re: eval.c (rb_stack_check): prohibit recursive raising error
— matz@... (Yukihiro Matsumoto)
2001/11/19
まつもと ゆきひろです
[#15210] Re: eval.c (rb_stack_check): prohibit recursive raising error
— nobu.nakada@...
2001/11/19
なかだです。
[#15211] Re: eval.c (rb_stack_check): prohibit recursive raising error
— matz@... (Yukihiro Matsumoto)
2001/11/19
まつもと ゆきひろです
[#15212] Re: eval.c (rb_stack_check): prohibit recursive raising error
— nobu.nakada@...
2001/11/19
なかだです。
[#15214] Re: eval.c (rb_stack_check): prohibit recursive raising error
— matz@... (Yukihiro Matsumoto)
2001/11/19
まつもと ゆきひろです
[ruby-dev:14903] Re: [rubyist:0825] Re: Thread
From:
nobu.nakada@...
Date:
2001-10-09 06:44:21 UTC
List:
ruby-dev #14903
なかだです。
rubyist MLから転送。Threadのメソッド関連です。
At Sun, 07 Oct 2001 15:18:44 +0900 (JST),
Koji Arai <JCA02266@nifty.ne.jp> wrote:
> o Thread#status が aborting 状態に対して "run" を返すのは仕様
> ですか?(意味は通るけど、ソースからは読みとれなかったので確
> 認)
Thread#inspectでは"aborting"になるので、ヘンな気がします。
> o Thread.exit, Thread.kill, Thread#exit, Thread#kill, がスレッ
> ドの終了値(th->result)を設定しないのは仕様ですか?
killで設定できるのはむしろヘンだと思いますが、exitはresultを
渡せるようになっててもいいかも知れません。
> o Thread#priority = val が val を返さず self を返すのはバグですよね?
でしょう。
Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.209
diff -u -2 -p -r1.209 eval.c
--- eval.c 2001/10/05 05:49:02 1.209
+++ eval.c 2001/10/09 04:23:39
@@ -7111,4 +7111,22 @@ struct thread {
#define END_FOREACH(x) END_FOREACH_FROM(curr_thread,x)
+static const char *
+thread_status_name(status)
+ enum thread_status status;
+{
+ switch (status) {
+ case THREAD_RUNNABLE:
+ return "run";
+ case THREAD_STOPPED:
+ return "sleep";
+ case THREAD_TO_KILL:
+ return "aborting";
+ case THREAD_KILLED:
+ return "dead";
+ default:
+ return "unknown";
+ }
+}
+
/* $SAFE accessor */
void
@@ -8009,6 +8027,6 @@ rb_thread_run(thread)
static VALUE
-rb_thread_kill(thread)
- VALUE thread;
+thread_kill(thread, result)
+ VALUE thread, result;
{
rb_thread_t th = rb_thread_check(thread);
@@ -8024,4 +8042,5 @@ rb_thread_kill(thread)
th->gid = 0;
th->status = THREAD_TO_KILL;
+ th->result = result;
if (!rb_thread_critical) rb_thread_schedule();
return thread;
@@ -8029,4 +8048,11 @@ rb_thread_kill(thread)
static VALUE
+rb_thread_kill(th)
+ VALUE th;
+{
+ return thread_kill(th, Qfalse);
+}
+
+static VALUE
rb_thread_s_kill(obj, th)
VALUE obj, th;
@@ -8036,7 +8062,21 @@ rb_thread_s_kill(obj, th)
static VALUE
-rb_thread_exit()
+rb_thread_exit(argc, argv, th)
+ int argc;
+ VALUE *argv;
+ VALUE th;
+{
+ VALUE result = Qfalse;
+
+ rb_scan_args(argc, argv, "01", &result);
+ return rb_thread_kill(th, result);
+}
+
+static VALUE
+rb_thread_s_exit(argc, argv)
+ int argc;
+ VALUE *argv;
{
- return rb_thread_kill(curr_thread->thread);
+ return rb_thread_exit(argc, argv, curr_thread->thread);
}
@@ -8135,5 +8175,5 @@ rb_thread_priority_set(thread, prio)
th->priority = NUM2INT(prio);
rb_thread_schedule();
- return thread;
+ return prio;
}
@@ -8487,7 +8527,5 @@ rb_thread_status(thread)
}
- if (th->status == THREAD_STOPPED)
- return rb_str_new2("sleep");
- return rb_str_new2("run");
+ return rb_str_new2(thread_status_name(th->status));
}
@@ -8778,19 +8816,7 @@ rb_thread_inspect(thread)
char *cname = rb_class2name(CLASS_OF(thread));
rb_thread_t th = rb_thread_check(thread);
- char *status;
+ const char *status = thread_status_name(th->status);
VALUE str;
- switch (th->status) {
- case THREAD_RUNNABLE:
- status = "run"; break;
- case THREAD_STOPPED:
- status = "sleep"; break;
- case THREAD_TO_KILL:
- status = "aborting"; break;
- case THREAD_KILLED:
- status = "dead"; break;
- default:
- status = "unknown"; break;
- }
str = rb_str_new(0, strlen(cname)+7+16+9+1); /* 7:tags 16:addr 9:status 1:nul */
sprintf(RSTRING(str)->ptr, "#<%s:0x%lx %s>", cname, thread, status);
@@ -8958,5 +8984,5 @@ Init_Thread()
rb_define_singleton_method(rb_cThread, "stop", rb_thread_stop, 0);
rb_define_singleton_method(rb_cThread, "kill", rb_thread_s_kill, 1);
- rb_define_singleton_method(rb_cThread, "exit", rb_thread_exit, 0);
+ rb_define_singleton_method(rb_cThread, "exit", rb_thread_s_exit, -1);
rb_define_singleton_method(rb_cThread, "pass", rb_thread_pass, 0);
rb_define_singleton_method(rb_cThread, "current", rb_thread_current, 0);
@@ -8973,5 +8999,5 @@ Init_Thread()
rb_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0);
rb_define_method(rb_cThread, "kill", rb_thread_kill, 0);
- rb_define_method(rb_cThread, "exit", rb_thread_kill, 0);
+ rb_define_method(rb_cThread, "exit", rb_thread_exit, -1);
rb_define_method(rb_cThread, "value", rb_thread_value, 0);
rb_define_method(rb_cThread, "status", rb_thread_status, 0);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦