]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merge 3.3.
authorRichard Oudkerk <shibturn@gmail.com>
Sun, 23 Mar 2014 12:52:16 +0000 (12:52 +0000)
committerRichard Oudkerk <shibturn@gmail.com>
Sun, 23 Mar 2014 12:52:16 +0000 (12:52 +0000)
1  2 
Lib/multiprocessing/popen_fork.py
Lib/multiprocessing/popen_forkserver.py
Misc/NEWS

index 463cc18aa397cd292bbbd36bb5a757467843fe71,0000000000000000000000000000000000000000..367e72e2b1c4278d1420f101dbe16879f938e1ec
mode 100644,000000..100644
--- /dev/null
@@@ -1,83 -1,0 +1,83 @@@
-                 from .connection import wait
 +import os
 +import sys
 +import signal
 +import errno
 +
 +from . import util
 +
 +__all__ = ['Popen']
 +
 +#
 +# Start child process using fork
 +#
 +
 +class Popen(object):
 +    method = 'fork'
 +
 +    def __init__(self, process_obj):
 +        sys.stdout.flush()
 +        sys.stderr.flush()
 +        self.returncode = None
 +        self._launch(process_obj)
 +
 +    def duplicate_for_child(self, fd):
 +        return fd
 +
 +    def poll(self, flag=os.WNOHANG):
 +        if self.returncode is None:
 +            while True:
 +                try:
 +                    pid, sts = os.waitpid(self.pid, flag)
 +                except OSError as e:
 +                    if e.errno == errno.EINTR:
 +                        continue
 +                    # Child process not yet created. See #1731717
 +                    # e.errno == errno.ECHILD == 10
 +                    return None
 +                else:
 +                    break
 +            if pid == self.pid:
 +                if os.WIFSIGNALED(sts):
 +                    self.returncode = -os.WTERMSIG(sts)
 +                else:
 +                    assert os.WIFEXITED(sts)
 +                    self.returncode = os.WEXITSTATUS(sts)
 +        return self.returncode
 +
 +    def wait(self, timeout=None):
 +        if self.returncode is None:
 +            if timeout is not None:
++                from multiprocessing.connection import wait
 +                if not wait([self.sentinel], timeout):
 +                    return None
 +            # This shouldn't block if wait() returned successfully.
 +            return self.poll(os.WNOHANG if timeout == 0.0 else 0)
 +        return self.returncode
 +
 +    def terminate(self):
 +        if self.returncode is None:
 +            try:
 +                os.kill(self.pid, signal.SIGTERM)
 +            except ProcessLookupError:
 +                pass
 +            except OSError:
 +                if self.wait(timeout=0.1) is None:
 +                    raise
 +
 +    def _launch(self, process_obj):
 +        code = 1
 +        parent_r, child_w = os.pipe()
 +        self.pid = os.fork()
 +        if self.pid == 0:
 +            try:
 +                os.close(parent_r)
 +                if 'random' in sys.modules:
 +                    import random
 +                    random.seed()
 +                code = process_obj._bootstrap()
 +            finally:
 +                os._exit(code)
 +        else:
 +            os.close(child_w)
 +            util.Finalize(self, os.close, (parent_r,))
 +            self.sentinel = parent_r
index b115f8123cea5265f3a515bd325c20f5e621e0f0,0000000000000000000000000000000000000000..e792194f44cea6df687227c269aaa9ab714f88c5
mode 100644,000000..100644
--- /dev/null
@@@ -1,69 -1,0 +1,69 @@@
-             from .connection import wait
 +import io
 +import os
 +
 +from . import reduction
 +if not reduction.HAVE_SEND_HANDLE:
 +    raise ImportError('No support for sending fds between processes')
 +from . import context
 +from . import forkserver
 +from . import popen_fork
 +from . import spawn
 +from . import util
 +
 +
 +__all__ = ['Popen']
 +
 +#
 +# Wrapper for an fd used while launching a process
 +#
 +
 +class _DupFd(object):
 +    def __init__(self, ind):
 +        self.ind = ind
 +    def detach(self):
 +        return forkserver.get_inherited_fds()[self.ind]
 +
 +#
 +# Start child process using a server process
 +#
 +
 +class Popen(popen_fork.Popen):
 +    method = 'forkserver'
 +    DupFd = _DupFd
 +
 +    def __init__(self, process_obj):
 +        self._fds = []
 +        super().__init__(process_obj)
 +
 +    def duplicate_for_child(self, fd):
 +        self._fds.append(fd)
 +        return len(self._fds) - 1
 +
 +    def _launch(self, process_obj):
 +        prep_data = spawn.get_preparation_data(process_obj._name)
 +        buf = io.BytesIO()
 +        context.set_spawning_popen(self)
 +        try:
 +            reduction.dump(prep_data, buf)
 +            reduction.dump(process_obj, buf)
 +        finally:
 +            context.set_spawning_popen(None)
 +
 +        self.sentinel, w = forkserver.connect_to_new_process(self._fds)
 +        util.Finalize(self, os.close, (self.sentinel,))
 +        with open(w, 'wb', closefd=True) as f:
 +            f.write(buf.getbuffer())
 +        self.pid = forkserver.read_unsigned(self.sentinel)
 +
 +    def poll(self, flag=os.WNOHANG):
 +        if self.returncode is None:
++            from multiprocessing.connection import wait
 +            timeout = 0 if flag == os.WNOHANG else None
 +            if not wait([self.sentinel], timeout):
 +                return None
 +            try:
 +                self.returncode = forkserver.read_unsigned(self.sentinel)
 +            except (OSError, EOFError):
 +                # The process ended abnormally perhaps because of a signal
 +                self.returncode = 255
 +        return self.returncode
diff --cc Misc/NEWS
index 5ec11eb8a8990f753f182065b72a5b9ec7f1597a,187d4b2ba611af691304d290b557b52772f6f409..b20e458906460fa110ee7bc2aac269eef1a051c7
+++ b/Misc/NEWS
@@@ -21,26 -13,10 +21,28 @@@ Core and Builtin
  Library
  -------
  
 -- Issue #20875: Prevent possible gzip "'read' is not defined" NameError.
 -  Patch by Claudiu Popa.
+ - Issue #20633: Replace relative import by absolute import.
 +- Issue #20980: Stop wrapping exception when using ThreadPool.
 +
 +- Issue #20990: Fix issues found by pyflakes for multiprocessing.
 +
 +- Issue #21015: SSL contexts will now automatically select an elliptic
 +  curve for ECDH key exchange on OpenSSL 1.0.2 and later, and otherwise
 +  default to "prime256v1".
 +
 +- Issue #20995: Enhance default ciphers used by the ssl module to enable
 +  better security an prioritize perfect forward secrecy.
 +
 +- Issue #20884: Don't assume that __file__ is defined on importlib.__init__.
 +
 +- Issue #20879: Delay the initialization of encoding and decoding tables for
 +  base32, ascii85 and base85 codecs in the base64 module, and delay the
 +  initialization of the unquote_to_bytes() table of the urllib.parse module, to
 +  not waste memory if these modules are not used.
 +
 +- Issue #19157: Include the broadcast address in the usuable hosts for IPv6
 +  in ipaddress.
  
  - Issue #11599: When an external command (e.g. compiler) fails, distutils now
    prints out the whole command line (instead of just the command name) if the