Return to exec.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / libaitio / src |
1.1.2.1 misho 1: #include "global.h"
2:
3:
4: /*
5: * io_progInit() - Init program pool
6: *
7: * @progName = program name for execution
8: * @initNum = initial started programs
9: * @maxNum = maximum started programs
10: * return: NULL error or !=NULL allocated pool (must destroied with io_progDestroy())
11: */
12: prog_t *
13: io_progInit(const char *progName, u_int initNum, u_int maxNum)
14: {
15: prog_t *prg = NULL;
16:
17: if (initNum > maxNum)
18: return NULL;
19:
20: prg = e_malloc(sizeof(prog_t));
21: if (!prg) {
22: io_SetErr(elwix_GetErrno(), "%s", elwix_GetError());
23: return NULL;
24: } else
25: memset(prg, 0, sizeof(prog_t));
26:
27: prg->prog_inin = initNum;
28: prg->prog_maxn = maxNum;
29: strlcpy(prg->prog_name, progName, sizeof prg->prog_name);
30:
31: prg->prog_fds = array_Init(prg->prog_maxn);
32: if (!prg->prog_fds) {
33: io_SetErr(elwix_GetErrno(), "%s", elwix_GetError());
34: e_free(prg);
35: return NULL;
36: }
37:
38: pthread_mutex_init(&prg->prog_mtx, NULL);
1.1.2.2 misho 39:
1.1.2.3 ! misho 40: if (io_progOpen(prg, prg->prog_inin) < 0)
1.1.2.2 misho 41: io_progDestroy(&prg);
1.1.2.1 misho 42: return prg;
43: }
44:
45: /*
46: * io_progDestroy() - Destroy entire program pool
47: *
48: * @pprg = program pool
49: * return: none
50: */
51: void
52: io_progDestroy(prog_t ** __restrict pprg)
53: {
54: if (!pprg || !*pprg)
55: return;
56:
57: io_progClose(*pprg, 0);
58:
59: array_Destroy(&(*pprg)->prog_fds);
60: pthread_mutex_destroy(&(*pprg)->prog_mtx);
61:
62: e_free(*pprg);
63: *pprg = NULL;
64: }
65:
66: /*
67: * io_progClose() - Close all programs in pool
68: *
69: * @prg = program pool
70: * @closeNum = close program(s) (0 all)
71: * return: 0 error, >0 closed programs
72: */
73: int
74: io_progClose(prog_t * __restrict prg, u_int closeNum)
75: {
76: register int i;
77: int ret = 0;
78:
79: if (!prg)
80: return 0;
81: if (closeNum > prg->prog_maxn) {
82: io_SetErr(EINVAL, "Requested number for close program is over pool's limit");
83: return 0;
84: }
85:
86: pthread_mutex_lock(&prg->prog_mtx);
87: for (i = array_Size(prg->prog_fds) - 1;
88: (closeNum ? ret < closeNum : 42) && i > -1; i--)
89: if (array_Get(prg->prog_fds, i)) {
90: pclose(array(prg->prog_fds, i, FILE*));
91: array_Del(prg->prog_fds, i, 0);
92: prg->prog_cnum--;
93: ret++;
94: }
95: pthread_mutex_unlock(&prg->prog_mtx);
96:
97: return ret;
98: }
99:
100: /*
101: * io_progOpen() - Execute number of program(s)
102: *
103: * @prg = program pool
104: * @execNum = execute program(s) (0 max)
105: * return: 0 error, >0 executed programs and abs(<0) executed programs with logged error
106: */
107: int
108: io_progOpen(prog_t * __restrict prg, u_int execNum)
109: {
110: FILE *f;
111: int ret = 0;
112: register int i;
113:
114: if (!prg)
115: return 0;
116: if (execNum > prg->prog_maxn) {
117: io_SetErr(EINVAL, "Requested number for program execution is over pool's limit");
118: return 0;
119: }
120:
121: pthread_mutex_lock(&prg->prog_mtx);
122: for (i = 0; (execNum ? ret < execNum : 42) && i < array_Size(prg->prog_fds); i++)
123: if (!array_Get(prg->prog_fds, i)) {
124: f = popen(prg->prog_name, "r+");
125: if (!f) {
126: LOGERR;
127: ret *= -1;
128: break;
129: } else
130: array_Set(prg->prog_fds, i, f);
131: prg->prog_cnum++;
132: ret++;
133: }
134: pthread_mutex_unlock(&prg->prog_mtx);
135:
136: return ret;
137: }
138:
139: /*
140: * io_progVacuum() - Vacuum pool to running number of programs
141: *
142: * @prg = program pool
143: * @toNum = vacuum to number of programs (0 to init number)
144: * return: 0 error or >0 closed programs
145: */
146: int
147: io_progVacuum(prog_t * __restrict prg, u_int toNum)
148: {
149: register int i;
150: int ret = 0;
151:
152: if (!prg)
153: return 0;
154: if (toNum > prg->prog_maxn) {
155: io_SetErr(EINVAL, "Requested number for close program is over pool's limit");
156: return 0;
157: }
158: if (!toNum)
159: toNum = prg->prog_inin;
160:
161: pthread_mutex_lock(&prg->prog_mtx);
162: for (i = array_Size(prg->prog_fds) - 1; prg->prog_cnum > toNum && i > -1; i--)
163: if (array_Get(prg->prog_fds, i)) {
164: pclose(array(prg->prog_fds, i, FILE*));
165: array_Del(prg->prog_fds, i, 0);
166: prg->prog_cnum--;
167: ret++;
168: }
169: pthread_mutex_unlock(&prg->prog_mtx);
170:
171: return ret;
172: }