version 1.1.2.12, 2013/12/06 01:30:22
|
version 1.1.2.15, 2013/12/08 20:57:32
|
Line 71 io_progDestroy(prog_t ** __restrict pprg)
|
Line 71 io_progDestroy(prog_t ** __restrict pprg)
|
e_free((*pprg)->prog_used); |
e_free((*pprg)->prog_used); |
array_Destroy(&(*pprg)->prog_fds); |
array_Destroy(&(*pprg)->prog_fds); |
pthread_mutex_destroy(&(*pprg)->prog_mtx); |
pthread_mutex_destroy(&(*pprg)->prog_mtx); |
|
signal(SIGPIPE, SIG_DFL); |
|
|
e_free(*pprg); |
e_free(*pprg); |
*pprg = NULL; |
*pprg = NULL; |
Line 88 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
Line 89 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
{ |
{ |
register int i; |
register int i; |
int ret = 0; |
int ret = 0; |
|
struct tagPIOPID *p; |
|
|
if (!prg) |
if (!prg) |
return 0; |
return 0; |
Line 99 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
Line 101 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
pthread_mutex_lock(&prg->prog_mtx); |
pthread_mutex_lock(&prg->prog_mtx); |
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) && |
#ifdef POPEN_STREAM |
#ifdef POPEN_STREAM |
|
(p = pio_pgetpid(array(prg->prog_fds, i, FILE*)))) { |
|
#else |
|
(p = pio_pgetpid((int) array(prg->prog_fds, i, intptr_t)))) { |
|
#endif |
|
kill(p->pid, SIGTERM); |
|
usleep(1000); |
|
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) |
|
kill(p->pid, SIGKILL); |
|
#ifdef POPEN_STREAM |
e_pclose(array(prg->prog_fds, i, FILE*)); |
e_pclose(array(prg->prog_fds, i, FILE*)); |
#else |
#else |
e_pclose((int) array(prg->prog_fds, i, intptr_t)); |
e_pclose((int) array(prg->prog_fds, i, intptr_t)); |
Line 116 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
Line 127 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
} |
} |
|
|
/* |
/* |
|
* io_progCloseAt() - Close program at pool of certain position |
|
* |
|
* @prg = program pool |
|
* @idx = index at pool |
|
* return: 0 error or !=0 closed program |
|
*/ |
|
int |
|
io_progCloseAt(prog_t * __restrict prg, u_int idx) |
|
{ |
|
int ret = 0; |
|
struct tagPIOPID *p; |
|
|
|
if (!prg) |
|
return 0; |
|
if (idx > prg->prog_maxn) { |
|
io_SetErr(EINVAL, "Requested number for close program is over pool's limit"); |
|
return 0; |
|
} |
|
|
|
pthread_mutex_lock(&prg->prog_mtx); |
|
if (array_Get(prg->prog_fds, idx) && |
|
#ifdef POPEN_STREAM |
|
(p = pio_pgetpid(array(prg->prog_fds, idx, FILE*)))) { |
|
#else |
|
(p = pio_pgetpid((int) array(prg->prog_fds, idx, intptr_t)))) { |
|
#endif |
|
kill(p->pid, SIGTERM); |
|
usleep(1000); |
|
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) |
|
kill(p->pid, SIGKILL); |
|
#ifdef POPEN_STREAM |
|
e_pclose(array(prg->prog_fds, idx, FILE*)); |
|
#else |
|
e_pclose((int) array(prg->prog_fds, idx, intptr_t)); |
|
#endif |
|
array_Del(prg->prog_fds, idx, 0); |
|
clrbit(prg->prog_used, idx); |
|
prg->prog_cnum--; |
|
ret++; |
|
} |
|
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 |
Line 160 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
Line 217 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
break; |
break; |
} else |
} else |
array_Set(prg->prog_fds, i, f); |
array_Set(prg->prog_fds, i, f); |
|
clrbit(prg->prog_used, i); |
prg->prog_cnum++; |
prg->prog_cnum++; |
ret++; |
ret++; |
} |
} |
Line 202 io_progVacuum(prog_t * __restrict prg, u_int toNum)
|
Line 260 io_progVacuum(prog_t * __restrict prg, u_int toNum)
|
{ |
{ |
register int i; |
register int i; |
int ret = 0; |
int ret = 0; |
|
struct tagPIOPID *p; |
|
|
if (!prg) |
if (!prg) |
return 0; |
return 0; |
Line 214 io_progVacuum(prog_t * __restrict prg, u_int toNum)
|
Line 273 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) && isclr(prg->prog_used, i)) { | if (array_Get(prg->prog_fds, i) && isclr(prg->prog_used, i) && |
#ifdef POPEN_STREAM |
#ifdef POPEN_STREAM |
|
(p = pio_pgetpid(array(prg->prog_fds, i, FILE*)))) { |
|
kill(p->pid, SIGTERM); |
|
usleep(1000); |
|
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) |
|
kill(p->pid, SIGKILL); |
e_pclose(array(prg->prog_fds, i, FILE*)); |
e_pclose(array(prg->prog_fds, i, FILE*)); |
#else |
#else |
|
(p = pio_pgetpid((int) array(prg->prog_fds, i, intptr_t)))) { |
|
kill(p->pid, SIGTERM); |
|
usleep(1000); |
|
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) |
|
kill(p->pid, SIGKILL); |
e_pclose((int) array(prg->prog_fds, i, intptr_t)); |
e_pclose((int) array(prg->prog_fds, i, intptr_t)); |
#endif |
#endif |
array_Del(prg->prog_fds, i, 0); |
array_Del(prg->prog_fds, i, 0); |
Line 233 io_progVacuum(prog_t * __restrict prg, u_int toNum)
|
Line 302 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 |
* return: -1 error or >-1 exited programs |
* return: -1 error or >-1 exited programs |
*/ |
*/ |
int |
int |
io_progCheck(prog_t * __restrict prg) | io_progCheck(prog_t * __restrict prg, int re) |
{ |
{ |
int ret = 0; |
int ret = 0; |
struct tagPIOPID *p; |
struct tagPIOPID *p; |
Line 255 io_progCheck(prog_t * __restrict prg)
|
Line 325 io_progCheck(prog_t * __restrict prg)
|
#endif |
#endif |
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) { |
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) { |
clrbit(prg->prog_used, i); |
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++; |
ret++; |
} |
} |
pthread_mutex_unlock(&prg->prog_mtx); |
pthread_mutex_unlock(&prg->prog_mtx); |
|
|
|
/* resurrect */ |
|
if (re && ret > 0) |
|
io_progOpen(prg, ret); |
|
|
return ret; |
return ret; |
} |
} |