run-command.c: remove "max_processes", add "const" to signal() handler
As with the *_fn members removed in a preceding commit, let's not copy the "processes" member of the "struct run_process_parallel_opts" over to the "struct parallel_processes". In this case we need the number of processes for the kill_children() function, which will be called from a signal handler. To do that adjust this code added in c553c72eed6 (run-command: add an asynchronous parallel child processor, 2015-12-15) so that we use a dedicated "struct parallel_processes_for_signal" for passing data to the signal handler, in addition to the "struct parallel_process" it'll now have access to our "opts" variable. 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
0b0ab95f17d5eb71d2552e2c3b0806e2ed87beca
1 file changed
+26
-11
run-command.c
+26
-11
@@ -1497,7 +1497,6 @@ enum child_state {
1497
};
1498
1499
struct parallel_processes {
1500
- const size_t max_processes;
1500
size_t nr_processes;
1501
1502
struct {
@@ -1518,24 +1517,38 @@ struct parallel_processes {
1517
struct strbuf buffered_output; /* of finished children */
1518
};
1519
1521
-static void kill_children(const struct parallel_processes *pp, int signo)
1520
+struct parallel_processes_for_signal {
1521
+ const struct run_process_parallel_opts *opts;
1522
+ const struct parallel_processes *pp;
1523
+};
1524
+
1525
+static void kill_children(const struct parallel_processes *pp,
1526
+ const struct run_process_parallel_opts *opts,
1527
+ int signo)
1528
{
1523
- for (size_t i = 0; i < pp->max_processes; i++)
1529
+ for (size_t i = 0; i < opts->processes; i++)
1530
if (pp->children[i].state == GIT_CP_WORKING)
1531
kill(pp->children[i].process.pid, signo);
1532
}
1533
1528
-static struct parallel_processes *pp_for_signal;
1534
+static void kill_children_signal(const struct parallel_processes_for_signal *pp_sig,
1535
+ int signo)
1536
+{
1537
+ kill_children(pp_sig->pp, pp_sig->opts, signo);
1538
+}
1539
+
1540
+static struct parallel_processes_for_signal *pp_for_signal;
1541
1542
static void handle_children_on_signal(int signo)
1543
{
1532
- kill_children(pp_for_signal, signo);
1544
+ kill_children_signal(pp_for_signal, signo);
1545
sigchain_pop(signo);
1546
raise(signo);
1547
}
1548
1549
static void pp_init(struct parallel_processes *pp,
1538
- const struct run_process_parallel_opts *opts)
1550
+ const struct run_process_parallel_opts *opts,
1551
+ struct parallel_processes_for_signal *pp_sig)
1552
{
1553
const size_t n = opts->processes;
1554
@@ -1561,7 +1574,9 @@ static void pp_init(struct parallel_processes *pp,
1574
}
1575
}
1576
1564
- pp_for_signal = pp;
1577
+ pp_sig->pp = pp;
1578
+ pp_sig->opts = opts;
1579
+ pp_for_signal = pp_sig;
1580
sigchain_push_common(handle_children_on_signal);
1581
}
1582
@@ -1759,8 +1774,8 @@ void run_processes_parallel(const struct run_process_parallel_opts *opts)
1774
int i, code;
1775
int output_timeout = 100;
1776
int spawn_cap = 4;
1777
+ struct parallel_processes_for_signal pp_sig;
1778
struct parallel_processes pp = {
1763
- .max_processes = opts->processes,
1779
.buffered_output = STRBUF_INIT,
1780
};
1781
/* options */
@@ -1772,7 +1787,7 @@ void run_processes_parallel(const struct run_process_parallel_opts *opts)
1787
trace2_region_enter_printf(tr2_category, tr2_label, NULL,
1788
"max:%d", opts->processes);
1789
1775
- pp_init(&pp, opts);
1790
+ pp_init(&pp, opts, &pp_sig);
1791
while (1) {
1792
for (i = 0;
1793
i < spawn_cap && !pp.shutdown &&
@@ -1783,7 +1798,7 @@ void run_processes_parallel(const struct run_process_parallel_opts *opts)
1798
continue;
1799
if (code < 0) {
1800
pp.shutdown = 1;
1786
- kill_children(&pp, -code);
1801
+ kill_children(&pp, opts, -code);
1802
}
1803
break;
1804
}
@@ -1800,7 +1815,7 @@ void run_processes_parallel(const struct run_process_parallel_opts *opts)
1815
if (code) {
1816
pp.shutdown = 1;
1817
if (code < 0)
1803
- kill_children(&pp, -code);
1818
+ kill_children(&pp, opts,-code);
1819
}
1820
}
1821