[Python-checkins] cpython (merge default -> default): Merge.

charles-francois.natali python-checkins at python.org
Sun Sep 8 12:36:18 CEST 2013


http://hg.python.org/cpython/rev/59b15f5194dc
changeset: 85622:59b15f5194dc
parent: 85621:fa735675e485
parent: 85619:b7f6f6f59e91
user: Charles-François Natali <cf.natali at gmail.com>
date: Sun Sep 08 12:35:53 2013 +0200
summary:
 Merge.
files:
 Doc/using/cmdline.rst | 16 +++++-----
 Lib/test/test_faulthandler.py | 30 ++++++++++++++----
 Lib/test/test_os.py | 36 ++++++++++++++++++----
 Lib/test/test_socket.py | 30 +++++++++++++++++++
 Misc/NEWS | 7 ++++
 Modules/faulthandler.c | 5 ++-
 6 files changed, 101 insertions(+), 23 deletions(-)
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
@@ -511,9 +511,9 @@
 
 .. envvar:: PYTHONDONTWRITEBYTECODE
 
- If this is set, Python won't try to write ``.pyc`` or ``.pyo`` files on the
- import of source modules. This is equivalent to specifying the :option:`-B`
- option.
+ If this is set to a non-empty string, Python won't try to write ``.pyc`` or
+ ``.pyo`` files on the import of source modules. This is equivalent to
+ specifying the :option:`-B` option.
 
 
 .. envvar:: PYTHONHASHSEED
@@ -582,11 +582,11 @@
 
 .. envvar:: PYTHONFAULTHANDLER
 
- If this environment variable is set, :func:`faulthandler.enable` is called
- at startup: install a handler for :const:`SIGSEGV`, :const:`SIGFPE`,
- :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL` signals to dump the
- Python traceback. This is equivalent to :option:`-X` ``faulthandler``
- option.
+ If this environment variable is set to a non-empty string,
+ :func:`faulthandler.enable` is called at startup: install a handler for
+ :const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and
+ :const:`SIGILL` signals to dump the Python traceback. This is equivalent to
+ :option:`-X` ``faulthandler`` option.
 
 .. versionadded:: 3.3
 
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -265,17 +265,33 @@
 # By default, the module should be disabled
 code = "import faulthandler; print(faulthandler.is_enabled())"
 args = (sys.executable, '-E', '-c', code)
- # use subprocess module directly because test.script_helper adds
- # "-X faulthandler" to the command line
- stdout = subprocess.check_output(args)
- self.assertEqual(stdout.rstrip(), b"False")
+ # don't use assert_python_ok() because it always enable faulthandler
+ output = subprocess.check_output(args)
+ self.assertEqual(output.rstrip(), b"False")
 
 def test_sys_xoptions(self):
 # Test python -X faulthandler
 code = "import faulthandler; print(faulthandler.is_enabled())"
- rc, stdout, stderr = assert_python_ok("-X", "faulthandler", "-c", code)
- stdout = (stdout + stderr).strip()
- self.assertEqual(stdout, b"True")
+ args = (sys.executable, "-E", "-X", "faulthandler", "-c", code)
+ # don't use assert_python_ok() because it always enable faulthandler
+ 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):
 """
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -34,6 +34,10 @@
 import resource
 except ImportError:
 resource = None
+try:
+ import fcntl
+except ImportError:
+ fcntl = None
 
 from test.script_helper import assert_python_ok
 
@@ -2300,19 +2304,37 @@
 
 
 class FDInheritanceTests(unittest.TestCase):
- def test_get_inheritable(self):
+ def test_get_set_inheritable(self):
 fd = os.open(__file__, os.O_RDONLY)
 self.addCleanup(os.close, fd)
- for inheritable in (False, True):
- os.set_inheritable(fd, inheritable)
- self.assertEqual(os.get_inheritable(fd), inheritable)
+ self.assertEqual(os.get_inheritable(fd), False)
 
- def test_set_inheritable(self):
- fd = os.open(__file__, os.O_RDONLY)
- self.addCleanup(os.close, fd)
 os.set_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):
 fd = os.open(__file__, os.O_RDONLY)
 self.addCleanup(os.close, fd)
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -26,6 +26,10 @@
 import multiprocessing
 except ImportError:
 multiprocessing = False
+try:
+ import fcntl
+except ImportError:
+ fcntl = None
 
 HOST = support.HOST
 MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
@@ -4804,6 +4808,32 @@
 sock.set_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"),
 "need socket.socketpair()")
 def test_socketpair(self):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -7,6 +7,13 @@
 
 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
 -----
 
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -1048,8 +1048,11 @@
 {
 PyObject *xoptions, *key, *module, *res;
 _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;
 
 xoptions = PySys_GetXOptions();
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /