mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	process.c: dead code when no SIGCHLD
* process.c (ruby_waitpid_all): nothing to do unless SIGCHLD is available. * signal.c (ruby_nocldwait): used only if SIGCHLD is available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64407 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									59bbe8a95b
								
							
						
					
					
						commit
						3bd2d01f96
					
				
					 2 changed files with 17 additions and 7 deletions
				
			
		
							
								
								
									
										18
									
								
								process.c
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								process.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -981,6 +981,7 @@ rb_sigwait_fd_migrate(rb_vm_t *vm)
 | 
			
		|||
    rb_native_mutex_unlock(&vm->waitpid_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if RUBY_SIGCHLD
 | 
			
		||||
static void
 | 
			
		||||
waitpid_notify(struct waitpid_state *w, rb_pid_t ret)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -994,13 +995,7 @@ waitpid_notify(struct waitpid_state *w, rb_pid_t ret)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32 /* for spawnvp result from mjit.c */
 | 
			
		||||
#  define waitpid_sys(pid,status,options) \
 | 
			
		||||
	  (WaitForSingleObject((HANDLE)(pid), 0),\
 | 
			
		||||
	   GetExitCodeProcess((HANDLE)(pid), (LPDWORD)(status)))
 | 
			
		||||
#else
 | 
			
		||||
#  define waitpid_sys(pid,status,options) do_waitpid((pid),(status),(options))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern volatile unsigned int ruby_nocldwait; /* signal.c */
 | 
			
		||||
/* called by timer thread or thread which acquired sigwait_fd */
 | 
			
		||||
| 
						 | 
				
			
			@ -1032,10 +1027,14 @@ waitpid_each(struct list_head *head)
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
# define ruby_nocldwait 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ruby_waitpid_all(rb_vm_t *vm)
 | 
			
		||||
{
 | 
			
		||||
#if RUBY_SIGCHLD
 | 
			
		||||
    rb_native_mutex_lock(&vm->waitpid_lock);
 | 
			
		||||
    waitpid_each(&vm->waiting_pids);
 | 
			
		||||
    if (list_empty(&vm->waiting_pids)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1047,6 +1046,7 @@ ruby_waitpid_all(rb_vm_t *vm)
 | 
			
		|||
            ; /* keep looping */
 | 
			
		||||
    }
 | 
			
		||||
    rb_native_mutex_unlock(&vm->waitpid_lock);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
| 
						 | 
				
			
			@ -4458,21 +4458,27 @@ rb_f_system(int argc, VALUE *argv)
 | 
			
		|||
 | 
			
		||||
    execarg_obj = rb_execarg_new(argc, argv, TRUE, TRUE);
 | 
			
		||||
    TypedData_Get_Struct(execarg_obj, struct rb_execarg, &exec_arg_data_type, eargp);
 | 
			
		||||
#if RUBY_SIGCHLD
 | 
			
		||||
    eargp->nocldwait_prev = ruby_nocldwait;
 | 
			
		||||
    ruby_nocldwait = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    pid = rb_execarg_spawn(execarg_obj, NULL, 0);
 | 
			
		||||
#if defined(HAVE_WORKING_FORK) || defined(HAVE_SPAWNV)
 | 
			
		||||
    if (pid > 0) {
 | 
			
		||||
        int ret, status;
 | 
			
		||||
        ret = rb_waitpid(pid, &status, 0);
 | 
			
		||||
        if (ret == (rb_pid_t)-1) {
 | 
			
		||||
# if RUBY_SIGCHLD
 | 
			
		||||
            ruby_nocldwait = eargp->nocldwait_prev;
 | 
			
		||||
# endif
 | 
			
		||||
            RB_GC_GUARD(execarg_obj);
 | 
			
		||||
            rb_sys_fail("Another thread waited the process started by system().");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#if RUBY_SIGCHLD
 | 
			
		||||
    ruby_nocldwait = eargp->nocldwait_prev;
 | 
			
		||||
#endif
 | 
			
		||||
    if (pid < 0) {
 | 
			
		||||
        if (eargp->exception) {
 | 
			
		||||
            int err = errno;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								signal.c
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								signal.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -531,7 +531,9 @@ static struct {
 | 
			
		|||
    rb_atomic_t cnt[RUBY_NSIG];
 | 
			
		||||
    rb_atomic_t size;
 | 
			
		||||
} signal_buff;
 | 
			
		||||
#if RUBY_SIGCHLD
 | 
			
		||||
volatile unsigned int ruby_nocldwait;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __dietlibc__
 | 
			
		||||
#define sighandler_t sh_t
 | 
			
		||||
| 
						 | 
				
			
			@ -615,7 +617,8 @@ ruby_signal(int signum, sighandler_t handler)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
    switch (signum) {
 | 
			
		||||
      case SIGCHLD:
 | 
			
		||||
#if RUBY_SIGCHLD
 | 
			
		||||
      case RUBY_SIGCHLD:
 | 
			
		||||
	if (handler == SIG_IGN) {
 | 
			
		||||
	    ruby_nocldwait = 1;
 | 
			
		||||
	    if (sigact.sa_flags & SA_SIGINFO) {
 | 
			
		||||
| 
						 | 
				
			
			@ -629,6 +632,7 @@ ruby_signal(int signum, sighandler_t handler)
 | 
			
		|||
	    ruby_nocldwait = 0;
 | 
			
		||||
	}
 | 
			
		||||
	break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(SA_ONSTACK) && defined(USE_SIGALTSTACK)
 | 
			
		||||
      case SIGSEGV:
 | 
			
		||||
#ifdef SIGBUS
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue