On 31/08/09 at 11:32 +0200, Petr Salinger wrote:
> >On the other hand, I see some problems with handling of fork()/exec().
> >>There really should be reinitialization of locks in child,
> >>the timer should be started using pthread_once(), the current
> >>approach is fragile and might lead to start of more timer threads.
> >>IMHO, the code needs audit in this area.
> >>
> >>I.e., I really doubt the following code in process.c
> >>for rb_f_fork(VALUE obj) is correct:
> >>
> >>    switch (pid = rb_fork(0, 0, 0, Qnil)) {
> >>      case 0:
> >>#ifdef linux
> >>        after_exec();
> >>#endif
> >>        rb_thread_atfork();
> >>        if (rb_block_given_p()) {
> >>            int status;
> >>
> >>            rb_protect(rb_yield, Qundef, &status);
> >>            ruby_stop(status);
> >>        }
> 
> >Do this problem only affect the Linuxthread-based pthread
> >implementations, or also NPTL? I think that ruby is written with the
> >asumption that pthread == NPTL, unfortunately...
> 
> The bug is timing dependent, i.e. there is a race condition.
> Sometimes the child process would have 2 timer threads, sometimes
> it would have the expected 1.
> 
> Only the probability of 2 is higher on linuxthreads compared to NPTL,
> but it can happen under any pthread implementation.
> 
> This particular case is guarded by "#ifdef linux", so we are not affected.
> 
> This kind of bug can be easily avoided by properly using the proper
> POSIX pthread interface, in this case pthread_once()
> http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_once.html
> 
> This would work correctly on both linuxthreads/NPTL and should on any
> POSIX pthread conforming implementation.
> 
> >Are there plans to switch to something that has
> >the exact NPTL semantics on FreeBSD ?
> 
> We plan to improve our conformance to POSIX pthread,
> currently i.e. the getpid() is not the same in all threads.
> 
> My point is that also the ruby should try to work under
> any POSIX pthread conforming implementation.
> 
> It i.e. should not use PTHREAD_CREATE_DETACHED and after that use 
> pthread_join.
> http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html:
> "The behavior is undefined if the value specified by the thread argument
> to pthread_join() does not refer to a joinable thread."
> 
> It should use pthread_sigmask() instead of sigprocmask()
> when available and so on.
> http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_sigmask.html:
> "The use of the sigprocmask() function is unspecified in a
> multi-threaded process."
> 
> That is why I call for the code audit in this area.
> 
> Ideally, it would not require full conformance, but also
> accept some known exceptions, like our getpid() difference.
> 
> As I already wrote, the hang in 1st test in
> http://redmine.ruby-lang.org/issues/show/1525
> also applies for us.

Hi Petr,

I don't really feel qualified to report a bug on this myself. Would you
take care of that? The official bug tracker is
http://redmine.ruby-lang.org/.

> On the other hand, the ruby 1.9.x is mostly working for us.
> Would be just possible to alert debian/rules somehow
> to also kill the hanged tests ? Due to previously mentioned
> timing issues,it might sometimes happen. It would be better
> compared to completely disabled testsuite.

Well, we could try to disable only the tests that are prone to hang.
-- 
| Lucas Nussbaum
| [email protected]   http://www.lucas-nussbaum.net/ |
| jabber: [email protected]             GPG: 1024D/023B3F4F |



-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to