[#20490] [BUG] evalがらみでSIGSEGV — "yamamoto madoka" <dan@...2.so-net.ne.jp>
こんにちは、山本 円と申します。
[#20495] 不正なバイト列とのマッチ — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#20499] Re: [ruby-cvs] ruby/ext/curses: * string.c (rb_str_shared_replace): clear flags before copy. — nobu.nakada@...
なかだです。
まつもと ゆきひろです
わたなべです。
まつもと ゆきひろです
わたなべです。
[#20525] [BigDecimal] changing rule of coerce — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>
斎藤です。
小林です。
まつもと ゆきひろです
小林です。
小林です。
前田です。
小林です。
小林です。
小林です。
小林です。
小林です。
[#20570] Marshal upgrade — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
咳といいます。
まつもと ゆきひろです
まつもと ゆきひろです
新井です。
新井です。
まつもと ゆきひろです
咳といいます。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
[#20580] add library(Re:ruby-dev:20570) — たむらけんいち <sgs02516@...>
たむらです。
なひです。
In message <038d01c349cb$eaad71d0$93222fc0@sarion.co.jp>,
まつもと ゆきひろです
In message <1058171960.400840.10041.nullmailer@picachu.netlab.jp>,
話をそらしてしまうかもしれませんが、
In message <20030714.183104.09092354.taca@back-street.net>,
In message <20030715.013655.424936247.gotoyuzo@kotetsu.does.notwork.org>
In message <20030715.025907.26217115.taca@back-street.net>,
In message <20030715.051853.968499478.gotoyuzo@kotetsu.does.notwork.org>
In message <20030721.163444.09092937.taca@back-street.net>,
In message <20030721.191306.60866533.gotoyuzo@kotetsu.does.notwork.org>
In message <20030721.211845.20473808.taca@back-street.net>,
In message <20030722.002037.774147317.gotoyuzo@kotetsu.does.notwork.org>
In message <20030722.003236.72433302.taca@back-street.net>,
[#20582] rexmlのuconv依存 — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
まつもと ゆきひろです
In article <1057770842.878440.16422.nullmailer@picachu.netlab.jp>,
なかだです。
In article <200307100751.h6A7pLFs003667@sharui.nakada.kanuma.tochigi.jp>,
[#20606] ruby-1.8.0 on BSD/OS — OHARA Shigeki <os@...>
大原です。
[#20613] compiling Ruby on AIX (powerpc-ibm-aix4.3.3.0) and Alpha OSF/1 (alphaev67-dec-osf5.1) — NISHIMATSU Takeshi <t-nissie@...>
西松と申します.
なかだです。
西松です. お返事が遅くなり申し訳ありません.
[#20631] SOAP4R in 1.8.0? — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#20655] frozen ThreadGroup — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
まつもと ゆきひろです
In article <1058719939.886480.22830.nullmailer@picachu.netlab.jp>,
[#20680] 1.8.0 on IA64 etc. — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#20691] Re: [Oniguruma] explicit capture — kkosako@...
> -----Original Message-----
[#20716] Re: [Oniguruma] explicit capture — kkosako@...
> -----Original Message-----
[#20748] [BigDecimal] exception handling — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>
斎藤です。
[#20765] Re: [ruby-cvs] ruby/lib: * lib/tmpdir.rb: new library to get temporary directory path, — WATANABE Hirofumi <eban@...>
わたなべです。
まつもと ゆきひろです
わたなべです。
まつもと ゆきひろです
わたなべです。
[#20780] complex.rb — Masahiro TANAKA <masa@...>
complex.rb についての修正案を[ruby-math:00543]で提案しましたが、その後
まつもと ゆきひろです
けいじゅ@いしつかです.
At Tue, 22 Jul 2003 17:30:31 +0900, Yukihiro Matsumoto wrote:
まつもと ゆきひろです
けいじゅ@いしつかです.
At Sat, 26 Jul 2003 06:52:21 +0900, 石塚圭樹 wrote:
[#20791] 1.8.0 preview4 schedule — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
永井@知能.九工大です.
[#20795] warning: terminated thread — Masatoshi SEKI <m_seki@...>
咳といいます。
mput です。こんばんわ。
まつもと ゆきひろです
[#20800] 0**(-1) with rational — Tanaka Akira <akr@...17n.org>
そういえば思い出したのですが、rational を require しているときとしてい
At Wed, 23 Jul 2003 03:30:41 +0900, Tanaka Akira wrote:
[#20810] Rational 始めました。 — Shin-ichiro HARA <sinara@...>
原です。
けいじゅ@いしつかです.
In article <200307241940.EAA14225.keiju@ishitsuka.com>,
けいじゅ@いしつかです.
In article <200307271500.AAA04363.keiju@bc.mbn.or.jp>,
[#20818] ThreadGroup#wait — nobu.nakada@...
なかだです。
まつもと ゆきひろです
[#20868] ruby 1.8.0 preview4 — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#20887] ext/openssl undefined BN_pseudo_rand_range — Kazuhiro Yoshida <moriq@...>
もりきゅうです。
[#20915] [BUG] errno == 0 — Kazuhiro Yoshida <moriq@...>
もりきゅうです。win32だけかもしれません。
まつもと ゆきひろです
もりきゅうです。
[#20932] move ChangeLog — Tanaka Akira <akr@...17n.org>
提案なんですが、1.8.0 が出たらそこまでのぶんの ChangeLog を移動しませ
[#20949] multiple Tk interpreter support — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#20954] ruby 1.8.0 preview5 — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
もりきゅうです。
Siena. です。
[#20957] [BigDecimal] conflict between Numeric#div and BigDecimal#div — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>
斎藤です。
At Mon, 28 Jul 2003 18:26:20 +0900, Tadashi Saito wrote:
まつもと ゆきひろです
At Mon, 28 Jul 2003 21:16:08 +0900, Yukihiro Matsumoto wrote:
まつもと ゆきひろです
At Tue, 29 Jul 2003 14:43:19 +0900, Yukihiro Matsumoto wrote:
原です。
[#20989] Re: [Oniguruma] explicit capture — kkosako@...
> -----Original Message-----
[#21027] -W option — WATANABE Hirofumi <eban@...>
わたなべです。
[ruby-dev:20818] ThreadGroup#wait
なかだです。
# 時期的に微妙ですが。
ThreadGroupの使い途があまりないなと思っていたんですが、thgroup
が追加されたのを機会に、ThreadGroup#waitというのを作ってみまし
た。
Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.491
diff -u -2 -p -r1.491 eval.c
--- eval.c 22 Jul 2003 08:42:44 -0000 1.491
+++ eval.c 23 Jul 2003 07:01:00 -0000
@@ -8335,12 +8442,17 @@ rb_thread_ready(th)
}
+static void thgroup_notify _((VALUE, rb_thread_t));
+
static void
rb_thread_die(th)
rb_thread_t th;
{
+ VALUE thg = th->thgroup;
+
th->thgroup = 0;
th->status = THREAD_KILLED;
if (th->stk_ptr) free(th->stk_ptr);
th->stk_ptr = 0;
+ thgroup_notify(thg, th);
}
@@ -8352,7 +8464,7 @@ rb_thread_remove(th)
rb_thread_ready(th);
- rb_thread_die(th);
th->prev->next = th->next;
th->next->prev = th->prev;
+ rb_thread_die(th);
}
@@ -9025,5 +9137,4 @@ rb_thread_kill(thread)
rb_thread_ready(th);
- th->thgroup = 0;
th->status = THREAD_TO_KILL;
if (!rb_thread_critical) rb_thread_schedule();
@@ -9180,4 +9291,18 @@ rb_thread_abort_exc_set(thread, val)
}
+VALUE
+rb_thread_group(thread)
+ VALUE thread;
+{
+ rb_thread_t th = rb_thread_check(thread);
+ return th->thgroup;
+}
+
+struct thgroup {
+ int enclosed, count;
+ VALUE group;
+ VALUE waiting;
+};
+
#define THREAD_ALLOC(th) do {\
th = ALLOC(struct thread);\
@@ -9218,4 +9343,6 @@ rb_thread_abort_exc_set(thread, val)
th->thgroup = thgroup_default;\
th->locals = 0;\
+\
+ ((struct thgroup *)DATA_PTR(th->thgroup))->count++;\
} while (0)
@@ -9334,5 +9461,7 @@ rb_thread_start_0(fn, arg, th_arg)
curr_thread->next = th;
th->priority = curr_thread->priority;
+ ((struct thgroup *)DATA_PTR(th->thgroup))->count--;
th->thgroup = curr_thread->thgroup;
+ ((struct thgroup *)DATA_PTR(th->thgroup))->count++;
}
@@ -9547,5 +9676,4 @@ rb_thread_cleanup()
if (th->status != THREAD_KILLED) {
rb_thread_ready(th);
- th->thgroup = 0;
th->priority = 0;
if (th != main_thread) {
@@ -9882,8 +10010,10 @@ rb_cont_call(argc, argv, cont)
}
-struct thgroup {
- int enclosed;
- VALUE group;
-};
+static void
+thgroup_mark(ptr)
+ struct thgroup *ptr;
+{
+ rb_gc_mark(ptr->waiting);
+}
static VALUE thgroup_s_alloc _((VALUE));
@@ -9895,5 +10025,5 @@ thgroup_s_alloc(klass)
struct thgroup *data;
- group = Data_Make_Struct(klass, struct thgroup, 0, free, data);
+ group = Data_Make_Struct(klass, struct thgroup, thgroup_mark, free, data);
data->enclosed = 0;
data->group = group;
@@ -9952,5 +10082,5 @@ thgroup_add(group, thread)
{
rb_thread_t th;
- struct thgroup *data;
+ struct thgroup *data, *old;
rb_secure(4);
@@ -9972,13 +10102,83 @@ thgroup_add(group, thread)
rb_raise(rb_eThreadError, "can't move from the frozen thread group");
}
- Data_Get_Struct(th->thgroup, struct thgroup, data);
- if (data->enclosed) {
+ Data_Get_Struct(th->thgroup, struct thgroup, old);
+ if (old->enclosed) {
rb_raise(rb_eThreadError, "can't move from the enclosed thread group");
}
+ --old->count;
+ ++data->count;
th->thgroup = group;
return group;
}
+static VALUE
+thgroup_wait(group)
+ VALUE group;
+{
+ struct thgroup *data;
+ rb_thread_t th;
+ VALUE waiting, result;
+
+ Data_Get_Struct(group, struct thgroup, data);
+ switch (data->count) {
+ case 1:
+ if (curr_thread->thgroup != group) break;
+ case 0:
+ return Qnil;
+ }
+ if (!(waiting = data->waiting)) {
+ waiting = rb_ary_new();
+ OBJ_TAINT(waiting);
+ data->waiting = waiting;
+ }
+ rb_ary_push(waiting, curr_thread->thread);
+ curr_thread->status = THREAD_STOPPED;
+ curr_thread->wait_for = 0;
+ curr_thread->join = 0;
+ rb_thread_schedule();
+ th = curr_thread->join;
+ curr_thread->join = 0;
+ result = th ? th->thread : Qnil;
+ if (rb_block_given_p()) {
+ result = rb_yield(result);
+ }
+ return result;
+}
+
+static void
+thgroup_notify(group, thread)
+ VALUE group;
+ rb_thread_t thread;
+{
+ struct thgroup *data;
+ rb_thread_t th;
+ VALUE waiting;
+ int i;
+
+ Data_Get_Struct(group, struct thgroup, data);
+ --data->count;
+ waiting = data->waiting;
+ if (!waiting || !RARRAY(waiting)->len) return;
+ for (i = 0; i < RARRAY(waiting)->len; ++i) {
+ th = (rb_thread_t)RDATA(RARRAY(waiting)->ptr[i])->data;
+ if (!rb_thread_dead(th)) {
+ rb_thread_ready(th);
+ th->join = thread;
+ }
+ }
+ rb_ary_clear(waiting);
+}
+
+static VALUE
+thgroup_count(group)
+ VALUE group;
+{
+ struct thgroup *data;
+
+ Data_Get_Struct(group, struct thgroup, data);
+ return INT2FIX(data->count);
+}
+
void
Init_Thread()
@@ -10027,4 +10227,5 @@ Init_Thread()
rb_define_method(rb_cThread, "priority=", rb_thread_priority_set, 1);
rb_define_method(rb_cThread, "safe_level", rb_thread_safe_level, 0);
+ rb_define_method(rb_cThread, "group", rb_thread_group, 0);
rb_define_method(rb_cThread, "[]", rb_thread_aref, 1);
@@ -10047,4 +10248,6 @@ Init_Thread()
rb_define_method(cThGroup, "enclosed?", thgroup_enclosed_p, 0);
rb_define_method(cThGroup, "add", thgroup_add, 1);
+ rb_define_method(cThGroup, "wait", thgroup_wait, 0);
+ rb_define_method(cThGroup, "count", thgroup_count, 0);
thgroup_default = rb_obj_alloc(cThGroup);
rb_define_const(cThGroup, "Default", thgroup_default);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦