mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Merge.
This commit is contained in:
commit
6f6f4865d1
6 changed files with 101 additions and 23 deletions
|
@ -511,9 +511,9 @@ conflict.
|
||||||
|
|
||||||
.. envvar:: PYTHONDONTWRITEBYTECODE
|
.. envvar:: PYTHONDONTWRITEBYTECODE
|
||||||
|
|
||||||
If this is set, Python won't try to write ``.pyc`` or ``.pyo`` files on the
|
If this is set to a non-empty string, Python won't try to write ``.pyc`` or
|
||||||
import of source modules. This is equivalent to specifying the :option:`-B`
|
``.pyo`` files on the import of source modules. This is equivalent to
|
||||||
option.
|
specifying the :option:`-B` option.
|
||||||
|
|
||||||
|
|
||||||
.. envvar:: PYTHONHASHSEED
|
.. envvar:: PYTHONHASHSEED
|
||||||
|
@ -582,11 +582,11 @@ conflict.
|
||||||
|
|
||||||
.. envvar:: PYTHONFAULTHANDLER
|
.. envvar:: PYTHONFAULTHANDLER
|
||||||
|
|
||||||
If this environment variable is set, :func:`faulthandler.enable` is called
|
If this environment variable is set to a non-empty string,
|
||||||
at startup: install a handler for :const:`SIGSEGV`, :const:`SIGFPE`,
|
:func:`faulthandler.enable` is called at startup: install a handler for
|
||||||
:const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL` signals to dump the
|
:const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and
|
||||||
Python traceback. This is equivalent to :option:`-X` ``faulthandler``
|
:const:`SIGILL` signals to dump the Python traceback. This is equivalent to
|
||||||
option.
|
:option:`-X` ``faulthandler`` option.
|
||||||
|
|
||||||
.. versionadded:: 3.3
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
|
|
@ -265,17 +265,33 @@ faulthandler._sigsegv()
|
||||||
# By default, the module should be disabled
|
# By default, the module should be disabled
|
||||||
code = "import faulthandler; print(faulthandler.is_enabled())"
|
code = "import faulthandler; print(faulthandler.is_enabled())"
|
||||||
args = (sys.executable, '-E', '-c', code)
|
args = (sys.executable, '-E', '-c', code)
|
||||||
# use subprocess module directly because test.script_helper adds
|
# don't use assert_python_ok() because it always enable faulthandler
|
||||||
# "-X faulthandler" to the command line
|
output = subprocess.check_output(args)
|
||||||
stdout = subprocess.check_output(args)
|
self.assertEqual(output.rstrip(), b"False")
|
||||||
self.assertEqual(stdout.rstrip(), b"False")
|
|
||||||
|
|
||||||
def test_sys_xoptions(self):
|
def test_sys_xoptions(self):
|
||||||
# Test python -X faulthandler
|
# Test python -X faulthandler
|
||||||
code = "import faulthandler; print(faulthandler.is_enabled())"
|
code = "import faulthandler; print(faulthandler.is_enabled())"
|
||||||
rc, stdout, stderr = assert_python_ok("-X", "faulthandler", "-c", code)
|
args = (sys.executable, "-E", "-X", "faulthandler", "-c", code)
|
||||||
stdout = (stdout + stderr).strip()
|
# don't use assert_python_ok() because it always enable faulthandler
|
||||||
self.assertEqual(stdout, b"True")
|
output = subprocess.check_output(args)
|
||||||
|
self.assertEqual(output.rstrip(), b"True")
|
||||||
|
|
||||||
|
def test_env_var(self):
|
||||||
|
# empty env var
|
||||||
|
code = "import faulthandler; print(faulthandler.is_enabled())"
|
||||||
|
args = (sys.executable, "-c", code)
|
||||||
|
env = os.environ.copy()
|
||||||
|
env['PYTHONFAULTHANDLER'] = ''
|
||||||
|
# don't use assert_python_ok() because it always enable faulthandler
|
||||||
|
output = subprocess.check_output(args, env=env)
|
||||||
|
self.assertEqual(output.rstrip(), b"False")
|
||||||
|
|
||||||
|
# non-empty env var
|
||||||
|
env = os.environ.copy()
|
||||||
|
env['PYTHONFAULTHANDLER'] = '1'
|
||||||
|
output = subprocess.check_output(args, env=env)
|
||||||
|
self.assertEqual(output.rstrip(), b"True")
|
||||||
|
|
||||||
def check_dump_traceback(self, filename):
|
def check_dump_traceback(self, filename):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -34,6 +34,10 @@ try:
|
||||||
import resource
|
import resource
|
||||||
except ImportError:
|
except ImportError:
|
||||||
resource = None
|
resource = None
|
||||||
|
try:
|
||||||
|
import fcntl
|
||||||
|
except ImportError:
|
||||||
|
fcntl = None
|
||||||
|
|
||||||
from test.script_helper import assert_python_ok
|
from test.script_helper import assert_python_ok
|
||||||
|
|
||||||
|
@ -2300,19 +2304,37 @@ class CPUCountTests(unittest.TestCase):
|
||||||
|
|
||||||
|
|
||||||
class FDInheritanceTests(unittest.TestCase):
|
class FDInheritanceTests(unittest.TestCase):
|
||||||
def test_get_inheritable(self):
|
def test_get_set_inheritable(self):
|
||||||
fd = os.open(__file__, os.O_RDONLY)
|
fd = os.open(__file__, os.O_RDONLY)
|
||||||
self.addCleanup(os.close, fd)
|
self.addCleanup(os.close, fd)
|
||||||
for inheritable in (False, True):
|
self.assertEqual(os.get_inheritable(fd), False)
|
||||||
os.set_inheritable(fd, inheritable)
|
|
||||||
self.assertEqual(os.get_inheritable(fd), inheritable)
|
|
||||||
|
|
||||||
def test_set_inheritable(self):
|
|
||||||
fd = os.open(__file__, os.O_RDONLY)
|
|
||||||
self.addCleanup(os.close, fd)
|
|
||||||
os.set_inheritable(fd, True)
|
os.set_inheritable(fd, True)
|
||||||
self.assertEqual(os.get_inheritable(fd), True)
|
self.assertEqual(os.get_inheritable(fd), True)
|
||||||
|
|
||||||
|
if fcntl:
|
||||||
|
def test_get_inheritable_cloexec(self):
|
||||||
|
fd = os.open(__file__, os.O_RDONLY)
|
||||||
|
self.addCleanup(os.close, fd)
|
||||||
|
self.assertEqual(os.get_inheritable(fd), False)
|
||||||
|
|
||||||
|
# clear FD_CLOEXEC flag
|
||||||
|
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
|
||||||
|
flags &= ~fcntl.FD_CLOEXEC
|
||||||
|
fcntl.fcntl(fd, fcntl.F_SETFD, flags)
|
||||||
|
|
||||||
|
self.assertEqual(os.get_inheritable(fd), True)
|
||||||
|
|
||||||
|
def test_set_inheritable_cloexec(self):
|
||||||
|
fd = os.open(__file__, os.O_RDONLY)
|
||||||
|
self.addCleanup(os.close, fd)
|
||||||
|
self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
|
||||||
|
fcntl.FD_CLOEXEC)
|
||||||
|
|
||||||
|
os.set_inheritable(fd, True)
|
||||||
|
self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
|
||||||
|
0)
|
||||||
|
|
||||||
def test_open(self):
|
def test_open(self):
|
||||||
fd = os.open(__file__, os.O_RDONLY)
|
fd = os.open(__file__, os.O_RDONLY)
|
||||||
self.addCleanup(os.close, fd)
|
self.addCleanup(os.close, fd)
|
||||||
|
|
|
@ -26,6 +26,10 @@ try:
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
except ImportError:
|
except ImportError:
|
||||||
multiprocessing = False
|
multiprocessing = False
|
||||||
|
try:
|
||||||
|
import fcntl
|
||||||
|
except ImportError:
|
||||||
|
fcntl = None
|
||||||
|
|
||||||
HOST = support.HOST
|
HOST = support.HOST
|
||||||
MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
|
MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
|
||||||
|
@ -4804,6 +4808,32 @@ class InheritanceTest(unittest.TestCase):
|
||||||
sock.set_inheritable(False)
|
sock.set_inheritable(False)
|
||||||
self.assertEqual(sock.get_inheritable(), False)
|
self.assertEqual(sock.get_inheritable(), False)
|
||||||
|
|
||||||
|
if fcntl:
|
||||||
|
def test_get_inheritable_cloexec(self):
|
||||||
|
sock = socket.socket()
|
||||||
|
with sock:
|
||||||
|
fd = sock.fileno()
|
||||||
|
self.assertEqual(sock.get_inheritable(), False)
|
||||||
|
|
||||||
|
# clear FD_CLOEXEC flag
|
||||||
|
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
|
||||||
|
flags &= ~fcntl.FD_CLOEXEC
|
||||||
|
fcntl.fcntl(fd, fcntl.F_SETFD, flags)
|
||||||
|
|
||||||
|
self.assertEqual(sock.get_inheritable(), True)
|
||||||
|
|
||||||
|
def test_set_inheritable_cloexec(self):
|
||||||
|
sock = socket.socket()
|
||||||
|
with sock:
|
||||||
|
fd = sock.fileno()
|
||||||
|
self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
|
||||||
|
fcntl.FD_CLOEXEC)
|
||||||
|
|
||||||
|
sock.set_inheritable(True)
|
||||||
|
self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
|
||||||
|
0)
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(socket, "socketpair"),
|
@unittest.skipUnless(hasattr(socket, "socketpair"),
|
||||||
"need socket.socketpair()")
|
"need socket.socketpair()")
|
||||||
def test_socketpair(self):
|
def test_socketpair(self):
|
||||||
|
|
|
@ -7,6 +7,13 @@ What's New in Python 3.4.0 Alpha 3?
|
||||||
|
|
||||||
Projected Release date: 2013-10-XX
|
Projected Release date: 2013-10-XX
|
||||||
|
|
||||||
|
Library
|
||||||
|
-------
|
||||||
|
|
||||||
|
- The :envvar:`PYTHONFAULTHANDLER` environment variable now only enables the
|
||||||
|
faulthandler module if the variable is non-empty. Same behaviour than other
|
||||||
|
variables like :envvar:`PYTHONDONTWRITEBYTECODE`.
|
||||||
|
|
||||||
Tests
|
Tests
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
|
@ -1048,8 +1048,11 @@ faulthandler_env_options(void)
|
||||||
{
|
{
|
||||||
PyObject *xoptions, *key, *module, *res;
|
PyObject *xoptions, *key, *module, *res;
|
||||||
_Py_IDENTIFIER(enable);
|
_Py_IDENTIFIER(enable);
|
||||||
|
char *p;
|
||||||
|
|
||||||
if (!Py_GETENV("PYTHONFAULTHANDLER")) {
|
if (!((p = Py_GETENV("PYTHONFAULTHANDLER")) && *p != '\0')) {
|
||||||
|
/* PYTHONFAULTHANDLER environment variable is missing
|
||||||
|
or an empty string */
|
||||||
int has_key;
|
int has_key;
|
||||||
|
|
||||||
xoptions = PySys_GetXOptions();
|
xoptions = PySys_GetXOptions();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue