1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#include <c10/util/thread_name.h>
#include <torch/csrc/Exceptions.h>
#include <torch/csrc/python_headers.h>
#include <torch/csrc/utils/object_ptr.h>
#include <torch/csrc/utils/pybind.h>
#include <torch/csrc/utils/python_strings.h>
#include <initializer_list>
#include <stdexcept>
#if defined(__linux__)
#include <sys/prctl.h>
#endif
#define SYSASSERT(rv, ...) \
if ((rv) < 0) { \
throw std::system_error(errno, std::system_category(), ##__VA_ARGS__); \
}
namespace torch::multiprocessing {
namespace {
PyObject* multiprocessing_init(PyObject* _unused, PyObject* noargs) {
auto multiprocessing_module =
THPObjectPtr(PyImport_ImportModule("torch.multiprocessing"));
if (!multiprocessing_module) {
throw python_error();
}
auto module = py::handle(multiprocessing_module).cast<py::module>();
module.def("_prctl_pr_set_pdeathsig", [](int signal) {
#if defined(__linux__)
auto rv = prctl(PR_SET_PDEATHSIG, signal);
SYSASSERT(rv, "prctl");
#endif
});
Py_RETURN_TRUE;
}
PyObject* set_thread_name(PyObject* _unused, PyObject* arg) {
TORCH_CHECK(THPUtils_checkString(arg), "invalid argument to setDevice");
auto name = THPUtils_unpackString(arg);
c10::setThreadName(name);
Py_RETURN_TRUE;
}
PyObject* get_thread_name(PyObject* _unused, PyObject* noargs) {
return THPUtils_packString(c10::getThreadName());
}
} // namespace
// multiprocessing methods on torch._C
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
static std::initializer_list<PyMethodDef> methods = {
{
"_multiprocessing_init",
multiprocessing_init,
METH_NOARGS,
nullptr,
},
{
"_set_thread_name",
set_thread_name,
METH_O,
nullptr,
},
{
"_get_thread_name",
get_thread_name,
METH_NOARGS,
nullptr,
},
{nullptr, nullptr, 0, nullptr},
};
const PyMethodDef* python_functions() {
return std::data(methods);
}
} // namespace torch::multiprocessing
|