Add support for Portage 2.1.11.31.

Portage 2.1.11.31 initializes a pipe in the Scheduler constructor, so
this means that it is not safe any more to close all open file descriptors
in between the initialization of the Scheduler object and the call to
scheduler.merge().

To fix this, I've moved the initialization of the Scheduler object into
the EmergeProcess method. This should work just as well with both old
and new versions of Portage.

In addition, I've also updated the EmergeProcess method to set up
sys.__stdin__, since this filehandle is closed by multiprocessing but is
needed by Portage.

BUG=chromium-os:35982
TEST=Run lots of remote trybot runs with both the old and new versions
     of Portage, to verify this change is compatible with both versions.

Change-Id: Ia95be518d3a6387275e471e1144818138ff05805
Reviewed-on: https://gerrit.chromium.org/gerrit/37224
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Tested-by: David James <davidjames@chromium.org>
Reviewed-by: Brian Harring <ferringb@chromium.org>
Commit-Ready: David James <davidjames@chromium.org>
diff --git a/scripts/parallel_emerge.py b/scripts/parallel_emerge.py
index 6a861c2..b91cb9b 100644
--- a/scripts/parallel_emerge.py
+++ b/scripts/parallel_emerge.py
@@ -849,12 +849,13 @@
   signal.signal(signal.SIGINT, ExitHandler)
   signal.signal(signal.SIGTERM, ExitHandler)
 
-def EmergeProcess(scheduler, output):
+def EmergeProcess(output, *args, **kwargs):
   """Merge a package in a subprocess.
 
   Args:
-    scheduler: Scheduler object.
     output: Temporary file to write output.
+    *args: Arguments to pass to Scheduler constructor.
+    **kwargs: Keyword arguments to pass to Scheduler constructor.
 
   Returns:
     The exit code returned by the subprocess.
@@ -881,7 +882,13 @@
       # Portage doesn't like when sys.stdin.fileno() != 0, so point sys.stdin
       # at the filehandle we just created in _setup_pipes.
       if sys.stdin.fileno() != 0:
-        sys.stdin = os.fdopen(0, "r")
+        sys.__stdin__ = sys.stdin = os.fdopen(0, "r")
+
+      scheduler = Scheduler(*args, **kwargs)
+
+      # Enable blocker handling even though we're in --nodeps mode. This
+      # allows us to unmerge the blocker after we've merged the replacement.
+      scheduler._opts_ignore_blockers = frozenset()
 
       # Actually do the merge.
       retval = scheduler.merge()
@@ -973,14 +980,9 @@
     else:
       try:
         emerge.scheduler_graph.mergelist = install_list
-        scheduler = Scheduler(settings, trees, mtimedb, opts, spinner,
-            favorites=emerge.favorites, graph_config=emerge.scheduler_graph)
-
-        # Enable blocker handling even though we're in --nodeps mode. This
-        # allows us to unmerge the blocker after we've merged the replacement.
-        scheduler._opts_ignore_blockers = frozenset()
-
-        retcode = EmergeProcess(scheduler, output)
+        retcode = EmergeProcess(output, settings, trees, mtimedb, opts,
+            spinner, favorites=emerge.favorites,
+            graph_config=emerge.scheduler_graph)
       except Exception:
         traceback.print_exc(file=output)
         retcode = 1