Mercurial > hg
changeset 38535:8c38d2948217
worker: support more return types in posix worker
This allows us to return things that aren't tuple(int, str) from worker
functions. I wanted to use marshal instead of pickle, but it seems to read from
the pipe in non-blocking mode, which means it stops before it sees the results.
The windows worker already supports arbitrary return values without
serialization, because it uses threads instead of subprocesses.
Differential Revision: https://phab.mercurial-scm.org/D3845
author | Danny Hooper <hooper@google.com> |
---|---|
date | Tue, 26 Jun 2018 15:27:29 -0700 |
parents | b86664c81833 |
children | 5ffe2041d427 |
files | mercurial/worker.py |
diffstat | 1 files changed, 11 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/worker.py Tue Jun 19 19:18:31 2018 +0100 +++ b/mercurial/worker.py Tue Jun 26 15:27:29 2018 -0700 @@ -155,8 +155,8 @@ def workerfunc(): os.close(rfd) - for i, item in func(*(staticargs + (pargs,))): - os.write(wfd, '%d %s\n' % (i, item)) + for result in func(*(staticargs + (pargs,))): + os.write(wfd, util.pickle.dumps(result)) return 0 ret = scmutil.callcatch(ui, workerfunc) @@ -187,9 +187,15 @@ os.kill(os.getpid(), -status) sys.exit(status) try: - for line in util.iterfile(fp): - l = line.split(' ', 1) - yield int(l[0]), l[1][:-1] + while True: + try: + yield util.pickle.load(fp) + except EOFError: + break + except IOError as e: + if e.errno == errno.EINTR: + continue + raise except: # re-raises killworkers() cleanup()