Merge pull request #1214 from birkenfeld/signals

Add wrapper for PyErr_CheckSignals() to Python.
This commit is contained in:
Yuji Kanagawa 2020-10-09 00:42:54 +09:00 committed by GitHub
commit 1d34ed772b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 0 deletions

View file

@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
## Added
- Add support for keyword-only arguments without default values in `#[pyfunction]`. [#1209](https://github.com/PyO3/pyo3/pull/1209)
- Add a wrapper for `PyErr_CheckSignals()` as `Python::check_signals()`. [#1214](https://github.com/PyO3/pyo3/pull/1214)
## [0.12.1] - 2020-09-16
### Fixed

View file

@ -498,6 +498,26 @@ impl<'p> Python<'p> {
pub fn xdecref<T: IntoPyPointer>(self, ptr: T) {
unsafe { ffi::Py_XDECREF(ptr.into_ptr()) };
}
/// Lets the Python interpreter check for pending signals and invoke the
/// corresponding signal handlers. This can run arbitrary Python code.
///
/// If an exception is raised by the signal handler, or the default signal
/// handler raises an exception (such as `KeyboardInterrupt` for `SIGINT`),
/// an `Err` is returned.
///
/// This is a wrapper of the C function `PyErr_CheckSignals()`. It is good
/// practice to call this regularly in a long-running calculation since
/// SIGINT and other signals handled by Python code are left pending for its
/// entire duration.
pub fn check_signals(self) -> PyResult<()> {
let v = unsafe { ffi::PyErr_CheckSignals() };
if v == -1 {
Err(PyErr::fetch(self))
} else {
Ok(())
}
}
}
#[cfg(test)]