* parse.y (dsym): :"symbol string" style should not contain `\0'.

* process.c (proc_detach): new method Proc#detach(pid) which
  create background watcher thread to issue waitpid. [new]

* process.c (rb_detach_process): utility function to detach
  process from C code.

* ext/pty/pty.c (pty_finalize_syswait): terminate watcher thread,
  and detach child process (by creating new idle waitpid watcher
  thread).

* ext/pty/pty.c (pty_syswait): may lost signal stopped child.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3561 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2003-03-07 05:59:42 +00:00
parent 5208fec1cf
commit 9d77639f30
9 changed files with 119 additions and 100 deletions

View file

@ -411,6 +411,33 @@ proc_waitall()
return result;
}
static VALUE
detach_process_watcer(pid_p)
int *pid_p;
{
int cpid, status;
for (;;) {
cpid = rb_waitpid(*pid_p, &status, WNOHANG);
if (cpid == -1) return Qnil;
rb_thread_sleep(1);
}
}
void
rb_detach_process(pid)
int pid;
{
rb_thread_create(detach_process_watcer, (void*)&pid);
}
static VALUE
proc_detach(obj, pid)
VALUE pid;
{
rb_detach_process(NUM2INT(pid));
}
#ifndef HAVE_STRING_H
char *strtok();
#endif
@ -1319,6 +1346,7 @@ Init_process()
rb_define_module_function(rb_mProcess, "waitpid", proc_wait, -1);
rb_define_module_function(rb_mProcess, "waitpid2", proc_wait2, -1);
rb_define_module_function(rb_mProcess, "waitall", proc_waitall, 0);
rb_define_module_function(rb_mProcess, "detach", proc_detach, 1);
rb_cProcStatus = rb_define_class_under(rb_mProcess, "Status", rb_cObject);
rb_undef_method(CLASS_OF(rb_cProcStatus), "new");