Skip to content
  • Eric Wong's avatar
    70a8a6d3
    thread_pthread.c: main thread always gets hit by signals · 70a8a6d3
    Eric Wong authored
    We need to ensure Signal.trap handlers can function if the main
    thread is sleeping after a subthread has grabbed sigwait_fd,
    but later exited.
    
    Consider the following timeline:
    
    main_thread             sub-thread
    -----------------------------------------
    Signal.trap() { ... }
                            get sigwait_fd
                            ppoll on sigwait_fd
    native_cond_sleep
    (via pthread_cond_wait)
                            ppoll times-out
    			put sigwait_fd
                            sub-thread exits
    
    only thread alive
    SIGNAL HITS
    
    The problem is pthread_cond_wait cannot return EINTR,
    so we can never run the Signal.trap handler.  So we
    will avoid using native_cond_sleep in the main thread
    and always use ppoll to sleep when in the main thread.
    This can guarantee the main thread remains aware of
    signals; even if it cannot safely read off sigwait_fd
    
    git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64538 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
    70a8a6d3
    thread_pthread.c: main thread always gets hit by signals
    Eric Wong authored
    We need to ensure Signal.trap handlers can function if the main
    thread is sleeping after a subthread has grabbed sigwait_fd,
    but later exited.
    
    Consider the following timeline:
    
    main_thread             sub-thread
    -----------------------------------------
    Signal.trap() { ... }
                            get sigwait_fd
                            ppoll on sigwait_fd
    native_cond_sleep
    (via pthread_cond_wait)
                            ppoll times-out
    			put sigwait_fd
                            sub-thread exits
    
    only thread alive
    SIGNAL HITS
    
    The problem is pthread_cond_wait cannot return EINTR,
    so we can never run the Signal.trap handler.  So we
    will avoid using native_cond_sleep in the main thread
    and always use ppoll to sleep when in the main thread.
    This can guarantee the main thread remains aware of
    signals; even if it cannot safely read off sigwait_fd
    
    git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64538 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Loading