D3845: worker: support more return types in posix worker
hooper (Danny Hooper)
phabricator at mercurial-scm.org
Wed Jun 27 01:07:52 UTC 2018
hooper created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
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.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D3845
AFFECTED FILES
mercurial/worker.py
CHANGE DETAILS
diff --git a/mercurial/worker.py b/mercurial/worker.py
--- a/mercurial/worker.py
+++ b/mercurial/worker.py
@@ -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()
To: hooper, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list