def test_allocate_invalid_size(self): # Checks that attempting to allocate too big a region fails gracefully. size = types.size_t.maxval // 8 // 2 for pred in (True, False): with self.assertRaises(MemoryError) as raises: rtsys.meminfo_alloc(size, safe=pred) self.assertIn(f"Requested allocation of {size} bytes failed.", str(raises.exception))
def test_allocate_negative_size(self): # Checks that attempting to allocate negative number of bytes fails # gracefully. size = -10 for pred in (True, False): with self.assertRaises(ValueError) as raises: rtsys.meminfo_alloc(size, safe=pred) msg = f"Cannot allocate a negative number of bytes: {size}." self.assertIn(msg, str(raises.exception))
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