Package: ruby1.8 Version: 1.8.7.249-3 Severity: important Tags: patch User: [email protected] Usertags: kfreebsd
Hi, the current version have on GNU/kFreeBSD the same problem as described in http://redmine.ruby-lang.org/issues/show/2739 Please replace 100312_timeout-fix.dpatch by attached version. It would also be nice if you can ask upstream to include these "|| defined(__GLIBC__)" and "&& !defined(__GLIBC__)" changes. Thanks in advance Petr
#! /bin/sh /usr/share/dpatch/dpatch-run ## timeout-fix.dpatch by Lucas Nussbaum <[email protected]> ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: Fix problem with threads+timeouts. ## DP: Backports from upstream. See http://redmine.ruby-lang.org/issues/show/2739, https://bugs.launchpad.net/ubuntu/lucid/+source/eglibc/+bug/520715, Debian#539987 @DPATCH@ diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' ruby1.8-1.8.7.249~/ChangeLog ruby1.8-1.8.7.249/ChangeLog --- ruby1.8-1.8.7.249~/ChangeLog 2010-01-10 11:30:06.000000000 +0100 +++ ruby1.8-1.8.7.249/ChangeLog 2010-03-12 07:07:47.000000000 +0100 @@ -1,3 +1,18 @@ +Fri Jan 22 01:22:27 2010 NAKAMURA Usaku <[email protected]> + + * eval.c (thread_timer, rb_thread_stop_timer): check the timing of + stopping timer. patch from KOSAKI Motohiro <kosaki.motohiro _AT_ + jp.fujitsu.com> + + * eval.c (rb_thread_start_timer): NetBSD5 seems to be hung when calling + pthread_create() from pthread_atfork()'s parent handler. + + * io.c (pipe_open): workaround for NetBSD5. stop timer thread before + fork(), and start it if needed. + + * process.c (rb_f_fork, rb_f_system): ditto. + fixed [ruby-dev:40074] + Sun Jan 10 19:00:31 2010 Nobuyoshi Nakada <[email protected]> * lib/webrick/accesslog.rb : Escape needed. diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' ruby1.8-1.8.7.249~/eval.c ruby1.8-1.8.7.249/eval.c --- ruby1.8-1.8.7.249~/eval.c 2009-12-21 09:11:42.000000000 +0100 +++ ruby1.8-1.8.7.249/eval.c 2010-03-12 07:07:49.000000000 +0100 @@ -12292,6 +12292,8 @@ pthread_t thread; } time_thread = {PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER}; +static int timer_stopping; + #define safe_mutex_lock(lock) \ pthread_mutex_lock(lock); \ pthread_cleanup_push((void (*)_((void *)))pthread_mutex_unlock, lock) @@ -12316,6 +12318,9 @@ #define WAIT_FOR_10MS() \ pthread_cond_timedwait(&running->cond, &running->lock, get_ts(&to, PER_NANO/100)) while ((err = WAIT_FOR_10MS()) == EINTR || err == ETIMEDOUT) { + if (timer_stopping) + break; + if (!rb_thread_critical) { rb_thread_pending = 1; if (rb_trap_immediate) { @@ -12343,7 +12348,9 @@ safe_mutex_lock(&time_thread.lock); if (pthread_create(&time_thread.thread, 0, thread_timer, args) == 0) { thread_init = 1; +#if !defined(__NetBSD__) && !defined(linux) && !defined(__GLIBC__) pthread_atfork(0, 0, rb_thread_stop_timer); +#endif pthread_cond_wait(&start, &time_thread.lock); } pthread_cleanup_pop(1); @@ -12354,10 +12361,12 @@ { if (!thread_init) return; safe_mutex_lock(&time_thread.lock); + timer_stopping = 1; pthread_cond_signal(&time_thread.cond); thread_init = 0; pthread_cleanup_pop(1); pthread_join(time_thread.thread, NULL); + timer_stopping = 0; } #elif defined(HAVE_SETITIMER) static void diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' ruby1.8-1.8.7.249~/io.c ruby1.8-1.8.7.249/io.c --- ruby1.8-1.8.7.249~/io.c 2009-11-25 09:45:13.000000000 +0100 +++ ruby1.8-1.8.7.249/io.c 2010-03-12 07:07:49.000000000 +0100 @@ -3245,6 +3245,9 @@ } retry: +#if defined(__NetBSD__) || defined(linux) || defined(__GLIBC__) + rb_thread_stop_timer(); +#endif switch ((pid = fork())) { case 0: /* child */ if (modef & FMODE_READABLE) { @@ -3272,11 +3275,17 @@ ruby_sourcefile, ruby_sourceline, pname); _exit(127); } +#if defined(__NetBSD__) || defined(linux) || defined(__GLIBC__) + rb_thread_start_timer(); +#endif rb_io_synchronized(RFILE(orig_stdout)->fptr); rb_io_synchronized(RFILE(orig_stderr)->fptr); return Qnil; case -1: /* fork failed */ +#if defined(__NetBSD__) || defined(linux) || defined(__GLIBC__) + rb_thread_start_timer(); +#endif if (errno == EAGAIN) { rb_thread_sleep(1); goto retry; @@ -3297,6 +3306,9 @@ break; default: /* parent */ +#if defined(__NetBSD__) || defined(linux) || defined(__GLIBC__) + rb_thread_start_timer(); +#endif if (pid < 0) rb_sys_fail(pname); else { VALUE port = io_alloc(rb_cIO); diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' ruby1.8-1.8.7.249~/process.c ruby1.8-1.8.7.249/process.c --- ruby1.8-1.8.7.249~/process.c 2008-06-29 11:34:43.000000000 +0200 +++ ruby1.8-1.8.7.249/process.c 2010-03-12 07:07:49.000000000 +0100 @@ -1330,7 +1330,14 @@ fflush(stderr); #endif +#if defined(__NetBSD__) || defined(linux) || defined(__GLIBC__) + before_exec(); + pid = fork(); + after_exec(); + switch (pid) { +#else switch (pid = fork()) { +#endif case 0: #ifdef linux after_exec(); @@ -1570,6 +1577,9 @@ chfunc = signal(SIGCHLD, SIG_DFL); retry: +#if defined(__NetBSD__) || defined(linux) || defined(__GLIBC__) + before_exec(); +#endif pid = fork(); if (pid == 0) { /* child process */ @@ -1577,6 +1587,9 @@ rb_protect(proc_exec_args, (VALUE)&earg, NULL); _exit(127); } +#if defined(__NetBSD__) || defined(linux) || defined(__GLIBC__) + after_exec(); +#endif if (pid < 0) { if (errno == EAGAIN) { rb_thread_sleep(1);

