Skip to content

Commit 615d7d8

Browse files
committed
cuda.core: expose named resource state without changing truthiness
Replace lifecycle-dependent truthiness with explicit is_closed and is_valid properties while preserving the historical truth value of cuda.core objects.
1 parent 84db682 commit 615d7d8

52 files changed

Lines changed: 211 additions & 154 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎cuda_core/cuda/core/_context.pyi‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ class Context:
3232
def _handle(self) -> cuda.bindings.driver.CUcontext | None:
3333
...
3434

35-
def __bool__(self) -> bool:
36-
...
35+
@property
36+
def is_closed(self) -> bool:
37+
"""Whether this context has been closed."""
3738

3839
@property
3940
def is_green(self) -> bool:

‎cuda_core/cuda/core/_context.pyx‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ cdef class Context:
7474
def _handle(self) -> cuda.bindings.driver.CUcontext | None:
7575
return self.handle
7676

77-
def __bool__(self) -> bool:
78-
return self._h_context.get() != NULL
77+
@property
78+
def is_closed(self) -> bool:
79+
"""Whether this context has been closed."""
80+
return self._h_context.get() == NULL
7981

8082
@property
8183
def is_green(self) -> bool:

‎cuda_core/cuda/core/_device.pyx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1278,7 +1278,7 @@ class Device:
12781278
if ctx is not None:
12791279
# TODO: revisit once Context is cythonized
12801280
assert_type(ctx, Context)
1281-
if not ctx:
1281+
if ctx.is_closed:
12821282
raise RuntimeError("Context has been closed")
12831283
if ctx._device_id != self._device_id:
12841284
raise RuntimeError(

‎cuda_core/cuda/core/_event.pyi‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ class Event:
7272
def __init__(self, *args, **kwargs) -> None:
7373
...
7474

75-
def __bool__(self) -> bool:
76-
...
75+
@property
76+
def is_closed(self) -> bool:
77+
"""Whether this event has been closed."""
7778

7879
def __isub__(self, other: object):
7980
...

‎cuda_core/cuda/core/_event.pyx‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,10 @@ cdef class Event:
157157
"""
158158
self._h_event.reset()
159159

160-
def __bool__(self) -> bool:
161-
return self._h_event.get() != NULL
160+
@property
161+
def is_closed(self) -> bool:
162+
"""Whether this event has been closed."""
163+
return self._h_event.get() == NULL
162164

163165
def __isub__(self, other: object):
164166
return NotImplemented

‎cuda_core/cuda/core/_graphics.pyi‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,9 @@ class GraphicsResource:
213213
def handle(self) -> int:
214214
"""The raw ``CUgraphicsResource`` handle as a Python int."""
215215

216-
def __bool__(self) -> bool:
217-
...
216+
@property
217+
def is_closed(self) -> bool:
218+
"""Whether this graphics resource has been closed."""
218219

219220
@property
220221
def resource_handle(self) -> int:

‎cuda_core/cuda/core/_graphics.pyx‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,10 @@ cdef class GraphicsResource:
347347
"""The raw ``CUgraphicsResource`` handle as a Python int."""
348348
return as_intptr(self._handle)
349349

350-
def __bool__(self) -> bool:
351-
return self._handle.get() != NULL
350+
@property
351+
def is_closed(self) -> bool:
352+
"""Whether this graphics resource has been closed."""
353+
return self._handle.get() == NULL
352354

353355
@property
354356
def resource_handle(self) -> int:

‎cuda_core/cuda/core/_kernel_arg_handler.pyx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ cdef class ParamHolder:
282282
for i, arg in enumerate(kernel_args):
283283
arg_type = type(arg)
284284
if arg_type is Buffer:
285-
if not arg:
285+
if arg.is_closed:
286286
raise RuntimeError("Buffer has been closed")
287287
# we need the address of where the actual buffer address is stored
288288
if type(arg.handle) is int:
@@ -329,7 +329,7 @@ cdef class ParamHolder:
329329
continue
330330
# If no exact types are found, fallback to slower `isinstance` check
331331
elif isinstance(arg, Buffer):
332-
if not arg:
332+
if arg.is_closed:
333333
raise RuntimeError("Buffer has been closed")
334334
if isinstance(arg.handle, int):
335335
prepare_arg[intptr_t](self.data, self.data_addresses, arg.handle, i)

‎cuda_core/cuda/core/_linker.pyi‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ class Linker:
3535
def __init__(self, options: LinkerOptions | None=None, *object_codes: ObjectCode):
3636
...
3737

38-
def __bool__(self) -> bool:
39-
...
38+
@property
39+
def is_closed(self) -> bool:
40+
"""Whether this linker has been closed."""
4041

4142
def link(self, target_type: ObjectCodeFormatType | str) -> ObjectCode:
4243
"""Link the provided object codes into a single output of the specified target type.

‎cuda_core/cuda/core/_linker.pyx‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,12 @@ cdef class Linker:
8181
def __init__(self, *object_codes: ObjectCode, options: LinkerOptions | None = None):
8282
Linker_init(self, object_codes, options)
8383

84-
def __bool__(self) -> bool:
84+
@property
85+
def is_closed(self) -> bool:
86+
"""Whether this linker has been closed."""
8587
if self._use_nvjitlink:
86-
return self._nvjitlink_handle.get() != NULL
87-
return self._culink_handle.get() != NULL
88+
return self._nvjitlink_handle.get() == NULL
89+
return self._culink_handle.get() == NULL
8890

8991
def link(self, target_type: ObjectCodeFormatType | str) -> ObjectCode:
9092
"""Link the provided object codes into a single output of the specified target type.
@@ -104,7 +106,7 @@ cdef class Linker:
104106
Ensure that input object codes were compiled with appropriate
105107
flags for linking (e.g., relocatable device code enabled).
106108
"""
107-
if not self:
109+
if self.is_closed:
108110
raise RuntimeError("Linker has been closed")
109111
return Linker_link(self, str(target_type))
110112

@@ -119,7 +121,7 @@ cdef class Linker:
119121
# After link(), the decoded log is cached here.
120122
if self._error_log is not None:
121123
return self._error_log
122-
if not self:
124+
if self.is_closed:
123125
raise RuntimeError("Linker has been closed")
124126
cdef cynvjitlink.nvJitLinkHandle c_h
125127
cdef size_t c_log_size = 0
@@ -147,7 +149,7 @@ cdef class Linker:
147149
# After link(), the decoded log is cached here.
148150
if self._info_log is not None:
149151
return self._info_log
150-
if not self:
152+
if self.is_closed:
151153
raise RuntimeError("Linker has been closed")
152154
cdef cynvjitlink.nvJitLinkHandle c_h
153155
cdef size_t c_log_size = 0

0 commit comments

Comments
 (0)