python: mark _SharedObject._{get,put}_ref as abstract methods
[babeltrace.git] / src / bindings / python / bt2 / bt2 / object.py
1 # SPDX-License-Identifier: MIT
2 #
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
4
5
6 import abc
7
8
9 class _BaseObject:
10 # Ensure that the object always has _ptr set, even if it throws during
11 # construction.
12
13 def __new__(cls, *args, **kwargs):
14 obj = super().__new__(cls)
15 obj._ptr = None
16 return obj
17
18 def __init__(self, ptr):
19 self._ptr = ptr
20
21 @property
22 def addr(self):
23 return int(self._ptr)
24
25 def __repr__(self):
26 return "<{}.{} object @ {}>".format(
27 self.__class__.__module__, self.__class__.__name__, hex(self.addr)
28 )
29
30 def __copy__(self):
31 raise NotImplementedError
32
33 def __deepcopy__(self, memo):
34 raise NotImplementedError
35
36
37 # A Python object that is itself not refcounted, but is wholly owned by an
38 # object that is itself refcounted (a _SharedObject). A Babeltrace unique
39 # object gets destroyed once its owner gets destroyed (its refcount drops to
40 # 0).
41 #
42 # In the Python bindings, to avoid having to deal with issues with the lifetime
43 # of unique objects, we make it so acquiring a reference on a unique object
44 # acquires a reference on its owner.
45
46
47 class _UniqueObject(_BaseObject):
48
49 # Create a _UniqueObject.
50 #
51 # - ptr: SWIG Object, pointer to the unique object.
52 # - owner_ptr: SWIG Object, pointer to the owner of the unique
53 # object. A new reference is acquired.
54 # - owner_get_ref: Callback to get a reference on the owner
55 # - owner_put_ref: Callback to put a reference on the owner.
56
57 @classmethod
58 def _create_from_ptr_and_get_ref(cls, ptr, owner_ptr, owner_get_ref, owner_put_ref):
59 obj = cls.__new__(cls)
60
61 obj._ptr = ptr
62 obj._owner_ptr = owner_ptr
63 obj._owner_get_ref = owner_get_ref
64 obj._owner_put_ref = owner_put_ref
65
66 obj._owner_get_ref(obj._owner_ptr)
67
68 return obj
69
70 def __del__(self):
71 self._owner_put_ref(self._owner_ptr)
72
73
74 # Python object that owns a reference to a Babeltrace object.
75 class _SharedObject(_BaseObject, abc.ABC):
76 # Get a new reference on ptr.
77 #
78 # This must be implemented by subclasses to work correctly with a pointer
79 # of the native type they wrap.
80
81 @staticmethod
82 @abc.abstractmethod
83 def _get_ref(ptr):
84 raise NotImplementedError
85
86 # Put a reference on ptr.
87 #
88 # This must be implemented by subclasses to work correctly with a pointer
89 # of the native type they wrap.
90
91 @staticmethod
92 @abc.abstractmethod
93 def _put_ref(ptr):
94 raise NotImplementedError
95
96 # Create a _SharedObject from an existing reference.
97 #
98 # This assumes that the caller owns a reference to the Babeltrace object
99 # and transfers this ownership to the newly created Python object.
100
101 @classmethod
102 def _create_from_ptr(cls, ptr_owned):
103 obj = cls.__new__(cls)
104 obj._ptr = ptr_owned
105 return obj
106
107 # Like _create_from_ptr, but acquire a new reference rather than
108 # stealing the caller's reference.
109
110 @classmethod
111 def _create_from_ptr_and_get_ref(cls, ptr):
112 obj = cls._create_from_ptr(ptr)
113 cls._get_ref(obj._ptr)
114 return obj
115
116 def __del__(self):
117 self._put_ref(self._ptr)
This page took 0.031004 seconds and 4 git commands to generate.