Coverage for /usr/share/miniconda3/envs/dolfin/lib/python3.8/site-packages/block/object_pool.py: 100%

43 statements  

« prev     ^ index     » next       coverage.py v7.2.1, created at 2023-03-20 13:03 +0000

1import sys 

2 

3class object_pool: 

4 """Manage a free-list of objects. The objects are automatically made 

5 available as soon as they are deleted by the caller. The assumption is that 

6 any operation is repeated a number of times (think iterative solvers), so 

7 that if N objects are needed simultaneously then soon N objects are needed 

8 again. Thus, objects managed by this pool are not deleted until the owning 

9 object (typically a Matrix) is deleted. 

10 """ 

11 def __init__(self): 

12 self.all = [] 

13 

14 def add(self, obj): 

15 self.all.append(obj) 

16 

17 def get(self): 

18 for obj in self.all: 

19 if sys.getrefcount(obj) == 3: 

20 # 3 references: self.all, obj, getrefcount() parameter 

21 return obj 

22 

23 

24def shared_vec_pool(func): 

25 """Decorator for create_vec, which creates a per-object pool of (memoized) 

26 returned vectors, shared for all dimensions. To be used only on objects 

27 where it is known that the row and columns are distributed equally. 

28 """ 

29 def pooled_create_vec(self, dim=1): 

30 try: 

31 vec_pool = self._vec_pool 

32 except AttributeError: 

33 vec_pool = self._vec_pool = object_pool() 

34 vec = vec_pool.get() 

35 if vec is None: 

36 vec = func(self, dim) 

37 vec_pool.add(vec) 

38 return vec 

39 pooled_create_vec.__doc__ = func.__doc__ 

40 return pooled_create_vec 

41 

42def vec_pool(func): 

43 """Decorator for create_vec, which creates a per-object pool of (memoized) 

44 returned vectors per dimension. 

45 """ 

46 def pooled_create_vec(self, dim=1): 

47 try: 

48 vec_pools = self._vec_pools 

49 except AttributeError: 

50 vec_pools = self._vec_pools = [object_pool(), object_pool()] 

51 vec_pool = vec_pools[dim] 

52 vec = vec_pool.get() 

53 if vec is None: 

54 vec = func(self, dim) 

55 vec_pool.add(vec) 

56 return vec 

57 pooled_create_vec.__doc__ = func.__doc__ 

58 return pooled_create_vec 

59 

60def store_args_ref(func): 

61 """Decorator for any function, which stores a reference to the arguments 

62 on the object. Used to force a Python-side reference, when the native-side 

63 reference isn't sufficient (or present).""" 

64 def store_args_and_pass(self, *args, **kwargs): 

65 self._vec_pool_args = (args, kwargs) 

66 return func(self, *args, **kwargs) 

67 store_args_and_pass.__doc__ = func.__doc__ 

68 return store_args_and_pass