blob: 4335c50f7198e940ec228f03d58d40e47f912411 [file] [log] [blame]
#pragma once
#include <Python.h>
#include <TH/THStorage.hpp>
#include <torch/csrc/utils/object_ptr.h>
#include <torch/csrc/utils/auto_gil.h>
namespace torch {
struct PyObjectFinalizer : public THFinalizer {
THPObjectPtr pyobj_;
// TODO: This recursive structure can lead to a stack overflow if you
// put too many finalizers on the same object
std::unique_ptr<THFinalizer> next_;
PyObjectFinalizer(PyObject* pyobj) {
Py_XINCREF(pyobj);
pyobj_ = pyobj;
}
void operator()() override {
if (next_) { (*next_)(); }
}
~PyObjectFinalizer() {
// We must manually ensure that we have the GIL before
// pyobj gets destroyed...
AutoGIL gil;
pyobj_ = nullptr;
}
};
} // namespace torch