--- libaitio/src/exec.c 2013/12/08 20:43:22 1.1.2.14 +++ libaitio/src/exec.c 2013/12/12 09:04:22 1.1.2.17 @@ -217,6 +217,7 @@ io_progOpen(prog_t * __restrict prg, u_int execNum) break; } else array_Set(prg->prog_fds, i, f); + clrbit(prg->prog_used, i); prg->prog_cnum++; ret++; } @@ -230,7 +231,8 @@ io_progOpen(prog_t * __restrict prg, u_int execNum) * * @prg = program pool * @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 io_progGrow(prog_t * __restrict prg, u_int toNum) @@ -243,7 +245,12 @@ io_progGrow(prog_t * __restrict prg, u_int toNum) } if (!toNum) toNum = prg->prog_maxn; + if (toNum < prg->prog_inin) + toNum = prg->prog_inin; + if ((toNum - prg->prog_cnum) < 1) + return 0; + return io_progOpen(prg, toNum - prg->prog_cnum); } @@ -301,10 +308,11 @@ io_progVacuum(prog_t * __restrict prg, u_int toNum) * io_progCheck() - Check exit status of program pool * * @prg = program pool + * @re = resurrect program * return: -1 error or >-1 exited programs */ int -io_progCheck(prog_t * __restrict prg) +io_progCheck(prog_t * __restrict prg, int re) { int ret = 0; struct tagPIOPID *p; @@ -323,10 +331,21 @@ io_progCheck(prog_t * __restrict prg) #endif if (waitpid(p->pid, &p->stat, WNOHANG) > 0) { clrbit(prg->prog_used, i); +#ifdef POPEN_STREAM + e_pclose(array(prg->prog_fds, i, FILE*)); +#else + e_pclose((int) array(prg->prog_fds, i, intptr_t)); +#endif + array_Del(prg->prog_fds, i, 0); + prg->prog_cnum--; ret++; } pthread_mutex_unlock(&prg->prog_mtx); + /* resurrect */ + if (re && ret > 0 && prg->prog_inin - prg->prog_cnum) + io_progOpen(prg, prg->prog_inin - prg->prog_cnum); + return ret; } @@ -334,6 +353,7 @@ io_progCheck(prog_t * __restrict prg) * io_progAttach() - Attach to open program * * @prg = program pool + * @newOne = Execute new one program after attach * return: NULL error or !=NULL attached program handle */ #ifdef POPEN_STREAM @@ -341,7 +361,7 @@ FILE * #else int #endif -io_progAttach(prog_t * __restrict prg) +io_progAttach(prog_t * __restrict prg, int newOne) { #ifdef POPEN_STREAM FILE *f = NULL; @@ -369,6 +389,10 @@ io_progAttach(prog_t * __restrict prg) break; } pthread_mutex_unlock(&prg->prog_mtx); + + /* execute new one program */ + if (newOne && f) + io_progOpen(prg, 1); return f; }