version 1.1.2.7, 2013/12/05 15:56:10
|
version 1.1.2.10, 2013/12/05 23:43:46
|
Line 28 io_progInit(const char *progName, u_int initNum, u_int
|
Line 28 io_progInit(const char *progName, u_int initNum, u_int
|
prg->prog_maxn = maxNum; |
prg->prog_maxn = maxNum; |
strlcpy(prg->prog_name, progName, sizeof prg->prog_name); |
strlcpy(prg->prog_name, progName, sizeof prg->prog_name); |
|
|
|
prg->prog_used = e_malloc(E_ALIGN(prg->prog_maxn, sizeof *prg->prog_used) / |
|
sizeof *prg->prog_used); |
|
if (!prg->prog_used) { |
|
io_SetErr(elwix_GetErrno(), "%s", elwix_GetError()); |
|
e_free(prg); |
|
return NULL; |
|
} |
|
|
prg->prog_fds = array_Init(prg->prog_maxn); |
prg->prog_fds = array_Init(prg->prog_maxn); |
if (!prg->prog_fds) { |
if (!prg->prog_fds) { |
io_SetErr(elwix_GetErrno(), "%s", elwix_GetError()); |
io_SetErr(elwix_GetErrno(), "%s", elwix_GetError()); |
|
e_free(prg->prog_used); |
e_free(prg); |
e_free(prg); |
return NULL; |
return NULL; |
} |
} |
Line 58 io_progDestroy(prog_t ** __restrict pprg)
|
Line 67 io_progDestroy(prog_t ** __restrict pprg)
|
|
|
io_progClose(*pprg, 0); |
io_progClose(*pprg, 0); |
|
|
|
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); |
|
|
Line 91 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
Line 101 io_progClose(prog_t * __restrict prg, u_int closeNum)
|
if (array_Get(prg->prog_fds, i)) { |
if (array_Get(prg->prog_fds, i)) { |
e_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); |
|
clrbit(prg->prog_used, i); |
prg->prog_cnum--; |
prg->prog_cnum--; |
ret++; |
ret++; |
} |
} |
Line 116 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
Line 127 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
|
|
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 145 io_progOpen(prog_t * __restrict prg, u_int execNum)
|
Line 156 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 168 io_progVacuum(prog_t * __restrict prg, u_int toNum)
|
Line 201 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) && isclr(prg->prog_used, i)) { |
e_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--; |
Line 195 io_progCheck(prog_t * __restrict prg)
|
Line 228 io_progCheck(prog_t * __restrict prg)
|
if (!prg) |
if (!prg) |
return -1; |
return -1; |
|
|
|
pthread_mutex_lock(&prg->prog_mtx); |
for (i = 0; i < array_Size(prg->prog_fds); i++) |
for (i = 0; i < array_Size(prg->prog_fds); i++) |
if (array_Get(prg->prog_fds, i) && |
if (array_Get(prg->prog_fds, i) && |
(p = pio_pgetpid(array(prg->prog_fds, i, FILE*)))) |
(p = pio_pgetpid(array(prg->prog_fds, i, FILE*)))) |
if (waitpid(p->pid, &p->stat, WNOHANG) > 0) | if (waitpid(p->pid, &p->stat, WNOHANG) > 0) { |
| clrbit(prg->prog_used, i); |
ret++; |
ret++; |
|
} |
|
pthread_mutex_unlock(&prg->prog_mtx); |
|
|
return ret; |
return ret; |
|
} |
|
|
|
/* |
|
* io_progAttach() - Attach to open program |
|
* |
|
* @prg = program pool |
|
* return: NULL error or !=NULL attached program handle |
|
*/ |
|
FILE * |
|
io_progAttach(prog_t * __restrict prg) |
|
{ |
|
FILE *f = NULL; |
|
register int i; |
|
|
|
if (!prg) |
|
return NULL; |
|
|
|
pthread_mutex_lock(&prg->prog_mtx); |
|
for (i = 0; i < array_Size(prg->prog_fds); i++) |
|
if (array_Get(prg->prog_fds, i) && isclr(prg->prog_used, i)) { |
|
setbit(prg->prog_used, i); |
|
f = array(prg->prog_fds, i, FILE*); |
|
break; |
|
} |
|
pthread_mutex_unlock(&prg->prog_mtx); |
|
|
|
return f; |
|
} |
|
|
|
/* |
|
* io_progDetach() - Detch from open program |
|
* |
|
* @prg= program pool |
|
* @pfd = attached program handle |
|
* return: none |
|
*/ |
|
void |
|
io_progDetach(prog_t * __restrict prg, FILE *pfd) |
|
{ |
|
register int i; |
|
|
|
if (!prg || !pfd) |
|
return; |
|
|
|
pthread_mutex_lock(&prg->prog_mtx); |
|
for (i = 0; i < array_Size(prg->prog_fds); i++) |
|
if (array(prg->prog_fds, i, FILE*) == pfd) { |
|
clrbit(prg->prog_used, i); |
|
break; |
|
} |
|
pthread_mutex_unlock(&prg->prog_mtx); |
} |
} |