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