[Python-checkins] cpython: Issue #23836: Use _Py_write_noraise() to retry on EINTR in _Py_DumpTraceback()

victor.stinner python-checkins at python.org
Wed Apr 1 18:51:56 CEST 2015


https://hg.python.org/cpython/rev/29ab05c5e9dc
changeset: 95359:29ab05c5e9dc
user: Victor Stinner <victor.stinner at gmail.com>
date: Wed Apr 01 18:38:01 2015 +0200
summary:
 Issue #23836: Use _Py_write_noraise() to retry on EINTR in _Py_DumpTraceback()
and _Py_DumpTracebackThreads(). Document also these functions to explain that
the caller is responsible to call PyErr_CheckSignals().
files:
 Python/traceback.c | 28 ++++++++++++++++++++--------
 1 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/Python/traceback.c b/Python/traceback.c
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -13,7 +13,7 @@
 
 #define OFF(x) offsetof(PyTracebackObject, x)
 
-#define PUTS(fd, str) write(fd, str, (int)strlen(str))
+#define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str))
 #define MAX_STRING_LENGTH 500
 #define MAX_FRAME_DEPTH 100
 #define MAX_NTHREADS 100
@@ -512,7 +512,7 @@
 len++;
 } while (value);
 reverse_string(buffer, len);
- write(fd, buffer, len);
+ _Py_write_noraise(fd, buffer, len);
 }
 
 /* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits,
@@ -532,7 +532,7 @@
 len++;
 } while (len < width || value);
 reverse_string(buffer, len);
- write(fd, buffer, len);
+ _Py_write_noraise(fd, buffer, len);
 }
 
 /* Write an unicode object into the file fd using ascii+backslashreplace.
@@ -585,7 +585,7 @@
 if (' ' <= ch && ch <= 126) {
 /* printable ASCII character */
 char c = (char)ch;
- write(fd, &c, 1);
+ _Py_write_noraise(fd, &c, 1);
 }
 else if (ch <= 0xff) {
 PUTS(fd, "\\x");
@@ -619,9 +619,9 @@
 if (code != NULL && code->co_filename != NULL
 && PyUnicode_Check(code->co_filename))
 {
- write(fd, "\"", 1);
+ PUTS(fd, "\"");
 dump_ascii(fd, code->co_filename);
- write(fd, "\"", 1);
+ PUTS(fd, "\"");
 } else {
 PUTS(fd, "???");
 }
@@ -638,7 +638,7 @@
 else
 PUTS(fd, "???");
 
- write(fd, "\n", 1);
+ PUTS(fd, "\n");
 }
 
 static void
@@ -668,6 +668,12 @@
 }
 }
 
+/* Dump the traceback of a Python thread into fd. Use write() to write the
+ traceback and retry if write() is interrupted by a signal (failed with
+ EINTR), but don't call the Python signal handler.
+
+ The caller is responsible to call PyErr_CheckSignals() to call Python signal
+ handlers if signals were received. */
 void
 _Py_DumpTraceback(int fd, PyThreadState *tstate)
 {
@@ -690,6 +696,12 @@
 PUTS(fd, " (most recent call first):\n");
 }
 
+/* Dump the traceback of all Python threads into fd. Use write() to write the
+ traceback and retry if write() is interrupted by a signal (failed with
+ EINTR), but don't call the Python signal handler.
+
+ The caller is responsible to call PyErr_CheckSignals() to call Python signal
+ handlers if signals were received. */
 const char*
 _Py_DumpTracebackThreads(int fd, PyInterpreterState *interp,
 PyThreadState *current_thread)
@@ -708,7 +720,7 @@
 do
 {
 if (nthreads != 0)
- write(fd, "\n", 1);
+ PUTS(fd, "\n");
 if (nthreads >= MAX_NTHREADS) {
 PUTS(fd, "...\n");
 break;
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

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