Diff for /libaitio/src/exec.c between versions 1.1.2.16 and 1.1.2.19

version 1.1.2.16, 2013/12/08 21:11:54 version 1.1.2.19, 2013/12/12 21:59:01
Line 173  io_progCloseAt(prog_t * __restrict prg, u_int idx) Line 173  io_progCloseAt(prog_t * __restrict prg, u_int idx)
 }  }
   
 /*  /*
    * io_progOpen2() - Start program from pool on first unused slot
    *
    * @prg = program pool
    * return: -1 error, >-1 reside at slot
    */
   int
   io_progOpen2(prog_t * __restrict prg)
   {
   #ifdef POPEN_STREAM
           FILE *f = NULL;
   #else
           int f = -1;
   #endif
           int stat, ret = -1;
           register int i;
           pid_t pid;
   
           if (!prg)
                   return -1;
           if (prg->prog_cnum + 1 > prg->prog_maxn) {
                   io_SetErr(EINVAL, "Requested number for program execution is over pool's limit");
                   return -1;
           }
   
           pthread_mutex_lock(&prg->prog_mtx);
           for (i = 0; i < array_Size(prg->prog_fds); i++)
                   if (!array_Get(prg->prog_fds, i)) {
                           f = e_popen(prg->prog_name, "r+", &pid);
   #ifdef POPEN_STREAM
                           if (!f) {
   #else
                           if (f == -1) {
   #endif
                                   LOGERR;
                                   break;
                           } else if (waitpid(pid, &stat, WNOHANG)) {
                                   io_SetErr(ECHILD, "Program with pid=%d exit with status %d", 
                                                   pid, WIFEXITED(stat) ? WEXITSTATUS(stat) : -1);
                                   e_pclose(f);
                                   break;
                           } else
                                   array_Set(prg->prog_fds, i, f);
                           clrbit(prg->prog_used, i);
                           prg->prog_cnum++;
                           ret = i;
                           break;
                   }
           pthread_mutex_unlock(&prg->prog_mtx);
   
           return ret;
   }
   
   /*
  * io_progOpen() - Execute number of program(s)   * io_progOpen() - Execute number of program(s)
  *   *
  * @prg = program pool   * @prg = program pool
  * @execNum = execute program(s) (0 max)   * @execNum = execute program(s) (0 max)
 * return: 0 error, >0 executed programs and abs(<0) executed programs with logged error * return: -1 error, >0 executed programs
  */   */
 int  int
 io_progOpen(prog_t * __restrict prg, u_int execNum)  io_progOpen(prog_t * __restrict prg, u_int execNum)
Line 192  io_progOpen(prog_t * __restrict prg, u_int execNum) Line 245  io_progOpen(prog_t * __restrict prg, u_int execNum)
         pid_t pid;          pid_t pid;
   
         if (!prg)          if (!prg)
                return 0;                return -1;
         if (prg->prog_cnum + execNum > prg->prog_maxn) {          if (prg->prog_cnum + execNum > prg->prog_maxn) {
                 io_SetErr(EINVAL, "Requested number for program execution is over pool's limit");                  io_SetErr(EINVAL, "Requested number for program execution is over pool's limit");
                return 0;                return -1;
         }          }
   
         pthread_mutex_lock(&prg->prog_mtx);          pthread_mutex_lock(&prg->prog_mtx);
         for (i = 0; (execNum ? ret < execNum : 42) && i < array_Size(prg->prog_fds); i++)          for (i = 0; (execNum ? ret < execNum : 42) && i < array_Size(prg->prog_fds); i++)
                 if (!array_Get(prg->prog_fds, i)) {                  if (!array_Get(prg->prog_fds, i)) {
                           printf("%d) %s!!! %d ret=%d\n", i, __func__, execNum, ret);
                         f = e_popen(prg->prog_name, "r+", &pid);                          f = e_popen(prg->prog_name, "r+", &pid);
 #ifdef POPEN_STREAM  #ifdef POPEN_STREAM
                         if (!f) {                          if (!f) {
Line 213  io_progOpen(prog_t * __restrict prg, u_int execNum) Line 267  io_progOpen(prog_t * __restrict prg, u_int execNum)
                         } else if (waitpid(pid, &stat, WNOHANG)) {                          } else if (waitpid(pid, &stat, WNOHANG)) {
                                 io_SetErr(ECHILD, "Program with pid=%d exit with status %d",                                   io_SetErr(ECHILD, "Program with pid=%d exit with status %d", 
                                                 pid, WIFEXITED(stat) ? WEXITSTATUS(stat) : -1);                                                  pid, WIFEXITED(stat) ? WEXITSTATUS(stat) : -1);
                                   e_pclose(f);
                                 ret = -1;                                  ret = -1;
                                 break;                                  break;
                         } else                          } else
Line 231  io_progOpen(prog_t * __restrict prg, u_int execNum) Line 286  io_progOpen(prog_t * __restrict prg, u_int execNum)
  *   *
  * @prg = program pool   * @prg = program pool
  * @toNum = execute to number of programs (0 max)   * @toNum = execute to number of programs (0 max)
 * return: 0 error, >0 executed programs and abs(<0) executed programs with logged error * return: 0 error or nothing to do, 
  *        >0 executed programs and abs(<0) executed programs with logged error
  */   */
 int  int
 io_progGrow(prog_t * __restrict prg, u_int toNum)  io_progGrow(prog_t * __restrict prg, u_int toNum)
Line 244  io_progGrow(prog_t * __restrict prg, u_int toNum) Line 300  io_progGrow(prog_t * __restrict prg, u_int toNum)
         }          }
         if (!toNum)          if (!toNum)
                 toNum = prg->prog_maxn;                  toNum = prg->prog_maxn;
           if (toNum < prg->prog_inin)
                   toNum = prg->prog_inin;
   
           if ((int) (toNum - prg->prog_cnum) < 1)
                   return 0;
   
         return io_progOpen(prg, toNum - prg->prog_cnum);          return io_progOpen(prg, toNum - prg->prog_cnum);
 }  }
   
Line 302  io_progVacuum(prog_t * __restrict prg, u_int toNum) Line 363  io_progVacuum(prog_t * __restrict prg, u_int toNum)
  * io_progCheck() - Check exit status of program pool   * io_progCheck() - Check exit status of program pool
  *   *
  * @prg = program pool   * @prg = program pool
 * @re = resurrect program * @re = resurrect program to init number
  * return: -1 error or >-1 exited programs   * return: -1 error or >-1 exited programs
  */   */
 int  int
Line 336  io_progCheck(prog_t * __restrict prg, int re) Line 397  io_progCheck(prog_t * __restrict prg, int re)
                         }                          }
         pthread_mutex_unlock(&prg->prog_mtx);          pthread_mutex_unlock(&prg->prog_mtx);
   
        /* resurrect */        /* resurrect to init number */
        if (re && ret > 0)        if (re && ((int) (prg->prog_inin - prg->prog_cnum) > 0))
                io_progOpen(prg, ret);                io_progOpen(prg, prg->prog_inin - prg->prog_cnum);
   
         return ret;          return ret;
 }  }
Line 383  io_progAttach(prog_t * __restrict prg, int newOne) Line 444  io_progAttach(prog_t * __restrict prg, int newOne)
                         break;                          break;
                 }                  }
         pthread_mutex_unlock(&prg->prog_mtx);          pthread_mutex_unlock(&prg->prog_mtx);
   
           /* not found free program */
           if (!f && (i = io_progOpen2(prg)) > 0) {
   #ifdef POPEN_STREAM
                   f = array(prg->prog_fds, i, FILE*);
   #else
                   f = array(prg->prog_fds, i, intptr_t);
   #endif
           }
   
         /* execute new one program */          /* execute new one program */
         if (newOne && f)          if (newOne && f)

Removed from v.1.1.2.16  
changed lines
  Added in v.1.1.2.19


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>