1*da0073e9SAndroid Build Coastguard Worker #include <pybind11/pybind11.h>
2*da0073e9SAndroid Build Coastguard Worker #include <torch/csrc/Device.h>
3*da0073e9SAndroid Build Coastguard Worker #include <torch/csrc/Event.h>
4*da0073e9SAndroid Build Coastguard Worker #include <torch/csrc/Stream.h>
5*da0073e9SAndroid Build Coastguard Worker #include <torch/csrc/THP.h>
6*da0073e9SAndroid Build Coastguard Worker #include <torch/csrc/utils/pybind.h>
7*da0073e9SAndroid Build Coastguard Worker #include <torch/csrc/utils/pycfunction_helpers.h>
8*da0073e9SAndroid Build Coastguard Worker #include <torch/csrc/utils/python_arg_parser.h>
9*da0073e9SAndroid Build Coastguard Worker
10*da0073e9SAndroid Build Coastguard Worker #include <c10/core/Event.h>
11*da0073e9SAndroid Build Coastguard Worker #include <c10/core/Stream.h>
12*da0073e9SAndroid Build Coastguard Worker
13*da0073e9SAndroid Build Coastguard Worker #include <c10/core/DeviceType.h>
14*da0073e9SAndroid Build Coastguard Worker #include <c10/core/impl/DeviceGuardImplInterface.h>
15*da0073e9SAndroid Build Coastguard Worker #include <structmember.h>
16*da0073e9SAndroid Build Coastguard Worker #include <string>
17*da0073e9SAndroid Build Coastguard Worker
18*da0073e9SAndroid Build Coastguard Worker PyObject* THPEventClass = nullptr;
19*da0073e9SAndroid Build Coastguard Worker
THPEvent_pynew(PyTypeObject * type,PyObject * args,PyObject * kwargs)20*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_pynew(
21*da0073e9SAndroid Build Coastguard Worker PyTypeObject* type,
22*da0073e9SAndroid Build Coastguard Worker PyObject* args,
23*da0073e9SAndroid Build Coastguard Worker PyObject* kwargs) {
24*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
25*da0073e9SAndroid Build Coastguard Worker
26*da0073e9SAndroid Build Coastguard Worker unsigned char enable_timing = 0;
27*da0073e9SAndroid Build Coastguard Worker unsigned char blocking = 0;
28*da0073e9SAndroid Build Coastguard Worker unsigned char interprocess = 0;
29*da0073e9SAndroid Build Coastguard Worker
30*da0073e9SAndroid Build Coastguard Worker static torch::PythonArgParser parser({
31*da0073e9SAndroid Build Coastguard Worker "Event(Device device=None, *, bool enable_timing=True, bool blocking=False, bool interprocess=False)",
32*da0073e9SAndroid Build Coastguard Worker });
33*da0073e9SAndroid Build Coastguard Worker
34*da0073e9SAndroid Build Coastguard Worker torch::ParsedArgs<4> parsed_args;
35*da0073e9SAndroid Build Coastguard Worker auto r = parser.parse(args, kwargs, parsed_args);
36*da0073e9SAndroid Build Coastguard Worker
37*da0073e9SAndroid Build Coastguard Worker auto device = r.deviceOptional(0);
38*da0073e9SAndroid Build Coastguard Worker
39*da0073e9SAndroid Build Coastguard Worker if (!device.has_value()) {
40*da0073e9SAndroid Build Coastguard Worker device = at::Device(at::getAccelerator(false).value_or(at::kCPU));
41*da0073e9SAndroid Build Coastguard Worker }
42*da0073e9SAndroid Build Coastguard Worker enable_timing = r.toBoolWithDefault(1, true);
43*da0073e9SAndroid Build Coastguard Worker blocking = r.toBoolWithDefault(2, false);
44*da0073e9SAndroid Build Coastguard Worker interprocess = r.toBoolWithDefault(3, false);
45*da0073e9SAndroid Build Coastguard Worker
46*da0073e9SAndroid Build Coastguard Worker THPObjectPtr ptr(type->tp_alloc(type, 0));
47*da0073e9SAndroid Build Coastguard Worker if (!ptr) {
48*da0073e9SAndroid Build Coastguard Worker TORCH_CHECK(ptr, "Failed to allocate memory for Event");
49*da0073e9SAndroid Build Coastguard Worker }
50*da0073e9SAndroid Build Coastguard Worker
51*da0073e9SAndroid Build Coastguard Worker THPEvent* self = (THPEvent*)ptr.get();
52*da0073e9SAndroid Build Coastguard Worker
53*da0073e9SAndroid Build Coastguard Worker // TODO: blocking and interprocess are not supported yet. To support them, the
54*da0073e9SAndroid Build Coastguard Worker // flag system of c10::Event needs to be refactored. C10::Event should also
55*da0073e9SAndroid Build Coastguard Worker // provide a generic constructor to support blocking and interprocess events.
56*da0073e9SAndroid Build Coastguard Worker (void)blocking;
57*da0073e9SAndroid Build Coastguard Worker (void)interprocess;
58*da0073e9SAndroid Build Coastguard Worker
59*da0073e9SAndroid Build Coastguard Worker new (&self->event) c10::Event(
60*da0073e9SAndroid Build Coastguard Worker device->type(),
61*da0073e9SAndroid Build Coastguard Worker // See note [Flags defining the behavior of events]
62*da0073e9SAndroid Build Coastguard Worker // BACKEND_DEFAULT is a enable-timing flag, and
63*da0073e9SAndroid Build Coastguard Worker // PYTORCH_DEFAULT is a disable-timing flag.
64*da0073e9SAndroid Build Coastguard Worker (enable_timing ? c10::EventFlag::BACKEND_DEFAULT
65*da0073e9SAndroid Build Coastguard Worker : c10::EventFlag::PYTORCH_DEFAULT));
66*da0073e9SAndroid Build Coastguard Worker
67*da0073e9SAndroid Build Coastguard Worker return (PyObject*)ptr.release();
68*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
69*da0073e9SAndroid Build Coastguard Worker }
70*da0073e9SAndroid Build Coastguard Worker
THPEvent_new(c10::DeviceType device_type,c10::EventFlag flag)71*da0073e9SAndroid Build Coastguard Worker PyObject* THPEvent_new(c10::DeviceType device_type, c10::EventFlag flag) {
72*da0073e9SAndroid Build Coastguard Worker auto type = (PyTypeObject*)&THPEventType;
73*da0073e9SAndroid Build Coastguard Worker auto self = THPObjectPtr{type->tp_alloc(type, 0)};
74*da0073e9SAndroid Build Coastguard Worker TORCH_CHECK(self, "Failed to allocate memory for Event");
75*da0073e9SAndroid Build Coastguard Worker auto self_ = reinterpret_cast<THPEvent*>(self.get());
76*da0073e9SAndroid Build Coastguard Worker new (&self_->event) c10::Event(device_type, flag);
77*da0073e9SAndroid Build Coastguard Worker return self.release();
78*da0073e9SAndroid Build Coastguard Worker }
79*da0073e9SAndroid Build Coastguard Worker
THPEvent_dealloc(THPEvent * self)80*da0073e9SAndroid Build Coastguard Worker static void THPEvent_dealloc(THPEvent* self) {
81*da0073e9SAndroid Build Coastguard Worker {
82*da0073e9SAndroid Build Coastguard Worker pybind11::gil_scoped_release no_gil{};
83*da0073e9SAndroid Build Coastguard Worker self->event.~Event();
84*da0073e9SAndroid Build Coastguard Worker }
85*da0073e9SAndroid Build Coastguard Worker Py_TYPE(self)->tp_free((PyObject*)self);
86*da0073e9SAndroid Build Coastguard Worker }
87*da0073e9SAndroid Build Coastguard Worker
THPEvent_get_device(THPEvent * self,void * unused)88*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_get_device(THPEvent* self, void* unused) {
89*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
90*da0073e9SAndroid Build Coastguard Worker return THPDevice_New(self->event.device());
91*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
92*da0073e9SAndroid Build Coastguard Worker }
93*da0073e9SAndroid Build Coastguard Worker
THPEvent_record(PyObject * _self,PyObject * args,PyObject * kwargs)94*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_record(
95*da0073e9SAndroid Build Coastguard Worker PyObject* _self,
96*da0073e9SAndroid Build Coastguard Worker PyObject* args,
97*da0073e9SAndroid Build Coastguard Worker PyObject* kwargs) {
98*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
99*da0073e9SAndroid Build Coastguard Worker auto self = (THPEvent*)_self;
100*da0073e9SAndroid Build Coastguard Worker PyObject* _stream = Py_None;
101*da0073e9SAndroid Build Coastguard Worker // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
102*da0073e9SAndroid Build Coastguard Worker constexpr const char* accepted_args[] = {"stream", nullptr};
103*da0073e9SAndroid Build Coastguard Worker if (!PyArg_ParseTupleAndKeywords(
104*da0073e9SAndroid Build Coastguard Worker args,
105*da0073e9SAndroid Build Coastguard Worker kwargs,
106*da0073e9SAndroid Build Coastguard Worker "|O",
107*da0073e9SAndroid Build Coastguard Worker // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast)
108*da0073e9SAndroid Build Coastguard Worker const_cast<char**>(accepted_args),
109*da0073e9SAndroid Build Coastguard Worker &_stream)) {
110*da0073e9SAndroid Build Coastguard Worker TORCH_WARN("Parsing THPEvent_record arg fails");
111*da0073e9SAndroid Build Coastguard Worker return nullptr;
112*da0073e9SAndroid Build Coastguard Worker }
113*da0073e9SAndroid Build Coastguard Worker if (_stream != Py_None) {
114*da0073e9SAndroid Build Coastguard Worker auto stream = (THPStream*)_stream;
115*da0073e9SAndroid Build Coastguard Worker self->event.record(c10::Stream::unpack3(
116*da0073e9SAndroid Build Coastguard Worker stream->stream_id,
117*da0073e9SAndroid Build Coastguard Worker stream->device_index,
118*da0073e9SAndroid Build Coastguard Worker static_cast<c10::DeviceType>(stream->device_type)));
119*da0073e9SAndroid Build Coastguard Worker } else {
120*da0073e9SAndroid Build Coastguard Worker c10::impl::VirtualGuardImpl impl{
121*da0073e9SAndroid Build Coastguard Worker static_cast<c10::DeviceType>(self->event.device_type())};
122*da0073e9SAndroid Build Coastguard Worker self->event.record(impl.getStream(impl.getDevice()));
123*da0073e9SAndroid Build Coastguard Worker }
124*da0073e9SAndroid Build Coastguard Worker Py_RETURN_NONE;
125*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
126*da0073e9SAndroid Build Coastguard Worker }
127*da0073e9SAndroid Build Coastguard Worker
THPEvent_from_ipc_handle(PyObject * _type,PyObject * args,PyObject * kwargs)128*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_from_ipc_handle(
129*da0073e9SAndroid Build Coastguard Worker PyObject* _type,
130*da0073e9SAndroid Build Coastguard Worker PyObject* args,
131*da0073e9SAndroid Build Coastguard Worker PyObject* kwargs) {
132*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
133*da0073e9SAndroid Build Coastguard Worker auto type = (PyTypeObject*)_type;
134*da0073e9SAndroid Build Coastguard Worker
135*da0073e9SAndroid Build Coastguard Worker static torch::PythonArgParser parser({
136*da0073e9SAndroid Build Coastguard Worker "from_ipc_handle(Device device, std::string ipc_handle)",
137*da0073e9SAndroid Build Coastguard Worker });
138*da0073e9SAndroid Build Coastguard Worker torch::ParsedArgs<2> parsed_args;
139*da0073e9SAndroid Build Coastguard Worker auto r = parser.parse(args, kwargs, parsed_args);
140*da0073e9SAndroid Build Coastguard Worker
141*da0073e9SAndroid Build Coastguard Worker at::Device device = r.device(0);
142*da0073e9SAndroid Build Coastguard Worker TORCH_CHECK_NOT_IMPLEMENTED(
143*da0073e9SAndroid Build Coastguard Worker false,
144*da0073e9SAndroid Build Coastguard Worker "torch.Event ipc is not supported yet, please open an issue if you need this!");
145*da0073e9SAndroid Build Coastguard Worker THPObjectPtr ptr(type->tp_alloc(type, 0));
146*da0073e9SAndroid Build Coastguard Worker if (!ptr) {
147*da0073e9SAndroid Build Coastguard Worker return nullptr;
148*da0073e9SAndroid Build Coastguard Worker }
149*da0073e9SAndroid Build Coastguard Worker THPEvent* self = (THPEvent*)ptr.get();
150*da0073e9SAndroid Build Coastguard Worker
151*da0073e9SAndroid Build Coastguard Worker // TODO: for constructing event from ipc handle, the c10::Event needs to have
152*da0073e9SAndroid Build Coastguard Worker // more general constructor to achieve that.
153*da0073e9SAndroid Build Coastguard Worker new (&self->event) c10::Event(device.type(), c10::EventFlag::PYTORCH_DEFAULT);
154*da0073e9SAndroid Build Coastguard Worker
155*da0073e9SAndroid Build Coastguard Worker return (PyObject*)ptr.release();
156*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
157*da0073e9SAndroid Build Coastguard Worker }
158*da0073e9SAndroid Build Coastguard Worker
THPEvent_ipc_handle(PyObject * _self,PyObject * noargs)159*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_ipc_handle(
160*da0073e9SAndroid Build Coastguard Worker PyObject* _self [[maybe_unused]],
161*da0073e9SAndroid Build Coastguard Worker PyObject* noargs) {
162*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
163*da0073e9SAndroid Build Coastguard Worker TORCH_CHECK_NOT_IMPLEMENTED(
164*da0073e9SAndroid Build Coastguard Worker false,
165*da0073e9SAndroid Build Coastguard Worker "torch.Event ipc is not supported yet, please open an issue if you need this!");
166*da0073e9SAndroid Build Coastguard Worker constexpr const char* handle = "0";
167*da0073e9SAndroid Build Coastguard Worker return PyBytes_FromStringAndSize(
168*da0073e9SAndroid Build Coastguard Worker handle, std::char_traits<char>::length(handle));
169*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
170*da0073e9SAndroid Build Coastguard Worker }
171*da0073e9SAndroid Build Coastguard Worker
THPEvent_wait(PyObject * _self,PyObject * args,PyObject * kwargs)172*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_wait(
173*da0073e9SAndroid Build Coastguard Worker PyObject* _self,
174*da0073e9SAndroid Build Coastguard Worker PyObject* args,
175*da0073e9SAndroid Build Coastguard Worker PyObject* kwargs) {
176*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS {
177*da0073e9SAndroid Build Coastguard Worker auto self = (THPEvent*)_self;
178*da0073e9SAndroid Build Coastguard Worker PyObject* _stream = Py_None;
179*da0073e9SAndroid Build Coastguard Worker // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
180*da0073e9SAndroid Build Coastguard Worker constexpr const char* accepted_args[] = {"stream", nullptr};
181*da0073e9SAndroid Build Coastguard Worker if (!PyArg_ParseTupleAndKeywords(
182*da0073e9SAndroid Build Coastguard Worker args,
183*da0073e9SAndroid Build Coastguard Worker kwargs,
184*da0073e9SAndroid Build Coastguard Worker "|O",
185*da0073e9SAndroid Build Coastguard Worker // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast)
186*da0073e9SAndroid Build Coastguard Worker const_cast<char**>(accepted_args),
187*da0073e9SAndroid Build Coastguard Worker &_stream)) {
188*da0073e9SAndroid Build Coastguard Worker TORCH_WARN("Parsing THPEvent_wait arg fails");
189*da0073e9SAndroid Build Coastguard Worker return nullptr;
190*da0073e9SAndroid Build Coastguard Worker }
191*da0073e9SAndroid Build Coastguard Worker if (_stream != Py_None) {
192*da0073e9SAndroid Build Coastguard Worker auto stream = (THPStream*)_stream;
193*da0073e9SAndroid Build Coastguard Worker self->event.block(c10::Stream::unpack3(
194*da0073e9SAndroid Build Coastguard Worker stream->stream_id,
195*da0073e9SAndroid Build Coastguard Worker stream->device_index,
196*da0073e9SAndroid Build Coastguard Worker static_cast<c10::DeviceType>(stream->device_type)));
197*da0073e9SAndroid Build Coastguard Worker } else {
198*da0073e9SAndroid Build Coastguard Worker c10::impl::VirtualGuardImpl impl{
199*da0073e9SAndroid Build Coastguard Worker static_cast<c10::DeviceType>(self->event.device_type())};
200*da0073e9SAndroid Build Coastguard Worker self->event.block(impl.getStream(impl.getDevice()));
201*da0073e9SAndroid Build Coastguard Worker }
202*da0073e9SAndroid Build Coastguard Worker }
203*da0073e9SAndroid Build Coastguard Worker Py_RETURN_NONE;
204*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
205*da0073e9SAndroid Build Coastguard Worker }
206*da0073e9SAndroid Build Coastguard Worker
THPEvent_query(PyObject * _self,PyObject * noargs)207*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_query(PyObject* _self, PyObject* noargs) {
208*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
209*da0073e9SAndroid Build Coastguard Worker auto self = (THPEvent*)_self;
210*da0073e9SAndroid Build Coastguard Worker return PyBool_FromLong(self->event.query());
211*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
212*da0073e9SAndroid Build Coastguard Worker }
213*da0073e9SAndroid Build Coastguard Worker
THPEvent_elapsed_time(PyObject * _self,PyObject * _other)214*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_elapsed_time(PyObject* _self, PyObject* _other) {
215*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
216*da0073e9SAndroid Build Coastguard Worker auto self = (THPEvent*)_self;
217*da0073e9SAndroid Build Coastguard Worker auto other = (THPEvent*)_other;
218*da0073e9SAndroid Build Coastguard Worker return PyFloat_FromDouble(self->event.elapsedTime(other->event));
219*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
220*da0073e9SAndroid Build Coastguard Worker }
221*da0073e9SAndroid Build Coastguard Worker
THPEvent_synchronize(PyObject * _self,PyObject * noargs)222*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_synchronize(PyObject* _self, PyObject* noargs) {
223*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS {
224*da0073e9SAndroid Build Coastguard Worker pybind11::gil_scoped_release no_gil{};
225*da0073e9SAndroid Build Coastguard Worker auto self = (THPEvent*)_self;
226*da0073e9SAndroid Build Coastguard Worker self->event.synchronize();
227*da0073e9SAndroid Build Coastguard Worker }
228*da0073e9SAndroid Build Coastguard Worker Py_RETURN_NONE;
229*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
230*da0073e9SAndroid Build Coastguard Worker }
231*da0073e9SAndroid Build Coastguard Worker
THPEvent_evend_id(PyObject * _self,PyObject * noargs)232*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_evend_id(PyObject* _self, PyObject* noargs) {
233*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
234*da0073e9SAndroid Build Coastguard Worker auto self = (THPEvent*)_self;
235*da0073e9SAndroid Build Coastguard Worker return PyLong_FromVoidPtr(self->event.eventId());
236*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
237*da0073e9SAndroid Build Coastguard Worker }
238*da0073e9SAndroid Build Coastguard Worker
THPEvent_repr(THPEvent * self)239*da0073e9SAndroid Build Coastguard Worker static PyObject* THPEvent_repr(THPEvent* self) {
240*da0073e9SAndroid Build Coastguard Worker HANDLE_TH_ERRORS
241*da0073e9SAndroid Build Coastguard Worker return THPUtils_packString(
242*da0073e9SAndroid Build Coastguard Worker "torch.Event device_type=" +
243*da0073e9SAndroid Build Coastguard Worker c10::DeviceTypeName(
244*da0073e9SAndroid Build Coastguard Worker static_cast<c10::DeviceType>(self->event.device_type()), true) +
245*da0073e9SAndroid Build Coastguard Worker ", device_index=" + std::to_string(self->event.device_index()) +
246*da0073e9SAndroid Build Coastguard Worker ", event_flag=" +
247*da0073e9SAndroid Build Coastguard Worker std::to_string(static_cast<int64_t>(self->event.flag())) + ", event_id=" +
248*da0073e9SAndroid Build Coastguard Worker std::to_string(reinterpret_cast<int64_t>(self->event.eventId())));
249*da0073e9SAndroid Build Coastguard Worker END_HANDLE_TH_ERRORS
250*da0073e9SAndroid Build Coastguard Worker }
251*da0073e9SAndroid Build Coastguard Worker
252*da0073e9SAndroid Build Coastguard Worker // NOLINTNEXTLINE(*c-arrays*, *global-variables)
253*da0073e9SAndroid Build Coastguard Worker static struct PyGetSetDef THPEvent_properties[] = {
254*da0073e9SAndroid Build Coastguard Worker {"device", (getter)THPEvent_get_device, nullptr, nullptr, nullptr},
255*da0073e9SAndroid Build Coastguard Worker {"event_id", (getter)THPEvent_evend_id, nullptr, nullptr, nullptr},
256*da0073e9SAndroid Build Coastguard Worker {nullptr}};
257*da0073e9SAndroid Build Coastguard Worker
258*da0073e9SAndroid Build Coastguard Worker // NOLINTNEXTLINE(*c-arrays*, *global-variables)
259*da0073e9SAndroid Build Coastguard Worker static PyMethodDef THPEvent_methods[] = {
260*da0073e9SAndroid Build Coastguard Worker {(char*)"from_ipc_handle",
261*da0073e9SAndroid Build Coastguard Worker castPyCFunctionWithKeywords(THPEvent_from_ipc_handle),
262*da0073e9SAndroid Build Coastguard Worker METH_CLASS | METH_VARARGS | METH_KEYWORDS,
263*da0073e9SAndroid Build Coastguard Worker nullptr},
264*da0073e9SAndroid Build Coastguard Worker {(char*)"record",
265*da0073e9SAndroid Build Coastguard Worker castPyCFunctionWithKeywords(THPEvent_record),
266*da0073e9SAndroid Build Coastguard Worker METH_VARARGS | METH_KEYWORDS,
267*da0073e9SAndroid Build Coastguard Worker nullptr},
268*da0073e9SAndroid Build Coastguard Worker {(char*)"wait",
269*da0073e9SAndroid Build Coastguard Worker castPyCFunctionWithKeywords(THPEvent_wait),
270*da0073e9SAndroid Build Coastguard Worker METH_VARARGS | METH_KEYWORDS,
271*da0073e9SAndroid Build Coastguard Worker nullptr},
272*da0073e9SAndroid Build Coastguard Worker {(char*)"query", THPEvent_query, METH_NOARGS, nullptr},
273*da0073e9SAndroid Build Coastguard Worker {(char*)"elapsed_time", THPEvent_elapsed_time, METH_O, nullptr},
274*da0073e9SAndroid Build Coastguard Worker {(char*)"synchronize", THPEvent_synchronize, METH_NOARGS, nullptr},
275*da0073e9SAndroid Build Coastguard Worker {(char*)"ipc_handle", THPEvent_ipc_handle, METH_NOARGS, nullptr},
276*da0073e9SAndroid Build Coastguard Worker {nullptr}};
277*da0073e9SAndroid Build Coastguard Worker
278*da0073e9SAndroid Build Coastguard Worker PyTypeObject THPEventType = {
279*da0073e9SAndroid Build Coastguard Worker PyVarObject_HEAD_INIT(nullptr, 0) "torch.Event", /* tp_name */
280*da0073e9SAndroid Build Coastguard Worker sizeof(THPEvent), /* tp_basicsize */
281*da0073e9SAndroid Build Coastguard Worker 0, /* tp_itemsize */
282*da0073e9SAndroid Build Coastguard Worker (destructor)THPEvent_dealloc, /* tp_dealloc */
283*da0073e9SAndroid Build Coastguard Worker 0, /* tp_vectorcall_offset */
284*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_getattr */
285*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_setattr */
286*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_reserved */
287*da0073e9SAndroid Build Coastguard Worker (reprfunc)THPEvent_repr, /* tp_repr */
288*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_as_number */
289*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_as_sequence */
290*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_as_mapping */
291*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_hash */
292*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_call */
293*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_str */
294*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_getattro */
295*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_setattro */
296*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_as_buffer */
297*da0073e9SAndroid Build Coastguard Worker Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
298*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_doc */
299*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_traverse */
300*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_clear */
301*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_richcompare */
302*da0073e9SAndroid Build Coastguard Worker 0, /* tp_weaklistoffset */
303*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_iter */
304*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_iternext */
305*da0073e9SAndroid Build Coastguard Worker THPEvent_methods, /* tp_methods */
306*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_members */
307*da0073e9SAndroid Build Coastguard Worker THPEvent_properties, /* tp_getset */
308*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_base */
309*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_dict */
310*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_descr_get */
311*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_descr_set */
312*da0073e9SAndroid Build Coastguard Worker 0, /* tp_dictoffset */
313*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_init */
314*da0073e9SAndroid Build Coastguard Worker nullptr, /* tp_alloc */
315*da0073e9SAndroid Build Coastguard Worker THPEvent_pynew, /* tp_new */
316*da0073e9SAndroid Build Coastguard Worker };
317*da0073e9SAndroid Build Coastguard Worker
THPEvent_init(PyObject * module)318*da0073e9SAndroid Build Coastguard Worker void THPEvent_init(PyObject* module) {
319*da0073e9SAndroid Build Coastguard Worker THPEventClass = (PyObject*)&THPEventType;
320*da0073e9SAndroid Build Coastguard Worker if (PyType_Ready(&THPEventType) < 0) {
321*da0073e9SAndroid Build Coastguard Worker throw python_error();
322*da0073e9SAndroid Build Coastguard Worker }
323*da0073e9SAndroid Build Coastguard Worker Py_INCREF(&THPEventType);
324*da0073e9SAndroid Build Coastguard Worker if (PyModule_AddObject(module, "Event", (PyObject*)&THPEventType) < 0) {
325*da0073e9SAndroid Build Coastguard Worker throw python_error();
326*da0073e9SAndroid Build Coastguard Worker }
327*da0073e9SAndroid Build Coastguard Worker }
328