@@ -814,13 +814,14 @@ def allocator():
814814 alloc_key = pointer
815815
816816 finalizer = _hostalloc_finalizer (self , pointer , alloc_key , size , mapped )
817+ ctx = weakref .proxy (self .context )
817818
818819 if mapped :
819- mem = MappedMemory (pointer , size , finalizer = finalizer )
820+ mem = MappedMemory (ctx , pointer , size , finalizer = finalizer )
820821 self .allocations [alloc_key ] = mem
821822 return mem .own ()
822823 else :
823- return PinnedMemory (pointer , size , finalizer = finalizer )
824+ return PinnedMemory (ctx , pointer , size , finalizer = finalizer )
824825
825826 def mempin (self , owner , pointer , size , mapped = False ):
826827 """Implements the pinning of host memory.
@@ -847,13 +848,18 @@ def allocator():
847848 allocator ()
848849
849850 finalizer = _pin_finalizer (self , pointer , alloc_key , mapped )
851+ ctx = weakref .proxy (self .context )
850852
851853 if mapped :
852- mem = MappedMemory (pointer , size , owner = owner , finalizer = finalizer )
854+ mem = MappedMemory (
855+ ctx , pointer , size , owner = owner , finalizer = finalizer
856+ )
853857 self .allocations [alloc_key ] = mem
854858 return mem .own ()
855859 else :
856- return PinnedMemory (pointer , size , owner = owner , finalizer = finalizer )
860+ return PinnedMemory (
861+ ctx , pointer , size , owner = owner , finalizer = finalizer
862+ )
857863
858864 def memallocmanaged (self , size , attach_global ):
859865 def allocator ():
@@ -871,7 +877,8 @@ def allocator():
871877 alloc_key = ptr
872878
873879 finalizer = _alloc_finalizer (self , ptr , alloc_key , size )
874- mem = ManagedMemory (ptr , size , finalizer = finalizer )
880+ ctx = weakref .proxy (self .context )
881+ mem = ManagedMemory (ctx , ptr , size , finalizer = finalizer )
875882 self .allocations [alloc_key ] = mem
876883 return mem .own ()
877884
@@ -934,7 +941,8 @@ def allocator():
934941 alloc_key = ptr
935942
936943 finalizer = _alloc_finalizer (self , ptr , alloc_key , size )
937- mem = AutoFreePointer (ptr , size , finalizer = finalizer )
944+ ctx = weakref .proxy (self .context )
945+ mem = AutoFreePointer (ctx , ptr , size , finalizer = finalizer )
938946 self .allocations [alloc_key ] = mem
939947 return mem .own ()
940948
@@ -1265,7 +1273,9 @@ def open_ipc_handle(self, handle, size):
12651273 dptr = driver .cuIpcOpenMemHandle (handle , flags )
12661274
12671275 # wrap it
1268- return MemoryPointer (pointer = dptr , size = size )
1276+ return MemoryPointer (
1277+ context = weakref .proxy (self ), pointer = dptr , size = size
1278+ )
12691279
12701280 def enable_peer_access (self , peer_context , flags = 0 ):
12711281 """Enable peer access between the current context and the peer context"""
@@ -1751,7 +1761,7 @@ def _rebuild(cls, handle_ary, size, source_info, offset):
17511761 )
17521762
17531763
1754- class MemoryPointer :
1764+ class MemoryPointer ( object ) :
17551765 """A memory pointer that owns a buffer, with an optional finalizer. Memory
17561766 pointers provide reference counting, and instances are initialized with a
17571767 reference count of 1.
@@ -1767,6 +1777,8 @@ class MemoryPointer:
17671777 tie the buffer lifetime to the reference count, so that the buffer is freed
17681778 when there are no more references.
17691779
1780+ :param context: The context in which the pointer was allocated.
1781+ :type context: Context
17701782 :param pointer: The address of the buffer.
17711783 :type pointer: ctypes.c_void_p
17721784 :param size: The size of the allocation in bytes.
@@ -1783,10 +1795,11 @@ class MemoryPointer:
17831795
17841796 __cuda_memory__ = True
17851797
1786- def __init__ (self , pointer , size , owner = None , finalizer = None ):
1798+ def __init__ (self , context , pointer , size , owner = None , finalizer = None ):
17871799 if isinstance (pointer , ctypes .c_void_p ):
17881800 pointer = binding .CUdeviceptr (pointer .value )
17891801
1802+ self .context = context
17901803 self .device_pointer = pointer
17911804 self .size = size
17921805 self ._cuda_memsize_ = size
@@ -1842,7 +1855,7 @@ def view(self, start, stop=None):
18421855 pointer = binding .CUdeviceptr ()
18431856 ctypes_ptr = drvapi .cu_device_ptr .from_address (pointer .getPtr ())
18441857 ctypes_ptr .value = base
1845- view = MemoryPointer (pointer , size , owner = self .owner )
1858+ view = MemoryPointer (self . context , pointer , size , owner = self .owner )
18461859
18471860 if isinstance (self .owner , (MemoryPointer , OwnedPointer )):
18481861 # Owned by a numba-managed memory segment, take an owned reference
@@ -1871,7 +1884,7 @@ class AutoFreePointer(MemoryPointer):
18711884
18721885 def __init__ (self , * args , ** kwargs ):
18731886 super (AutoFreePointer , self ).__init__ (* args , ** kwargs )
1874- # Release the self reference to the buffer, so that the finalizer
1887+ # Releease the self reference to the buffer, so that the finalizer
18751888 # is invoked if all the derived pointers are gone.
18761889 self .refct -= 1
18771890
@@ -1898,15 +1911,17 @@ class MappedMemory(AutoFreePointer):
18981911
18991912 __cuda_memory__ = True
19001913
1901- def __init__ (self , pointer , size , owner = None , finalizer = None ):
1914+ def __init__ (self , context , pointer , size , owner = None , finalizer = None ):
19021915 self .owned = owner
19031916 self .host_pointer = pointer
19041917
19051918 devptr = driver .cuMemHostGetDevicePointer (pointer , 0 )
19061919 self ._bufptr_ = self .host_pointer
19071920
19081921 self .device_pointer = devptr
1909- super (MappedMemory , self ).__init__ (devptr , size , finalizer = finalizer )
1922+ super (MappedMemory , self ).__init__ (
1923+ context , devptr , size , finalizer = finalizer
1924+ )
19101925 self .handle = self .host_pointer
19111926
19121927 # For buffer interface
@@ -1935,7 +1950,8 @@ class PinnedMemory(mviewbuf.MemAlloc):
19351950 :type finalizer: function
19361951 """
19371952
1938- def __init__ (self , pointer , size , owner = None , finalizer = None ):
1953+ def __init__ (self , context , pointer , size , owner = None , finalizer = None ):
1954+ self .context = context
19391955 self .owned = owner
19401956 self .size = size
19411957 self .host_pointer = pointer
@@ -1975,10 +1991,10 @@ class ManagedMemory(AutoFreePointer):
19751991
19761992 __cuda_memory__ = True
19771993
1978- def __init__ (self , pointer , size , owner = None , finalizer = None ):
1994+ def __init__ (self , context , pointer , size , owner = None , finalizer = None ):
19791995 self .owned = owner
19801996 devptr = pointer
1981- super ().__init__ (devptr , size , finalizer = finalizer )
1997+ super ().__init__ (context , devptr , size , finalizer = finalizer )
19821998
19831999 # For buffer interface
19842000 self ._buflen_ = self .size
@@ -2302,7 +2318,7 @@ def get_global_symbol(self, name):
23022318 driver .cuModuleGetGlobal (
23032319 byref (ptr ), byref (size ), self .handle , name .encode ("utf8" )
23042320 )
2305- return MemoryPointer (ptr , size ), size .value
2321+ return MemoryPointer (self . context , ptr , size ), size .value
23062322
23072323
23082324class CudaPythonModule (Module ):
@@ -2312,7 +2328,7 @@ def get_function(self, name):
23122328
23132329 def get_global_symbol (self , name ):
23142330 ptr , size = driver .cuModuleGetGlobal (self .handle , name .encode ("utf8" ))
2315- return MemoryPointer (ptr , size ), size
2331+ return MemoryPointer (self . context , ptr , size ), size
23162332
23172333
23182334FuncAttr = namedtuple (
0 commit comments