@@ -74,6 +74,9 @@ static PyObject *DPEXRT_sycl_queue_to_python(NRT_api_functions *nrt,
7474 queuestruct_t * queuestruct );
7575static PyObject * DPEXRT_sycl_event_to_python (NRT_api_functions * nrt ,
7676 eventstruct_t * eventstruct );
77+ static int DPEXRT_sycl_event_init (NRT_api_functions * nrt ,
78+ DPCTLSyclEventRef event ,
79+ eventstruct_t * eventstruct );
7780
7881/** An NRT_external_malloc_func implementation using DPCTLmalloc_device.
7982 *
@@ -1359,6 +1362,7 @@ static int DPEXRT_sycl_event_from_python(NRT_api_functions *nrt,
13591362 Py_INCREF (event_obj );
13601363 event_struct -> meminfo =
13611364 nrt -> manage_memory (event_obj , NRT_MemInfo_pyobject_dtor );
1365+ event_struct -> parent = (PyObject * )event_obj ;
13621366 event_struct -> event_ref = event_ref ;
13631367
13641368 return 0 ;
@@ -1388,17 +1392,13 @@ static int DPEXRT_sycl_event_from_python(NRT_api_functions *nrt,
13881392static PyObject * DPEXRT_sycl_event_to_python (NRT_api_functions * nrt ,
13891393 eventstruct_t * eventstruct )
13901394{
1391- PyObject * event_obj = NULL ;
1392- PyGILState_STATE gstate ;
1393-
1394- event_obj = nrt -> get_data (eventstruct -> meminfo );
1395-
1396- DPEXRT_DEBUG (
1397- drt_debug_print ("DPEXRT-DEBUG: In DPEXRT_sycl_event_to_python.\n" ););
1395+ PyObject * event_obj = eventstruct -> parent ;
13981396
13991397 if (event_obj == NULL ) {
1400- // Make create copy of event_ref so we don't need to manage nrt lifetime
1401- // from python object.
1398+ DPEXRT_DEBUG (
1399+ drt_debug_print ("DPEXRT-DEBUG: creating new event object.\n" ););
1400+ // SyclEvent_Make creates copy of event_ref so we don't need to manage
1401+ // nrt lifetime from python object.
14021402 event_obj = (PyObject * )SyclEvent_Make (eventstruct -> event_ref );
14031403 }
14041404 else {
@@ -1410,12 +1410,45 @@ static PyObject *DPEXRT_sycl_event_to_python(NRT_api_functions *nrt,
14101410 Py_INCREF (event_obj );
14111411 }
14121412
1413- // We need to release meminfo since we are taking ownership back .
1413+ // We need to release meminfo since we no longer need this reference in nrt .
14141414 nrt -> release (eventstruct -> meminfo );
14151415
14161416 return event_obj ;
14171417}
14181418
1419+ /*!
1420+ * @brief A helper function that initializes Numba-dpex eventstruct_t object
1421+ * for the DPCTLSyclEventRef allocated inside dpjit. Parent is set to NULL.
1422+ *
1423+ * @param nrt A Numba pointer to public api functions.
1424+ * @param event A dpctl event reference.
1425+ * @param eventstruct A Numba-dpex eventstruct object (datamodel).
1426+ * @return {return} Nothing.
1427+ */
1428+ static int DPEXRT_sycl_event_init (NRT_api_functions * nrt ,
1429+ DPCTLSyclEventRef event ,
1430+ eventstruct_t * eventstruct )
1431+ {
1432+ if (eventstruct == NULL ) {
1433+ DPEXRT_DEBUG (drt_debug_print (
1434+ "DPEXRT-ERROR: Failed to initialize dpctl SyclEvent into a Numba "
1435+ "eventstruct at %s, line %d. eventstruct is NULL.\n" ,
1436+ __FILE__ , __LINE__ ));
1437+
1438+ return -1 ;
1439+ }
1440+
1441+ DPEXRT_DEBUG (
1442+ drt_debug_print ("DPEXRT-DEBUG: creating new dpctl event meminfo.\n" ););
1443+ eventstruct -> parent = NULL ;
1444+ eventstruct -> event_ref = (void * )event ;
1445+ // manage_memory sets ref count to 1.
1446+ eventstruct -> meminfo =
1447+ nrt -> manage_memory (event , NRT_MemInfo_EventRef_Delete );
1448+
1449+ return 0 ;
1450+ }
1451+
14191452/*----------------------------------------------------------------------------*/
14201453/*--------------------- The _dpexrt_python Python extension module -- -------*/
14211454/*----------------------------------------------------------------------------*/
@@ -1456,6 +1489,7 @@ static PyObject *build_c_helpers_dict(void)
14561489 _declpointer ("DPEXRT_sycl_event_from_python" ,
14571490 & DPEXRT_sycl_event_from_python );
14581491 _declpointer ("DPEXRT_sycl_event_to_python" , & DPEXRT_sycl_event_to_python );
1492+ _declpointer ("DPEXRT_sycl_event_init" , & DPEXRT_sycl_event_init );
14591493
14601494#undef _declpointer
14611495 return dct ;
@@ -1511,7 +1545,8 @@ MOD_INIT(_dpexrt_python)
15111545 PyLong_FromVoidPtr (& DPEXRT_sycl_event_from_python ));
15121546 PyModule_AddObject (m , "DPEXRT_sycl_event_to_python" ,
15131547 PyLong_FromVoidPtr (& DPEXRT_sycl_event_to_python ));
1514-
1548+ PyModule_AddObject (m , "DPEXRT_sycl_event_init" ,
1549+ PyLong_FromVoidPtr (& DPEXRT_sycl_event_init ));
15151550 PyModule_AddObject (m , "DPEXRTQueue_CreateFromFilterString" ,
15161551 PyLong_FromVoidPtr (& DPEXRTQueue_CreateFromFilterString ));
15171552 PyModule_AddObject (m , "DpexrtQueue_SubmitRange" ,
0 commit comments