[PATCH] worker: flush ui buffers before running the worker
Ryan McElroy
rm at fb.com
Tue Mar 28 15:03:42 EDT 2017
On 3/28/17 6:22 PM, David Soria Parra wrote:
> # HG changeset patch
> # User David Soria Parra <davidsp at fb.com>
> # Date 1490721698 25200
> # Tue Mar 28 10:21:38 2017 -0700
> # Node ID b89199982355728a3741edf5518c72ccc52ee33c
> # Parent 331cc4433efe0d897bb16ad4ff08a3fbe850869b
> worker: flush ui buffers before running the worker
This one makes sense to me and code looks good. Marked as pre-reviewed.
>
> a91c6275 introduces flushing ui buffers after a worker finished. If the ui was
> not flushed before the worker was started, fork will copy the existing buffers
> to the worker. This causes messages issued before the worker started to be
> written to the terminal for each worker.
>
> We are now flushing the ui before we start a worker and add an appropriate test
> which will fail before this patch.
>
> diff --git a/mercurial/worker.py b/mercurial/worker.py
> --- a/mercurial/worker.py
> +++ b/mercurial/worker.py
> @@ -133,6 +133,7 @@
> if problem[0]:
> killworkers()
> oldchldhandler = signal.signal(signal.SIGCHLD, sigchldhandler)
> + ui.flush()
> for pargs in partition(args, workers):
> pid = os.fork()
> if pid == 0:
> diff --git a/tests/test-worker.t b/tests/test-worker.t
> new file mode 100644
> --- /dev/null
> +++ b/tests/test-worker.t
> @@ -0,0 +1,52 @@
> +Test UI worker interaction
> +
> + $ cat > t.py <<EOF
> + > from __future__ import absolute_import, print_function
> + > from mercurial import (
> + > worker, ui as uimod, cmdutil
> + > )
> + > def runme(ui, args):
> + > for arg in args:
> + > ui.status('run\n')
> + > yield 1, arg
> + > cmdtable = {}
> + > command = cmdutil.command(cmdtable)
> + > @command('test', [], 'hg test [COST]')
> + > def t(ui, repo, cost=1.0):
> + > cost = float(cost)
> + > ui.status('start\n')
> + > runs = worker.worker(ui, cost, runme, (ui,), range(8))
> + > for n, i in runs:
> + > pass
> + > ui.status('done\n')
> + > EOF
> + $ abspath=`pwd`/t.py
> + $ hg init
> +
> +Run tests with worker enable by forcing a heigh cost
> +
> + $ hg --config "extensions.t=$abspath" test 100000.0
> + start
> + run
> + run
> + run
> + run
> + run
> + run
> + run
> + run
> + done
> +
> +Run tests without worker by forcing a low cost
> +
> + $ hg --config "extensions.t=$abspath" test 0.0000001
> + start
> + run
> + run
> + run
> + run
> + run
> + run
> + run
> + run
> + done
>
More information about the Mercurial-devel
mailing list