[PATCH] osmo-gsm-tester[master]: log.Origin: ensure to avoid parent loops

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Mon Jun 12 12:05:11 UTC 2017


Review at  https://gerrit.osmocom.org/2887

log.Origin: ensure to avoid parent loops

Change-Id: I10a2f956beeda38ba1378eace9453eb911aae1a7
---
M src/osmo_gsm_tester/log.py
1 file changed, 16 insertions(+), 7 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/87/2887/1

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):

-- 
To view, visit https://gerrit.osmocom.org/2887
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I10a2f956beeda38ba1378eace9453eb911aae1a7
Gerrit-PatchSet: 1
Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list