/* * call-seq: * thr.join => thr * thr.join(limit) => thr * * The calling thread will suspend execution and run <i>thr</i>. Does not * return until <i>thr</i> exits or until <i>limit</i> seconds have passed. If * the time limit expires, <code>nil</code> will be returned, otherwise * <i>thr</i> is returned. * * Any threads not joined will be killed when the main program exits. If * <i>thr</i> had previously raised an exception and the * <code>abort_on_exception</code> and <code>$DEBUG</code> flags are not set * (so the exception has not yet been processed) it will be processed at this * time. * * a = Thread.new { print "a"; sleep(10); print "b"; print "c" } * x = Thread.new { print "x"; Thread.pass; print "y"; print "z" } * x.join # Let x thread finish, a will be killed on exit. * * <em>produces:</em> * * axyz * * The following example illustrates the <i>limit</i> parameter. * * y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }} * puts "Waiting" until y.join(0.15) * * <em>produces:</em> * * tick... * Waiting * tick... * Waitingtick... * * * tick... */ static VALUE rb_thread_join_m(argc, argv, thread) int argc; VALUE *argv; VALUE thread; { VALUE limit; double delay = DELAY_INFTY; rb_scan_args(argc, argv, "01", &limit); if (!NIL_P(limit)) delay = rb_num2dbl(limit); if (!rb_thread_join0(rb_thread_check(thread), delay)) return Qnil; return thread; }