Gustavo J. A. M. Carneiro added the comment:
Minimal patch that just adds the pipe but does not attempt to fix
anything else.
Added file: http://bugs.python.org/file8898/python-signals-minimal.diff
_____________________________________
Tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue1564547>
_____________________________________
Index: Python/sigcheck.c
===================================================================
--- Python/sigcheck.c (revision 59439)
+++ Python/sigcheck.c (working copy)
@@ -17,3 +17,6 @@
PyErr_SetNone(PyExc_KeyboardInterrupt);
return -1;
}
+
+int Py_signal_pipe = -1;
+
Index: Include/pyerrors.h
===================================================================
--- Include/pyerrors.h (revision 59439)
+++ Include/pyerrors.h (working copy)
@@ -238,6 +238,11 @@
PyAPI_FUNC(int) PyErr_CheckSignals(void);
PyAPI_FUNC(void) PyErr_SetInterrupt(void);
+/* Read end of a pipe used to notify the main thread / main loop that
+ there are pending signals; Equal to -1 if the platform doesn't
+ support signals. */
+PyAPI_DATA(int) Py_signal_pipe;
+
/* Support for adding program text to SyntaxErrors */
PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int);
PyAPI_FUNC(PyObject *) PyErr_ProgramText(const char *, int);
Index: Modules/signalmodule.c
===================================================================
--- Modules/signalmodule.c (revision 59439)
+++ Modules/signalmodule.c (working copy)
@@ -11,6 +11,8 @@
#endif
#include <signal.h>
+#include <unistd.h>
+#include <fcntl.h>
#ifndef SIG_ERR
#define SIG_ERR ((PyOS_sighandler_t)(-1))
@@ -88,7 +90,10 @@
static PyOS_sighandler_t old_siginthandler = SIG_DFL;
+int Py_signal_pipe = -1; /* read end */
+static int Py_signal_pipe_w; /* write end */
+
static PyObject *
signal_default_int_handler(PyObject *self, PyObject *args)
{
@@ -112,6 +117,7 @@
static void
signal_handler(int sig_num)
{
+ char dummy_char;
#ifdef WITH_THREAD
#ifdef WITH_PTH
if (PyThread_get_thread_ident() != main_thread) {
@@ -125,6 +131,7 @@
is_tripped++;
Handlers[sig_num].tripped = 1;
Py_AddPendingCall(checksignals_witharg, NULL);
+ write(Py_signal_pipe_w, &dummy_char, sizeof(dummy_char));
#ifdef WITH_THREAD
}
#endif
@@ -309,6 +316,7 @@
{
PyObject *m, *d, *x;
int i;
+ int filedes[2], fd_flags;
#ifdef WITH_THREAD
main_thread = PyThread_get_thread_ident();
@@ -336,6 +344,30 @@
goto finally;
Py_DECREF(x);
+
+#define set_nonblock(fd) \
+ if ((fd_flags = fcntl(fd, F_GETFL, 0)) == -1) { \
+ PyErr_SetFromErrno(PyExc_RuntimeError); \
+ return; \
+ } \
+ fd_flags |= O_NONBLOCK; \
+ if (fcntl(fd, F_SETFL, fd_flags) == -1) { \
+ PyErr_SetFromErrno(PyExc_RuntimeError); \
+ return; \
+ }
+
+ if (Py_signal_pipe == -1) {
+ if (pipe(filedes)) {
+ PyErr_SetFromErrno(PyExc_RuntimeError);
+ return;
+ }
+ set_nonblock(filedes[0]);
+ set_nonblock(filedes[1]);
+ Py_signal_pipe = filedes[0];
+ Py_signal_pipe_w = filedes[1];
+ }
+#undef set_nonblock
+
x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
if (!x)
goto finally;
@@ -592,6 +624,7 @@
int
PyErr_CheckSignals(void)
{
+ char dummy_c;
int i;
PyObject *f;
@@ -621,6 +654,11 @@
Py_DECREF(result);
}
}
+ /* Flush all bytes from the pipe, so that it stops notifying
+ * main threads / main loops that signals are pending. */
+ while (read(Py_signal_pipe, &dummy_c, sizeof(dummy_c)) == sizeof(dummy_c))
+ ; /* pass */
+
is_tripped = 0;
return 0;
}
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com