def test_buffer(self): from ctypes import c_uint32, c_void_p, POINTER, cast dtype = np.dtype(np.uint32) bytesize = dtype.itemsize * 10 mi = rtsys.meminfo_alloc(bytesize, safe=True) self.assertEqual(mi.refcount, 1) addr = mi.data c_arr = cast(c_void_p(addr), POINTER(c_uint32 * 10)) # Check 0xCB-filling for i in range(10): self.assertEqual(c_arr.contents[i], 0xcbcbcbcb) # Init array with ctypes for i in range(10): c_arr.contents[i] = i + 1 arr = np.ndarray(dtype=dtype, shape=bytesize // dtype.itemsize, buffer=mi) self.assertEqual(mi.refcount, 1) del mi # Modify array with NumPy np.testing.assert_equal(np.arange(arr.size) + 1, arr) arr += 1 # Check value reflected in ctypes for i in range(10): self.assertEqual(c_arr.contents[i], i + 2) self.assertEqual(arr.ctypes.data, addr) del arr
def test_memoryview(self): from ctypes import c_uint32, c_void_p, POINTER, cast dtype = np.dtype(np.uint32) bytesize = dtype.itemsize * 10 mi = rtsys.meminfo_alloc(bytesize, safe=True) addr = mi.data c_arr = cast(c_void_p(mi.data), POINTER(c_uint32 * 10)) # Check 0xCB-filling for i in range(10): self.assertEqual(c_arr.contents[i], 0xcbcbcbcb) # Init array with ctypes for i in range(10): c_arr.contents[i] = i + 1 mview = memoryview(mi) self.assertEqual(mview.nbytes, bytesize) self.assertFalse(mview.readonly) self.assertIs(mi, mview.obj) self.assertTrue(mview.c_contiguous) self.assertEqual(mview.itemsize, 1) self.assertEqual(mview.ndim, 1) del mi arr = np.ndarray(dtype=dtype, shape=mview.nbytes // dtype.itemsize, buffer=mview) del mview # Modify array with NumPy np.testing.assert_equal(np.arange(arr.size) + 1, arr) arr += 1 # Check value reflected in ctypes for i in range(10): self.assertEqual(c_arr.contents[i], i + 2) self.assertEqual(arr.ctypes.data, addr) del arr