Diff for /linux/kernel/exit.c between versions 1.1.1.6 and 1.1.1.7

version 1.1.1.6, 2018/04/24 18:05:29 version 1.1.1.7, 2018/04/24 18:06:31
Line 48  inline int send_sig(long sig,struct task Line 48  inline int send_sig(long sig,struct task
                 /* we have to make sure that the process stops. */                  /* we have to make sure that the process stops. */
                 if (p->state == TASK_INTERRUPTIBLE || p->state == TASK_RUNNING)                  if (p->state == TASK_INTERRUPTIBLE || p->state == TASK_RUNNING)
                         p->state = TASK_STOPPED;                          p->state = TASK_STOPPED;
   
                 if (p == current)  
                         schedule();  
         }          }
         return 0;          return 0;
 }  }
Line 66  void release(struct task_struct * p) Line 63  void release(struct task_struct * p)
                 return;                  return;
         }          }
         for (i=1 ; i<NR_TASKS ; i++)          for (i=1 ; i<NR_TASKS ; i++)
                 if (task[i]==p) {                  if (task[i] == p) {
                         task[i]=NULL;                          task[i] = NULL;
                         /* Update links */                          /* Update links */
                         if (p->p_osptr)                          if (p->p_osptr)
                                 p->p_osptr->p_ysptr = p->p_ysptr;                                  p->p_osptr->p_ysptr = p->p_ysptr;
Line 75  void release(struct task_struct * p) Line 72  void release(struct task_struct * p)
                                 p->p_ysptr->p_osptr = p->p_osptr;                                  p->p_ysptr->p_osptr = p->p_osptr;
                         else                          else
                                 p->p_pptr->p_cptr = p->p_osptr;                                  p->p_pptr->p_cptr = p->p_osptr;
                         free_page((long)p);                          free_page((long) p);
                         schedule();  
                         return;                          return;
                 }                  }
         panic("trying to release non-existent task");          panic("trying to release non-existent task");
Line 218  int kill_proc(int pid, int sig, int priv Line 214  int kill_proc(int pid, int sig, int priv
 int sys_kill(int pid,int sig)  int sys_kill(int pid,int sig)
 {  {
         struct task_struct **p = NR_TASKS + task;          struct task_struct **p = NR_TASKS + task;
         int err, retval = 0;          int err, retval = 0, count = 0;
   
         if (!pid)          if (!pid)
                 return(kill_pg(current->pid,sig,0));                  return(kill_pg(current->pgrp,sig,0));
         if (pid == -1) {          if (pid == -1) {
                 while (--p > &FIRST_TASK)                  while (--p > &FIRST_TASK)
                         if (err = send_sig(sig,*p,0))                          if ((*p)->pid > 1 && *p != current) {
                                 retval = err;                                  ++count;
                 return(retval);                                  if ((err = send_sig(sig,*p,0)) != -EPERM)
                                           retval = err;
                           }
                   return(count ? retval : -ESRCH);
         }          }
         if (pid < 0)           if (pid < 0) 
                 return(kill_pg(-pid,sig,0));                  return(kill_pg(-pid,sig,0));
Line 292  volatile void do_exit(long code) Line 291  volatile void do_exit(long code)
         current->library = NULL;          current->library = NULL;
         current->state = TASK_ZOMBIE;          current->state = TASK_ZOMBIE;
         current->exit_code = code;          current->exit_code = code;
           current->rss = 0;
         /*           /* 
          * Check to see if any process groups have become orphaned           * Check to see if any process groups have become orphaned
          * as a result of our exiting, and if they have any stopped           * as a result of our exiting, and if they have any stopped
Line 319  volatile void do_exit(long code) Line 319  volatile void do_exit(long code)
          *      as a result of our exiting, and if they have any stopped           *      as a result of our exiting, and if they have any stopped
          *      jons, send them a SIGUP and then a SIGCONT.  (POSIX 3.2.2.2)           *      jons, send them a SIGUP and then a SIGCONT.  (POSIX 3.2.2.2)
          */           */
         if (p = current->p_cptr) {          while (p = current->p_cptr) {
                 while (1) {                  current->p_cptr = p->p_osptr;
                         p->flags &= ~PF_PTRACED;                  p->p_ysptr = NULL;
                         p->p_pptr = task[1];                  p->flags &= ~PF_PTRACED;
                         if (p->state == TASK_ZOMBIE)                  p->p_pptr = task[1];
                                 task[1]->signal |= (1<<(SIGCHLD-1));                  p->p_osptr = task[1]->p_cptr;
                         /*                  task[1]->p_cptr->p_ysptr = p;
                          * process group orphan check                  task[1]->p_cptr = p;
                          * Case ii: Our child is in a different pgrp                   if (p->state == TASK_ZOMBIE)
                          * than we are, and it was the only connection                          task[1]->signal |= (1<<(SIGCHLD-1));
                          * outside, so the child pgrp is now orphaned.                  /*
                          */                   * process group orphan check
                         if ((p->pgrp != current->pgrp) &&                   * Case ii: Our child is in a different pgrp 
                             (p->session == current->session) &&                   * than we are, and it was the only connection
                             is_orphaned_pgrp(p->pgrp) &&                   * outside, so the child pgrp is now orphaned.
                             has_stopped_jobs(p->pgrp)) {                   */
                                 kill_pg(p->pgrp,SIGHUP,1);                  if ((p->pgrp != current->pgrp) &&
                                 kill_pg(p->pgrp,SIGCONT,1);                      (p->session == current->session) &&
                         }                      is_orphaned_pgrp(p->pgrp) &&
                         if (p->p_osptr) {                      has_stopped_jobs(p->pgrp)) {
                                 p = p->p_osptr;                          kill_pg(p->pgrp,SIGHUP,1);
                                 continue;                          kill_pg(p->pgrp,SIGCONT,1);
                         }  
                         /*  
                          * This is it; link everything into init's children   
                          * and leave   
                          */  
                         p->p_osptr = task[1]->p_cptr;  
                         task[1]->p_cptr->p_ysptr = p;  
                         task[1]->p_cptr = current->p_cptr;  
                         current->p_cptr = 0;  
                         break;  
                 }                  }
         }          }
         if (current->leader) {          if (current->leader) {
Line 413  repeat: Line 403  repeat:
                                 p->exit_code = 0;                                  p->exit_code = 0;
                                 return p->pid;                                  return p->pid;
                         case TASK_ZOMBIE:                          case TASK_ZOMBIE:
                                 current->cutime += p->utime;                                  current->cutime += p->utime + p->cutime;
                                 current->cstime += p->stime;                                  current->cstime += p->stime + p->cstime;
                                   current->cmin_flt += p->min_flt + p->cmin_flt;
                                   current->cmaj_flt += p->maj_flt + p->cmaj_flt;
                                 flag = p->pid;                                  flag = p->pid;
                                 if (stat_addr)                                  if (stat_addr)
                                         put_fs_long(p->exit_code, stat_addr);                                          put_fs_long(p->exit_code, stat_addr);

Removed from v.1.1.1.6  
changed lines
  Added in v.1.1.1.7


unix.superglobalmegacorp.com