Function simics_api_sys::bindings::PyEval_SaveThread

source ·
pub unsafe extern "C" fn PyEval_SaveThread() -> *mut PyThreadState
Expand description

Interface for threads.

A module that plans to do a blocking system call (or something else that lasts a long time and doesn’t touch Python data) can allow other threads to run as follows:

…preparations here… Py_BEGIN_ALLOW_THREADS …blocking system call here… Py_END_ALLOW_THREADS …interpret result here…

The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a {}-surrounded block. To leave the block in the middle (e.g., with return), you must insert a line containing Py_BLOCK_THREADS before the return, e.g.

if (…premature_exit…) { Py_BLOCK_THREADS PyErr_SetFromErrno(PyExc_OSError); return NULL; }

An alternative is:

Py_BLOCK_THREADS if (…premature_exit…) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } Py_UNBLOCK_THREADS

For convenience, that the value of ‘errno’ is restored across Py_END_ALLOW_THREADS and Py_BLOCK_THREADS.

WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND Py_END_ALLOW_THREADS!!!

Note that not yet all candidates have been converted to use this mechanism!