Skip to content

Commit

Permalink
bpo-44645: Check for interrupts on any potentially backwards edge (py…
Browse files Browse the repository at this point in the history
…thonGH-27216)

(cherry picked from commit d09c134)

Co-authored-by: Mark Shannon <[email protected]>
  • Loading branch information
markshannon authored and miss-islington committed Jul 19, 2021
1 parent bce2847 commit 4ef90ab
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
25 changes: 25 additions & 0 deletions Lib/test/test_threading.py
Original file line number Diff line number Diff line change
Expand Up @@ -1604,6 +1604,31 @@ def test_interrupt_main_invalid_signal(self):
self.assertRaises(ValueError, _thread.interrupt_main, signal.NSIG)
self.assertRaises(ValueError, _thread.interrupt_main, 1000000)

@threading_helper.reap_threads
def test_can_interrupt_tight_loops(self):
cont = [True]
started = [False]
interrupted = [False]

def worker(started, cont, interrupted):
iterations = 100_000_000
started[0] = True
while cont[0]:
if iterations:
iterations -= 1
else:
return
pass
interrupted[0] = True

t = threading.Thread(target=worker,args=(started, cont, interrupted))
t.start()
while not started[0]:
pass
cont[0] = False
t.join()
self.assertTrue(interrupted[0])


class AtexitTests(unittest.TestCase):

Expand Down
7 changes: 6 additions & 1 deletion Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -3759,14 +3759,17 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
if (Py_IsFalse(cond)) {
Py_DECREF(cond);
JUMPTO(oparg);
CHECK_EVAL_BREAKER();
DISPATCH();
}
err = PyObject_IsTrue(cond);
Py_DECREF(cond);
if (err > 0)
;
else if (err == 0)
else if (err == 0) {
JUMPTO(oparg);
CHECK_EVAL_BREAKER();
}
else
goto error;
DISPATCH();
Expand All @@ -3783,12 +3786,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
if (Py_IsTrue(cond)) {
Py_DECREF(cond);
JUMPTO(oparg);
CHECK_EVAL_BREAKER();
DISPATCH();
}
err = PyObject_IsTrue(cond);
Py_DECREF(cond);
if (err > 0) {
JUMPTO(oparg);
CHECK_EVAL_BREAKER();
}
else if (err == 0)
;
Expand Down

0 comments on commit 4ef90ab

Please sign in to comment.