Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions Modules/signalmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,7 @@ class sigset_t_converter(CConverter):
may not be the thread that received the signal.
*/

#include <sys/types.h> /* For pid_t */
#include "pythread.h"
static unsigned long main_thread;
static PyInterpreterState *main_interp;

static volatile struct {
_Py_atomic_int tripped;
Expand Down Expand Up @@ -190,10 +187,12 @@ itimer_retval(struct itimerval *iv)
#endif

static int
is_main(void)
is_main(_PyRuntimeState *runtime)
{
return PyThread_get_thread_ident() == main_thread &&
_PyInterpreterState_Get() == main_interp;
unsigned long thread = PyThread_get_thread_ident();
PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
return (thread == runtime->main_thread
&& interp == runtime->interpreters.main);
}

static PyObject *
Expand Down Expand Up @@ -474,7 +473,9 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler)
return NULL;
}
#endif
if (!is_main()) {

_PyRuntimeState *runtime = &_PyRuntime;
if (!is_main(runtime)) {
PyErr_SetString(PyExc_ValueError,
"signal only works in main thread");
return NULL;
Expand Down Expand Up @@ -691,7 +692,8 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds)
return NULL;
#endif

if (!is_main()) {
_PyRuntimeState *runtime = &_PyRuntime;
if (!is_main(runtime)) {
PyErr_SetString(PyExc_ValueError,
"set_wakeup_fd only works in main thread");
return NULL;
Expand Down Expand Up @@ -1329,9 +1331,6 @@ PyInit__signal(void)
PyObject *m, *d, *x;
int i;

main_thread = PyThread_get_thread_ident();
main_interp = _PyInterpreterState_Get();

/* Create the module and add the functions */
m = PyModule_Create(&signalmodule);
if (m == NULL)
Expand Down Expand Up @@ -1622,7 +1621,8 @@ finisignal(void)
int
PyErr_CheckSignals(void)
{
if (!is_main()) {
_PyRuntimeState *runtime = &_PyRuntime;
if (!is_main(runtime)) {
return 0;
}

Expand Down Expand Up @@ -1716,7 +1716,8 @@ int
PyOS_InterruptOccurred(void)
{
if (_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) {
if (!is_main()) {
_PyRuntimeState *runtime = &_PyRuntime;
if (!is_main(runtime)) {
return 0;
}
_Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0);
Expand Down Expand Up @@ -1744,14 +1745,13 @@ _PySignal_AfterFork(void)
* in both processes if they came in just before the fork() but before
* the interpreter had an opportunity to call the handlers. issue9535. */
_clear_pending_signals();
main_thread = PyThread_get_thread_ident();
main_interp = _PyInterpreterState_Get();
}

int
_PyOS_IsMainThread(void)
{
return is_main();
_PyRuntimeState *runtime = &_PyRuntime;
return is_main(runtime);
}

#ifdef MS_WINDOWS
Expand Down