--- doc/forx.html | 5 ++++- src/execline/forx.c | 34 ++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/doc/forx.html b/doc/forx.html index 8f1d558..0dc43c2 100644 --- a/doc/forx.html +++ b/doc/forx.html _at__at_ -29,7 +29,7 _at__at_ </p> <pre> - forx [ -E | -e ] [ -p ] [ -o <em>okcodes</em> | -x <em>breakcodes</em> ] <em>variable</em> { <em>args...</em> } <em>loop...</em> + forx [ -E | -e ] [ -p | -P <em>maxpar</em> ] [ -o <em>okcodes</em> | -x <em>breakcodes</em> ] <em>variable</em> { <em>args...</em> } <em>loop...</em> </pre> <ul> _at__at_ -63,6 +63,9 _at__at_ will exit 0 if all of the exit codes are in the values listed in the <em>okcodes list, else it will exit 1. If the <tt>-x</tt> option has been given, <tt>forx</tt> will exit 0 if none of the exit codes are in the values listed in the <em>breakcodes</em> list, else it will exit 1. </li> + <li> <tt>-P</tt> : like <tt>-p</tt> but run up to <em>maxpar</em> instances +in parallel. 0 means unlimited. When <em>maxpar</em> is not 0 <em>forx</em> +may not spawn all instances. </li> <li> <tt>-e</tt> : no autoimport. This is the default. </li> <li> <tt>-E</tt> : autoimport. Instead of spawning <em>loop...</em>, spawn <tt>importas -ui <em>variable</em> <em>variable</em> diff --git a/src/execline/forx.c b/src/execline/forx.c index 1695c00..3f7b9c2 100644 --- a/src/execline/forx.c +++ b/src/execline/forx.c _at__at_ -23,10 +23,10 _at__at_ static int fx_isok (unsigned short const *tab, unsigned int n, int code) return i < n ; } -static int waitn_code (unsigned short const *tab, unsigned int nbc, pid_t *pids, unsigned int n, int not) +static int waitn_code (unsigned short const *tab, unsigned int nbc, pid_t *pids, unsigned int n, int not, int once) { int ok = 1 ; - while (n) + do { int wstat ; unsigned int i = 0 ; _at__at_ -39,6 +39,7 _at__at_ static int waitn_code (unsigned short const *tab, unsigned int nbc, pid_t *pids, pids[i] = pids[--n] ; } } + while (n && !once) ; return ok ; } _at__at_ -47,18 +48,19 _at__at_ int main (int argc, char const **argv) char const *var ; unsigned short okcodes[256] ; size_t nbc = 0 ; - int flagpar = 0, not = 1, doimport = 0 ; - unsigned int argc1 ; + int not = 1, doimport = 0 ; + unsigned int argc1, maxpar = 1 ; PROG = "forx" ; { subgetopt l = SUBGETOPT_ZERO ; for (;;) { - int opt = subgetopt_r(argc, argv, "po:x:Ee", &l) ; + int opt = subgetopt_r(argc, argv, "pP:o:x:Ee", &l) ; if (opt == -1) break ; switch (opt) { - case 'p' : flagpar = 1 ; break ; + case 'p' : maxpar = 0 ; break ; + case 'P' : if (!uint0_scan(l.arg, &maxpar)) dieusage() ; break ; case 'o' : not = 0 ; if (!ushort_scanlist(okcodes, 256, l.arg, &nbc)) dieusage() ; _at__at_ -81,14 +83,26 _at__at_ int main (int argc, char const **argv) argc1 = el_semicolon(argv) ; if (argc1 >= argc) strerr_dief1x(100, "unterminated block") ; if (!argc1 || (argc1 + 1 == argc)) return 0 ; + if (!maxpar || maxpar > argc1) maxpar = argc1; { - pid_t pids[flagpar ? argc1 : 1] ; + pid_t pids[maxpar] ; + int r = 0 ; for (unsigned int i = 0 ; i < argc1 ; i++) { pid_t pid = el_modif_and_spawn(argv + argc1 + 1, var, argv[i], doimport) ; if (!pid) strerr_diefu2sys(111, "spawn ", argv[argc1+1]) ; - if (flagpar) pids[i] = pid ; + if (maxpar != 1) { + if (i < maxpar-1) + pids[i] = pid ; + else + { + r = waitn_code(okcodes, nbc, pids, maxpar, not, 1) ; + if (r < 0) strerr_diefu1sys(111, "waitn") ; + else if (!r) break ; + pids[maxpar-1] = pid ; + } + } else { int wstat ; _at__at_ -99,9 +113,9 _at__at_ int main (int argc, char const **argv) } } - if (flagpar) + if (maxpar != 1) { - int r = waitn_code(okcodes, nbc, pids, argc1, not) ; + r = waitn_code(okcodes, nbc, pids, maxpar, not, 0) || r ; if (r < 0) strerr_diefu1sys(111, "waitn") ; else if (!r) return 1 ; } -- 2.45.2Received on Thu Jul 11 2024 - 16:06:38 CEST
This archive was generated by hypermail 2.4.0 : Thu Jul 11 2024 - 16:07:09 CEST