Skip to content

Commit 26ddbf6

Browse files
committed
Apply _MembersNeededForFinalize pattern to _event.py
1 parent 765ff71 commit 26ddbf6

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

cuda_core/cuda/core/experimental/_event.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,29 @@ class Event:
5151
5252
"""
5353

54-
__slots__ = ("__weakref__", "_finalizer", "_handle", "_timing_disabled", "_busy_waited")
54+
class _MembersNeededForFinalize:
55+
__slots__ = ("handle",)
56+
57+
def __init__(self, event_obj, handle):
58+
self.handle = handle
59+
weakref.finalize(event_obj, self.close)
60+
61+
def close(self):
62+
if self.handle is not None:
63+
handle_return(cuda.cuEventDestroy(self.handle))
64+
self.handle = None
65+
66+
__slots__ = ("__weakref__", "_mnff", "_timing_disabled", "_busy_waited")
5567

5668
def __init__(self):
57-
self._handle = None
5869
raise NotImplementedError(
5970
"directly creating an Event object can be ambiguous. Please call call Stream.record()."
6071
)
6172

6273
@staticmethod
6374
def _init(options: Optional[EventOptions] = None):
6475
self = Event.__new__(Event)
65-
# minimal requirements for the destructor
66-
self._handle = None
76+
self._mnff = Event._MembersNeededForFinalize(self, None)
6777

6878
options = check_or_create_options(EventOptions, options, "Event options")
6979
flags = 0x0
@@ -77,20 +87,12 @@ def _init(options: Optional[EventOptions] = None):
7787
self._busy_waited = True
7888
if options.support_ipc:
7989
raise NotImplementedError("TODO")
80-
self._handle = handle_return(cuda.cuEventCreate(flags))
81-
self._finalizer = weakref.finalize(self, Event._finalize, self._handle)
90+
self._mnff.handle = handle_return(cuda.cuEventCreate(flags))
8291
return self
8392

84-
@staticmethod
85-
def _finalize(self_handle):
86-
handle_return(cuda.cuEventDestroy(self_handle))
87-
8893
def close(self):
8994
"""Destroy the event."""
90-
if self._handle:
91-
self._finalizer.Detach()
92-
Event._finalize(self._handle)
93-
self._handle = None
95+
self._mnff.close()
9496

9597
@property
9698
def is_timing_disabled(self) -> bool:
@@ -117,12 +119,12 @@ def sync(self):
117119
has been completed.
118120
119121
"""
120-
handle_return(cuda.cuEventSynchronize(self._handle))
122+
handle_return(cuda.cuEventSynchronize(self._mnff.handle))
121123

122124
@property
123125
def is_done(self) -> bool:
124126
"""Return True if all captured works have been completed, otherwise False."""
125-
(result,) = cuda.cuEventQuery(self._handle)
127+
(result,) = cuda.cuEventQuery(self._mnff.handle)
126128
if result == cuda.CUresult.CUDA_SUCCESS:
127129
return True
128130
elif result == cuda.CUresult.CUDA_ERROR_NOT_READY:
@@ -133,4 +135,4 @@ def is_done(self) -> bool:
133135
@property
134136
def handle(self) -> int:
135137
"""Return the underlying cudaEvent_t pointer address as Python int."""
136-
return int(self._handle)
138+
return int(self._mnff.handle)

0 commit comments

Comments
 (0)