bjh         99/06/06 06:54:56

  Modified:    apr/threadproc/os2 proc.c threadproc.h
  Log:
  Add flag in proc_t to prevent errors waiting for children that never lived or
  have already been waited for. This can happen in testsock.c if client &
  server don't end at the same time, causing it to loop forever.
  
  Revision  Changes    Path
  1.2       +19 -3     apache-apr/apr/threadproc/os2/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/threadproc/os2/proc.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- proc.c    1999/06/06 07:15:21     1.1
  +++ proc.c    1999/06/06 13:54:54     1.2
  @@ -137,14 +137,16 @@
   
       if ((pid = fork()) < 0) {
           return errno;
  -    }
  -    else if (pid == 0) {
  +    } else if (pid == 0) {
           (*proc)->pid = pid;
           (*proc)->attr = NULL;
  +        (*proc)->running = TRUE;
           return APR_INCHILD;
       }
  +
       (*proc)->pid = pid;
       (*proc)->attr = NULL;
  +    (*proc)->running = TRUE;
       return APR_INPARENT;
   }
   
  @@ -153,6 +155,7 @@
                                 struct procattr_t *attr, struct proc_t **new)
   {
       int i;
  +    ap_status_t stat;
       char **newargs;
       char savedir[300];
       HFILE save_in, save_out, save_err, dup;
  @@ -165,6 +168,7 @@
       }
   
       (*new)->cntxt = cont;
  +    (*new)->running = FALSE;
       
   /* Prevent other threads from running while these process-wide resources are 
modified */
       if (attr->child_in || attr->child_out || attr->child_err || 
attr->currdir) {
  @@ -229,6 +233,8 @@
           (*new)->pid = spawnve(P_NOWAIT, progname, args, env);
       }
       
  +    stat = (*new)->pid < 0 ? errno : APR_SUCCESS;
  +    
       if (attr->currdir != NULL) {
           chdir(savedir);
       }
  @@ -239,12 +245,14 @@
           DosDupHandle(save_in, &dup);
           DosClose(save_in);
       }
  +    
       if (attr->child_out) {
           ap_close(attr->child_out);
           dup = STDOUT_FILENO;
           DosDupHandle(save_out, &dup);
           DosClose(save_out);
       }
  +    
       if (attr->child_err) {
           ap_close(attr->child_err);
           dup = STDERR_FILENO;
  @@ -256,9 +264,12 @@
           DosExitCritSec();
   
       (*new)->attr = attr;
  -    return APR_SUCCESS;
  +    (*new)->running = stat == APR_SUCCESS;
  +    return stat;
   }
   
  +
  +
   ap_status_t ap_get_childin(struct proc_t *proc, ap_file_t **new)
   {
       (*new) = proc->attr->parent_in;
  @@ -285,8 +296,12 @@
       if (!proc)
           return APR_ENOPROC;
   
  +    if (!proc->running)
  +        return APR_CHILD_DONE;
  +
       if (wait == APR_WAIT) {
           if ((stat = waitpid(proc->pid, NULL, WUNTRACED)) > 0) {
  +            proc->running = FALSE;
               return APR_CHILD_DONE;
           } else if (stat == 0) {
               return APR_CHILD_NOTDONE;
  @@ -295,6 +310,7 @@
       }
   
       if ((stat = waitpid(proc->pid, NULL, WUNTRACED | WNOHANG)) > 0) {
  +        proc->running = FALSE;
           return APR_CHILD_DONE;
       } else if (stat == 0) {
           return APR_CHILD_NOTDONE;
  
  
  
  1.2       +1 -0      apache-apr/apr/threadproc/os2/threadproc.h
  
  Index: threadproc.h
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/threadproc/os2/threadproc.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- threadproc.h      1999/06/06 07:15:23     1.1
  +++ threadproc.h      1999/06/06 13:54:55     1.2
  @@ -99,6 +99,7 @@
       ap_context_t *cntxt;
       pid_t pid;
       struct procattr_t *attr;
  +    int running;
   };
   
   typedef void (*os2_thread_start_t)(void *);
  
  
  

Reply via email to