log.Origin: ensure to avoid parent loops
Change-Id: I10a2f956beeda38ba1378eace9453eb911aae1a7
diff --git a/src/osmo_gsm_tester/log.py b/src/osmo_gsm_tester/log.py
index 3ac8ccd..e8dd3d8 100644
--- a/src/osmo_gsm_tester/log.py
+++ b/src/osmo_gsm_tester/log.py
@@ -309,7 +309,7 @@
_name = None
_origin_id = None
_log_category = None
- _parent_origin = None
+ _parent = None
@staticmethod
def find_on_stack(except_obj=None, f=None):
@@ -331,7 +331,7 @@
if log_ctx_obj is None:
log_ctx_obj = new_log_ctx_obj
else:
- log_ctx_obj.highest_ancestor()._parent_origin = new_log_ctx_obj
+ log_ctx_obj.highest_ancestor()._set_parent(new_log_ctx_obj)
obj = l.get('self')
if obj and isinstance(obj, Origin) and (except_obj is not obj):
@@ -340,7 +340,7 @@
f = f.f_back
if (origin is not None) and (log_ctx_obj is not None):
- log_ctx_obj.highest_ancestor()._parent_origin = origin
+ log_ctx_obj.highest_ancestor()._set_parent(origin)
if log_ctx_obj is not None:
return log_ctx_obj
# may return None
@@ -358,7 +358,16 @@
self._set_log_category(category)
self._set_name(*name_items, **detail_items)
if find_parent:
- self._parent_origin = Origin.find_on_stack(except_obj=self)
+ self._set_parent(Origin.find_on_stack(except_obj=self))
+
+ def _set_parent(self, parent):
+ # make sure to avoid loops
+ p = parent
+ while p:
+ if p is self:
+ raise RuntimeError('Origin parent loop')
+ p = p._parent
+ self._parent = parent
def _set_name(self, *name_items, **detail_items):
if name_items:
@@ -399,7 +408,7 @@
origin = self
while origin:
origins.insert(0, origin)
- origin = origin._parent_origin
+ origin = origin._parent
n -= 1
if n < 0:
break
@@ -409,8 +418,8 @@
return '↪'.join([o.name() for o in self.ancestry()])
def highest_ancestor(self):
- if self._parent_origin:
- return self._parent_origin.highest_ancestor()
+ if self._parent:
+ return self._parent.highest_ancestor()
return self
def log(self, *messages, **named_items):