mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	remove ruby_kill() introduced for [Bug #7951].
* thread.c (rbuy_kill): removed. This function is used with SIGSEGV, SIGBUS, SIGKILL, SIGILL, SIGFPE and SIGSTOP and these signals are affect immediately. So that `kill(2)' is enough for them. * signal.c (rb_f_kill): ditto. * vm_core.h (rb_thread_t::interrupt_cond): removed because only `ruby_kill()' uses this field. * test/ruby/test_signal.rb: Without this patch sending SIGSTOP to own process wait another interrupt even if another process sends SIGCONT. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59066 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									a57d295e36
								
							
						
					
					
						commit
						6c3f1461cd
					
				
					 5 changed files with 15 additions and 31 deletions
				
			
		| 
						 | 
				
			
			@ -1674,7 +1674,6 @@ int rb_thread_to_be_killed(VALUE thread);
 | 
			
		|||
void rb_mutex_allow_trap(VALUE self, int val);
 | 
			
		||||
VALUE rb_uninterruptible(VALUE (*b_proc)(ANYARGS), VALUE data);
 | 
			
		||||
VALUE rb_mutex_owned_p(VALUE self);
 | 
			
		||||
void ruby_kill(rb_pid_t pid, int sig);
 | 
			
		||||
 | 
			
		||||
/* thread_pthread.c, thread_win32.c */
 | 
			
		||||
void Init_native_thread(void);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								signal.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								signal.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -495,7 +495,7 @@ rb_f_kill(int argc, const VALUE *argv)
 | 
			
		|||
#ifdef SIGSTOP
 | 
			
		||||
		  case SIGSTOP:
 | 
			
		||||
#endif
 | 
			
		||||
		    ruby_kill(pid, sig);
 | 
			
		||||
		    kill(pid, sig);
 | 
			
		||||
		    break;
 | 
			
		||||
		  default:
 | 
			
		||||
		    t = signal_ignored(sig);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -307,4 +307,18 @@ EOS
 | 
			
		|||
    b = Signal.list.keys.map(&:object_id).sort
 | 
			
		||||
    assert_equal a, b
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_stop
 | 
			
		||||
    assert_ruby_status([], <<-'end;')
 | 
			
		||||
      begin
 | 
			
		||||
        fork{
 | 
			
		||||
          sleep 1
 | 
			
		||||
          Process.kill(:CONT, Process.ppid)
 | 
			
		||||
        }
 | 
			
		||||
        Process.kill(:STOP, Process.pid)
 | 
			
		||||
      rescue NotImplementedError
 | 
			
		||||
        # ok
 | 
			
		||||
      end
 | 
			
		||||
    end;
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								thread.c
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								thread.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -425,7 +425,6 @@ rb_threadptr_interrupt_common(rb_thread_t *th, int trap)
 | 
			
		|||
    else {
 | 
			
		||||
	/* none */
 | 
			
		||||
    }
 | 
			
		||||
    native_cond_signal(&th->interrupt_cond);
 | 
			
		||||
    native_mutex_unlock(&th->interrupt_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -549,7 +548,6 @@ thread_cleanup_func(void *th_ptr, int atfork)
 | 
			
		|||
	return;
 | 
			
		||||
 | 
			
		||||
    native_mutex_destroy(&th->interrupt_lock);
 | 
			
		||||
    native_cond_destroy(&th->interrupt_cond);
 | 
			
		||||
    native_thread_destroy(th);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -739,7 +737,6 @@ thread_create_core(VALUE thval, VALUE args, VALUE (*fn)(ANYARGS))
 | 
			
		|||
    th->interrupt_mask = 0;
 | 
			
		||||
 | 
			
		||||
    native_mutex_initialize(&th->interrupt_lock);
 | 
			
		||||
    native_cond_initialize(&th->interrupt_cond, RB_CONDATTR_CLOCK_MONOTONIC);
 | 
			
		||||
    th->report_on_exception = th->vm->thread_report_on_exception;
 | 
			
		||||
 | 
			
		||||
    /* kick thread */
 | 
			
		||||
| 
						 | 
				
			
			@ -4920,8 +4917,6 @@ Init_Thread(void)
 | 
			
		|||
	    gvl_acquire(th->vm, th);
 | 
			
		||||
	    native_mutex_initialize(&th->vm->thread_destruct_lock);
 | 
			
		||||
	    native_mutex_initialize(&th->interrupt_lock);
 | 
			
		||||
	    native_cond_initialize(&th->interrupt_cond,
 | 
			
		||||
				   RB_CONDATTR_CLOCK_MONOTONIC);
 | 
			
		||||
 | 
			
		||||
	    th->pending_interrupt_queue = rb_ary_tmp_new(0);
 | 
			
		||||
	    th->pending_interrupt_queue_checked = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -5077,26 +5072,3 @@ rb_uninterruptible(VALUE (*b_proc)(ANYARGS), VALUE data)
 | 
			
		|||
 | 
			
		||||
    return rb_ensure(b_proc, data, rb_ary_pop, cur_th->pending_interrupt_mask_stack);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ruby_kill(rb_pid_t pid, int sig)
 | 
			
		||||
{
 | 
			
		||||
    int err;
 | 
			
		||||
    rb_thread_t *th = GET_THREAD();
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * When target pid is self, many caller assume signal will be
 | 
			
		||||
     * delivered immediately and synchronously.
 | 
			
		||||
     */
 | 
			
		||||
    {
 | 
			
		||||
	GVL_UNLOCK_BEGIN();
 | 
			
		||||
	native_mutex_lock(&th->interrupt_lock);
 | 
			
		||||
	err = kill(pid, sig);
 | 
			
		||||
	native_cond_wait(&th->interrupt_cond, &th->interrupt_lock);
 | 
			
		||||
	native_mutex_unlock(&th->interrupt_lock);
 | 
			
		||||
	GVL_UNLOCK_END();
 | 
			
		||||
    }
 | 
			
		||||
    if (err < 0) {
 | 
			
		||||
	rb_sys_fail(0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -791,7 +791,6 @@ typedef struct rb_thread_struct {
 | 
			
		|||
    rb_atomic_t interrupt_flag;
 | 
			
		||||
    unsigned long interrupt_mask;
 | 
			
		||||
    rb_nativethread_lock_t interrupt_lock;
 | 
			
		||||
    rb_nativethread_cond_t interrupt_cond;
 | 
			
		||||
    struct rb_unblock_callback unblock;
 | 
			
		||||
    VALUE locking_mutex;
 | 
			
		||||
    struct rb_mutex_struct *keeping_mutexes;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue