--- libaitio/src/exec.c 2013/12/08 20:43:22 1.1.2.14 +++ libaitio/src/exec.c 2013/12/08 20:57:32 1.1.2.15 @@ -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++; } @@ -301,10 +302,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,9 +325,20 @@ 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) + io_progOpen(prg, ret); return ret; }