homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients vstinner
Date 2020年03月19日.00:57:18
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1584579439.15.0.43767534151.issue40010@roundup.psfhosted.org>
In-reply-to
Content
When a thread gets a signal, SIGNAL_PENDING_SIGNALS() sets signals_pending to 1 and eval_breaker to 1. In this case, _PyEval_EvalFrameDefault() calls handle_signals(), but since it's not the main thread, it does nothing and signals_pending value remains 1. Moreover, eval_breaker value remains 1 which means that the following code will be called before executing *each* bytecode instruction.
 if (_Py_atomic_load_relaxed(eval_breaker)) {
 (...)
 opcode = _Py_OPCODE(*next_instr);
 if (opcode == SETUP_FINALLY || ...) {
 ...
 }
 if (_Py_atomic_load_relaxed(&ceval->signals_pending)) {
 if (handle_signals(tstate) != 0) {
 goto error;
 }
 }
 if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) {
 ...
 }
 if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {
 ...
 }
 if (tstate->async_exc != NULL) {
 ...
 }
 }
This is inefficient.
I'm working on a PR modifying SIGNAL_PENDING_SIGNALS() to not set eval_breaker to 1 if the current thread is not the main thread.
History
Date User Action Args
2020年03月19日 00:57:19vstinnersetrecipients: + vstinner
2020年03月19日 00:57:19vstinnersetmessageid: <1584579439.15.0.43767534151.issue40010@roundup.psfhosted.org>
2020年03月19日 00:57:19vstinnerlinkissue40010 messages
2020年03月19日 00:57:18vstinnercreate

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