version 1.1.2.3, 2013/12/05 13:22:10
|
version 1.1.2.8, 2013/12/05 16:57:08
|
Line 37 io_progInit(const char *progName, u_int initNum, u_int
|
Line 37 io_progInit(const char *progName, u_int initNum, u_int
|
|
|
pthread_mutex_init(&prg->prog_mtx, NULL); |
pthread_mutex_init(&prg->prog_mtx, NULL); |
|
|
if (io_progOpen(prg, prg->prog_inin) < 0) | if (io_progOpen(prg, prg->prog_inin) < 0) { |
io_progDestroy(&prg); |
io_progDestroy(&prg); |
|
prg = NULL; |
|
} |
return prg; |
return prg; |
} |
} |
|
|
Line 87 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
Line 89 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
for (i = array_Size(prg->prog_fds) - 1; |
for (i = array_Size(prg->prog_fds) - 1; |
(closeNum ? ret < closeNum : 42) && i > -1; i--) |
(closeNum ? ret < closeNum : 42) && i > -1; i--) |
if (array_Get(prg->prog_fds, i)) { |
if (array_Get(prg->prog_fds, i)) { |
pclose(array(prg->prog_fds, i, FILE*)); | e_pclose(array(prg->prog_fds, i, FILE*)); |
array_Del(prg->prog_fds, i, 0); |
array_Del(prg->prog_fds, i, 0); |
prg->prog_cnum--; |
prg->prog_cnum--; |
ret++; |
ret++; |
Line 108 int
|
Line 110 int
|
io_progOpen(prog_t * __restrict prg, u_int execNum) |
io_progOpen(prog_t * __restrict prg, u_int execNum) |
{ |
{ |
FILE *f; |
FILE *f; |
int ret = 0; | int stat, ret = 0; |
register int i; |
register int i; |
|
pid_t pid; |
|
|
if (!prg) |
if (!prg) |
return 0; |
return 0; |
if (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 0; |
} |
} |
Line 121 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
Line 124 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
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)) { |
f = popen(prg->prog_name, "r+"); | f = e_popen(prg->prog_name, "r+", &pid); |
if (!f) { |
if (!f) { |
LOGERR; |
LOGERR; |
ret *= -1; | ret = -1; |
break; |
break; |
|
} else if (waitpid(pid, &stat, WNOHANG)) { |
|
io_SetErr(ECHILD, "Program with pid=%d exit with status %d", |
|
pid, WIFEXITED(stat) ? WEXITSTATUS(stat) : -1); |
|
ret = -1; |
|
break; |
} else |
} else |
array_Set(prg->prog_fds, i, f); |
array_Set(prg->prog_fds, i, f); |
prg->prog_cnum++; |
prg->prog_cnum++; |
Line 137 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
Line 145 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
} |
} |
|
|
/* |
/* |
|
* io_progGrow() - Execute to number of programs in pool |
|
* |
|
* @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 |
|
*/ |
|
int |
|
io_progGrow(prog_t * __restrict prg, u_int toNum) |
|
{ |
|
if (!prg) |
|
return 0; |
|
if (toNum > prg->prog_maxn) { |
|
io_SetErr(EINVAL, "Requested number for program execution is over pool's limit"); |
|
return 0; |
|
} |
|
if (!toNum) |
|
toNum = prg->prog_maxn; |
|
|
|
return io_progOpen(prg, toNum - prg->prog_cnum); |
|
} |
|
|
|
/* |
* io_progVacuum() - Vacuum pool to running number of programs |
* io_progVacuum() - Vacuum pool to running number of programs |
* |
* |
* @prg = program pool |
* @prg = program pool |
Line 161 io_progVacuum(prog_t * __restrict prg, u_int toNum)
|
Line 191 io_progVacuum(prog_t * __restrict prg, u_int toNum)
|
pthread_mutex_lock(&prg->prog_mtx); |
pthread_mutex_lock(&prg->prog_mtx); |
for (i = array_Size(prg->prog_fds) - 1; prg->prog_cnum > toNum && i > -1; i--) |
for (i = array_Size(prg->prog_fds) - 1; prg->prog_cnum > toNum && i > -1; i--) |
if (array_Get(prg->prog_fds, i)) { |
if (array_Get(prg->prog_fds, i)) { |
pclose(array(prg->prog_fds, i, FILE*)); | e_pclose(array(prg->prog_fds, i, FILE*)); |
array_Del(prg->prog_fds, i, 0); |
array_Del(prg->prog_fds, i, 0); |
prg->prog_cnum--; |
prg->prog_cnum--; |
ret++; |
ret++; |
} |
} |
pthread_mutex_unlock(&prg->prog_mtx); |
pthread_mutex_unlock(&prg->prog_mtx); |
|
|
|
return ret; |
|
} |
|
|
|
/* |
|
* io_progCheck() - Check exit status of program pool |
|
* |
|
* @prg = program pool |
|
* return: -1 error or >-1 exited programs |
|
*/ |
|
int |
|
io_progCheck(prog_t * __restrict prg) |
|
{ |
|
int ret = 0; |
|
struct tagPIOPID *p; |
|
register int i; |
|
|
|
if (!prg) |
|
return -1; |
|
|
|
for (i = 0; i < array_Size(prg->prog_fds); i++) |
|
if (array_Get(prg->prog_fds, i) && |
|
(p = pio_pgetpid(array(prg->prog_fds, i, FILE*)))) |
|
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) |
|
ret++; |
|
|
return ret; |
return ret; |
} |
} |