xref: /aosp_15_r20/external/pytorch/torch/csrc/Event.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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