| #pragma once |
| |
| // RAII structs to acquire and release Python's global interpreter lock (GIL) |
| |
| #include "torch/csrc/python_headers.h" |
| |
| // Acquires the GIL on construction |
| struct AutoGIL { |
| AutoGIL() : gstate(PyGILState_Ensure()) { |
| } |
| ~AutoGIL() { |
| PyGILState_Release(gstate); |
| } |
| |
| PyGILState_STATE gstate; |
| }; |
| |
| // Releases the GIL on construction |
| struct AutoNoGIL { |
| AutoNoGIL() : save(PyEval_SaveThread()) { |
| } |
| ~AutoNoGIL() { |
| PyEval_RestoreThread(save); |
| } |
| |
| PyThreadState* save; |
| }; |
| |
| // Runs the function without the GIL |
| template<typename F> |
| inline void with_no_gil(F f) { |
| AutoNoGIL no_gil; |
| f(); |
| } |