run-command API: make "n" parameter a "size_t"

Make the "n" variable added in c553c72eed6 (run-command: add an asynchronous parallel child processor, 2015-12-15) a "size_t". As we'll see in a subsequent commit we do pass "0" here, but never "jobs < 0". We could have made it an "unsigned int", but as we're having to change this let's not leave another case in the codebase where a size_t and "unsigned int" size differ on some platforms. In this case it's likely to never matter, but it's easier to not need to worry about it. After this and preceding changes: make run-command.o DEVOPTS=extra-all CFLAGS=-Wno-unused-parameter Only has one (and new) -Wsigned-compare warning relevant to a comparison about our "n" or "{nr,max}_processes": About using our "n" (size_t) in the same expression as online_cpus() (int). A subsequent commit will adjust & deal with online_cpus() and that warning. The only users of the "n" parameter are: * builtin/fetch.c: defaults to 1, reads from the "fetch.parallel" config. As seen in the code that parses the config added in d54dea77dba (fetch: let --jobs=<n> parallelize --multiple, too, 2019-10-05) will die if the git_config_int() return value is < 0. It will however pass us n = 0, as we'll see in a subsequent commit. * submodule.c: defaults to 1, reads from "submodule.fetchJobs" config. Read via code originally added in a028a1930c6 (fetching submodules: respect `submodule.fetchJobs` config option, 2016-02-29). It now piggy-backs on the the submodule.fetchJobs code and validation added in f20e7c1ea24 (submodule: remove submodule.fetchjobs from submodule-config parsing, 2017-08-02). Like builtin/fetch.c it will die if the git_config_int() return value is < 0, but like builtin/fetch.c it will pass us n = 0. * builtin/submodule--helper.c: defaults to 1. Read via code originally added in 2335b870fa7 (submodule update: expose parallelism to the user, 2016-02-29). Since f20e7c1ea24 (submodule: remove submodule.fetchjobs from submodule-config parsing, 2017-08-02) it shares a config parser and semantics with the submodule.c caller. * hook.c: hardcoded to 1, see 96e7225b310 (hook: add 'run' subcommand, 2021-12-22). * t/helper/test-run-command.c: can be -1 after parsing the arguments, but will then be overridden to online_cpus() before passing it to this API. See be5d88e1128 (test-tool run-command: learn to run (parts of) the testsuite, 2019-10-04). Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ævar Arnfjörð Bjarmason committed Oct 12, 2022 at 23:02 UTC 6a48b428b4c36c4f96ccb64a189658887c78be3f
2 files changed +20 -26
run-command.c
+18 -24
@@ -1500,8 +1500,8 @@ int run_processes_parallel_ungroup;
1500 struct parallel_processes {
1501 void *data;
1502
1503 - int max_processes;
1504 - int nr_processes;
1503 + size_t max_processes;
1504 + size_t nr_processes;
1505
1506 get_next_task_fn get_next_task;
1507 start_failure_fn start_failure;
@@ -1522,7 +1522,7 @@ struct parallel_processes {
1522 unsigned shutdown : 1;
1523 unsigned ungroup : 1;
1524
1525 - int output_owner;
1525 + size_t output_owner;
1526 struct strbuf buffered_output; /* of finished children */
1527 };
1528
@@ -1543,9 +1543,7 @@ static int default_task_finished(int result,
1543
1544 static void kill_children(struct parallel_processes *pp, int signo)
1545 {
1546 - int i, n = pp->max_processes;
1547 -
1548 - for (i = 0; i < n; i++)
1546 + for (size_t i = 0; i < pp->max_processes; i++)
1547 if (pp->children[i].state == GIT_CP_WORKING)
1548 kill(pp->children[i].process.pid, signo);
1549 }
@@ -1560,20 +1558,19 @@ static void handle_children_on_signal(int signo)
1558 }
1559
1560 static void pp_init(struct parallel_processes *pp,
1563 - int n,
1561 + size_t n,
1562 get_next_task_fn get_next_task,
1563 start_failure_fn start_failure,
1564 task_finished_fn task_finished,
1565 void *data, int ungroup)
1566 {
1569 - int i;
1570 -
1567 if (n < 1)
1568 n = online_cpus();
1569
1570 pp->max_processes = n;
1571
1576 - trace_printf("run_processes_parallel: preparing to run up to %d tasks", n);
1572 + trace_printf("run_processes_parallel: preparing to run up to %"PRIuMAX" tasks",
1573 + (uintmax_t)n);
1574
1575 pp->data = data;
1576 if (!get_next_task)
@@ -1594,7 +1591,7 @@ static void pp_init(struct parallel_processes *pp,
1591 CALLOC_ARRAY(pp->pfd, n);
1592 strbuf_init(&pp->buffered_output, 0);
1593
1597 - for (i = 0; i < n; i++) {
1594 + for (size_t i = 0; i < n; i++) {
1595 strbuf_init(&pp->children[i].err, 0);
1596 child_process_init(&pp->children[i].process);
1597 if (pp->pfd) {
@@ -1609,10 +1606,8 @@ static void pp_init(struct parallel_processes *pp,
1606
1607 static void pp_cleanup(struct parallel_processes *pp)
1608 {
1612 - int i;
1613 -
1609 trace_printf("run_processes_parallel: done");
1615 - for (i = 0; i < pp->max_processes; i++) {
1610 + for (size_t i = 0; i < pp->max_processes; i++) {
1611 strbuf_release(&pp->children[i].err);
1612 child_process_clear(&pp->children[i].process);
1613 }
@@ -1639,7 +1634,8 @@ static void pp_cleanup(struct parallel_processes *pp)
1634 */
1635 static int pp_start_one(struct parallel_processes *pp)
1636 {
1642 - int i, code;
1637 + size_t i;
1638 + int code;
1639
1640 for (i = 0; i < pp->max_processes; i++)
1641 if (pp->children[i].state == GIT_CP_FREE)
@@ -1697,7 +1693,7 @@ static void pp_buffer_stderr(struct parallel_processes *pp, int output_timeout)
1693 }
1694
1695 /* Buffer output from all pipes. */
1700 - for (i = 0; i < pp->max_processes; i++) {
1696 + for (size_t i = 0; i < pp->max_processes; i++) {
1697 if (pp->children[i].state == GIT_CP_WORKING &&
1698 pp->pfd[i].revents & (POLLIN | POLLHUP)) {
1699 int n = strbuf_read_once(&pp->children[i].err,
@@ -1714,7 +1710,7 @@ static void pp_buffer_stderr(struct parallel_processes *pp, int output_timeout)
1710
1711 static void pp_output(struct parallel_processes *pp)
1712 {
1717 - int i = pp->output_owner;
1713 + size_t i = pp->output_owner;
1714
1715 if (pp->children[i].state == GIT_CP_WORKING &&
1716 pp->children[i].err.len) {
@@ -1725,8 +1721,8 @@ static void pp_output(struct parallel_processes *pp)
1721
1722 static int pp_collect_finished(struct parallel_processes *pp)
1723 {
1728 - int i, code;
1729 - int n = pp->max_processes;
1724 + int code;
1725 + size_t i, n = pp->max_processes;
1726 int result = 0;
1727
1728 while (pp->nr_processes > 0) {
@@ -1783,7 +1779,7 @@ static int pp_collect_finished(struct parallel_processes *pp)
1779 return result;
1780 }
1781
1786 -void run_processes_parallel(int n,
1782 +void run_processes_parallel(size_t n,
1783 get_next_task_fn get_next_task,
1784 start_failure_fn start_failure,
1785 task_finished_fn task_finished,
@@ -1817,9 +1813,7 @@ void run_processes_parallel(int n,
1813 if (!pp.nr_processes)
1814 break;
1815 if (ungroup) {
1820 - int i;
1821 -
1822 - for (i = 0; i < pp.max_processes; i++)
1816 + for (size_t i = 0; i < pp.max_processes; i++)
1817 pp.children[i].state = GIT_CP_WAIT_CLEANUP;
1818 } else {
1819 pp_buffer_stderr(&pp, output_timeout);
@@ -1836,7 +1830,7 @@ void run_processes_parallel(int n,
1830 pp_cleanup(&pp);
1831 }
1832
1839 -void run_processes_parallel_tr2(int n, get_next_task_fn get_next_task,
1833 +void run_processes_parallel_tr2(size_t n, get_next_task_fn get_next_task,
1834 start_failure_fn start_failure,
1835 task_finished_fn task_finished, void *pp_cb,
1836 const char *tr2_category, const char *tr2_label)
run-command.h
+2 -2
@@ -485,12 +485,12 @@ typedef int (*task_finished_fn)(int result,
485 * API reads that setting.
486 */
487 extern int run_processes_parallel_ungroup;
488 -void run_processes_parallel(int n,
488 +void run_processes_parallel(size_t n,
489 get_next_task_fn,
490 start_failure_fn,
491 task_finished_fn,
492 void *pp_cb);
493 -void run_processes_parallel_tr2(int n, get_next_task_fn, start_failure_fn,
493 +void run_processes_parallel_tr2(size_t n, get_next_task_fn, start_failure_fn,
494 task_finished_fn, void *pp_cb,
495 const char *tr2_category, const char *tr2_label);
496