[#36711] [Ruby 1.9 - Bug #4821][Open] Random Segfaults (in start_thread?) — Ivan Bortko <b2630639@...>

22 messages 2011/06/03

[#36730] [Ruby 1.9 - Feature #4824][Open] Provide method Kernel#executed? — Lazaridis Ilias <ilias@...>

56 messages 2011/06/04

[#36750] [Ruby 1.9 - Feature #4830][Open] Provide Default Variables for Array#each and other iterators — Lazaridis Ilias <ilias@...>

24 messages 2011/06/05

[#36785] [Ruby 1.9 - Feature #4840][Open] Allow returning from require — Rodrigo Rosenfeld Rosas <rr.rosas@...>

53 messages 2011/06/06
[#36811] Re: [Ruby 1.9 - Feature #4840][Open] Allow returning from require — Yusuke ENDOH <mame@...> 2011/06/07

Hello,

[#36799] [Ruby 1.9 - Feature #4845][Open] Provide Class#cb_object_instantiated_from_literal(object) — Lazaridis Ilias <ilias@...>

11 messages 2011/06/06

[#36834] [Ruby 1.9 - Feature #3905] rb_clear_cache_by_class() called often during GC for non-blocking I/O — Charles Nutter <headius@...>

10 messages 2011/06/08
[#36860] Re: [Ruby 1.9 - Feature #3905] rb_clear_cache_by_class() called often during GC for non-blocking I/O — Eric Wong <normalperson@...> 2011/06/08

Charles Nutter <headius@headius.com> wrote:

[#36863] Object#trust vs Object#taint — Aaron Patterson <aaron@...>

Hi,

16 messages 2011/06/08
[#36866] Re: Object#trust vs Object#taint — Yukihiro Matsumoto <matz@...> 2011/06/08

Hi,

[#36873] Re: Object#trust vs Object#taint — Aaron Patterson <aaron@...> 2011/06/09

On Thu, Jun 09, 2011 at 07:49:06AM +0900, Yukihiro Matsumoto wrote:

[#37071] [Ruby 1.9 - Feature #4877][Open] Unify Variable Expansion within Strings — Lazaridis Ilias <ilias@...>

12 messages 2011/06/12

[#37106] ruby core tutorials location — Roger Pack <rogerdpack2@...>

Hello all.

10 messages 2011/06/13
[#37107] Re: ruby core tutorials location — Jon <jon.forums@...> 2011/06/13

> Hello all.

[#37115] Re: ruby core tutorials location — Roger Pack <rogerdpack2@...> 2011/06/13

> Rather than adding links to source code, I would prefer the wikibooks link and others under a new Tutorials section of http://www.ruby-lang.org/en/documentation/ as well as adding http://ruby.runpaint.org/ to the existing Getting Started section.

[#37117] Re: ruby core tutorials location — Jon <jon.forums@...> 2011/06/13

> > Rather than adding links to source code, I would prefer the wikibooks link and others under a new Tutorials section of http://www.ruby-lang.org/en/documentation/ as well as adding http://ruby.runpaint.org/ to the existing Getting Started section.

[#37128] Re: ruby core tutorials location — Roger Pack <rogerdpack2@...> 2011/06/14

> I like what you're trying to do and see how great that tutorial connection from rdoc/yard could be, say, mixing with existing ruby-doc.org and rubydoc.info. ut I question embedding source links to info in which the info can easily grow outdated or abandoned as time passes. I also question the ongoing maintenance burdens.

[#37137] Re: ruby core tutorials location — Jon <jon.forums@...> 2011/06/14

> > I like what you're trying to do and see how great that tutorial connection from rdoc/yard could be, say, mixing with existing ruby-doc.org and rubydoc.info. ut I question embedding source links to info in which the info can easily grow outdated or abandoned as time passes. I also question the ongoing maintenance burdens.

[#37164] [Ruby 1.9 - Feature #4890][Open] Enumerable#lazy — Yutaka HARA <redmine@...>

30 messages 2011/06/16

[#37170] [Ruby 1.9 - Bug #4893][Open] Literal Instantiation breaks Object Model — Lazaridis Ilias <ilias@...>

61 messages 2011/06/16

[#37207] [Ruby 1.9 - Feature #4897][Open] Define Math::TAU and BigMath.TAU. The "true" circle constant, Tau=2*Pi. See http://tauday.com/ — Simon Baird <simon.baird@...>

43 messages 2011/06/17

[#37286] [Ruby 1.9 - Bug #4916][Open] [BUG] Segmentation fault - dyld: lazy symbol binding failed: Symbol not found: _ASN1_put_eoc — Hiroshi NAKAMURA <nakahiro@...>

9 messages 2011/06/22

[#37324] [Ruby 1.9 - Bug #4923][Open] [ext/openssl] test_ssl.rb: test_client_auth fails — Martin Bosslet <Martin.Bosslet@...>

19 messages 2011/06/23

[#37576] [Ruby 1.9 - Feature #4938][Open] Add Random.bytes [patch] — Marc-Andre Lafortune <ruby-core@...>

13 messages 2011/06/27

[#37612] [Ruby 1.9 - Bug #4941][Open] cannot load such file -- rubygems.rb (LoadError) — Lazaridis Ilias <ilias@...>

25 messages 2011/06/28

[ruby-core:37205] Re: [Request for Comment] avoid timer thread

From: Eric Wong <normalperson@...>
Date: 2011-06-17 20:15:25 UTC
List: ruby-core #37205
Eric Wong <normalperson@yhbt.net> wrote:
> I've even switched my Rainbows! instance (it calls fork+exec cgit.cgi)
> over to running Ruby trunk + your patch:

I found a race condition in my server that calls fork+exec
often:
  unicorn-3.7.0/lib/unicorn/app/exec_cgi.rb:66: [BUG] rb_thread_wakeup_timer_thread - write: Broken pipe (EPIPE)

exec_cgi.rb code is here, the fork { exec } is all in Ruby:
http://bogomips.org/unicorn.git/tree/lib/unicorn/app/exec_cgi.rb?id=v3.7.0

I've only seen this happen once out of 8000 or so requests (mostly search
spiders).  This process (Rainbows!) is also configured to use
multithreading, so there could be many things happening that could
fire a signal...

I'm testing the following fix on my server:
http://bogomips.org/ruby.git/commit/?h=sleepy-timer-thread&id=9154363119

I'm also sending SIGUSR1 every minute to increase the chance of hitting
this error and telling robots to crawl faster.

From 9154363119cd09a3b79aa45753d177ec65914f7c Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson@yhbt.net>
Date: Fri, 17 Jun 2011 19:52:48 +0000
Subject: [PATCH] defer timer thread wakeups after fork()

There is a small race condition where a signal can be received
immediately after fork() but before the timer thread pipe can be
reinitialized, leading to EPIPE on write().

We probably can't disable interrupt before forking due to
system/exec() issues; and we don't want to lose wakeups to the
parent process, so we check the cached pid vs getpid() whenever
rb_thread_wakeup_timer_thread() is called.
---
 thread_pthread.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/thread_pthread.c b/thread_pthread.c
index 1cc212b..3d99974 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -989,11 +989,18 @@ static void ping_signal_thread_list(void) { }
 #endif /* USE_SIGNAL_THREAD_LIST */
 
 static pthread_t timer_thread_id;
+static sig_atomic_t timer_thread_deferred;
+static pid_t timer_thread_pid;
 static int timer_thread_pipe[2];
 
 void
 rb_thread_wakeup_timer_thread(void)
 {
+    if (getpid() != timer_thread_pid) {
+	timer_thread_deferred = 1;
+	return;
+    }
+
     /* already opened */
     if (timer_thread_id && timer_thread_pipe[1]) {
 	const char *buff = "!";
@@ -1021,6 +1028,12 @@ thread_timer(void *p)
 
     if (TT_DEBUG) fprintf(stderr, "start timer thread\n");
 
+    if (timer_thread_deferred) {
+	timer_thread_deferred = 0;
+	ping_signal_thread_list();
+	timer_thread_function(0);
+    }
+
     while (system_working > 0) {
 	int err;
 
@@ -1093,6 +1106,7 @@ rb_thread_create_timer_thread(void)
 	    fprintf(stderr, "[FATAL] Failed to create timer thread (errno: %d)\n", err);
 	    exit(EXIT_FAILURE);
 	}
+	timer_thread_pid = getpid();
     }
     rb_disable_interrupt(); /* only timer thread recieve signal */
 }
@@ -1118,6 +1132,7 @@ native_reset_timer_thread(void)
 {
     if (TT_DEBUG)  fprintf(stderr, "reset timer thread\n");
     timer_thread_id = 0;
+    timer_thread_pid = 0;
 
     /* close */
     if (timer_thread_pipe[0] && close(timer_thread_pipe[0]) < 0) { rb_bug_errno("native_stop_timer_thread - close(ttp[0])", errno); }
-- 
Eric Wong

In This Thread