Windows: a quick process no longer waits for a slow one started next to it

On Windows, a quick git call that Obeya started at the same moment as a slow one (a fetch, a push) could look unfinished until the slow one ended: the slow process had inherited the quick one's output pipe. On the server's own thread that meant the whole server stood still for as long. Obeya now starts one process at a time on Windows, and the server's own starts go first, so a quick call ends as quickly as it would alone.

Slowest quick call on a process thread8.4 s → 560 ms
Slowest quick call on the server's thread8.0 s → 166 ms

On Obeya's process threads

Where most git calls run. Each bar is one quick call, on one scale up to 8.5 s.

Before

8.1 s
8.4 s
530 ms
94 ms
93 ms
89 ms
95 ms
85 ms

After

560 ms
492 ms
448 ms
429 ms
399 ms
338 ms
299 ms
144 ms

On the server's thread

A call here holds up every page and agent until it ends.

Before

51 ms
8.0 s
435 ms
47 ms
45 ms
46 ms
42 ms
44 ms

After

53 ms
41 ms
52 ms
45 ms
50 ms
50 ms
166 ms
52 ms

How it was measured

On a Windows 11 machine: four slow processes of 8 s each, standing in for a fetch or a push, and started right among them eight quick git --version calls on the process threads and eight on the server's thread. The price: starts now take turns, so in a burst a call on a process thread can wait up to about a second for the starts ahead of it.

If a start ever hangs

A start that never returns (or a thread that ends in the middle of one) would otherwise leave every later start waiting, and with it the server. After ten seconds, the next start takes its turn anyway, and the server log says so. On macOS and Linux nothing changes: their pipes are never inherited.