[PATCH] osmo-gsm-tester[master]: dbus: handle missing interfaces by deferring, not by looping

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
Sat May 6 20:26:28 UTC 2017


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

dbus: handle missing interfaces by deferring, not by looping

Change-Id: I004c15a26753e3b05aa521f0eae1d9f94832059b
---
M src/osmo_gsm_tester/ofono_client.py
1 file changed, 21 insertions(+), 15 deletions(-)


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

diff --git a/src/osmo_gsm_tester/ofono_client.py b/src/osmo_gsm_tester/ofono_client.py
index fdc2e43..fca56a7 100644
--- a/src/osmo_gsm_tester/ofono_client.py
+++ b/src/osmo_gsm_tester/ofono_client.py
@@ -40,7 +40,11 @@
         dbus_iface.connect(self.receive_signal)
 
     def receive_signal(self, *args, **kwargs):
-        DeferredHandling.defer_queue.append((self.handler, args, kwargs))
+        DeferredHandling.defer(self.handler, args, kwargs)
+
+    @staticmethod
+    def defer(handler, args, kwargs):
+        DeferredHandling.defer_queue.append((handler, args, kwargs))
 
     @staticmethod
     def handle_queue():
@@ -57,6 +61,8 @@
     DeferredHandling.defer_queue.'''
     DeferredHandling(dbus_iface, handler)
 
+def defer(handler, *args, **kwargs):
+    DeferredHandling.defer(handler, args, kwargs)
 
 def poll():
     global glib_main_ctx
@@ -151,21 +157,21 @@
             with log.Origin('modem.enable(%s)' % iface):
                 self._on_interface_enabled(iface)
 
-    def _on_interface_enabled(self, interface_name):
-        self.dbg('Interface enabled:', interface_name)
+    def _on_interface_enabled(self, interface_name, retried=0):
+        if not retried:
+            self.dbg('Interface enabled:', interface_name)
+        try:
+            dbus_iface = self.dbus_obj()[interface_name]
+        except KeyError:
+            if retried < 3:
+                self.dbg('Actual DBus interface not present, deferring:', interface_name)
+                defer(self._on_interface_enabled, interface_name, retried + 1)
+            else:
+                self.dbg('DBus interface not appearing after', retried, 'attempts:', interface_name)
+            return
+
         if interface_name == I_SMS:
-            retries = 3
-            while True:
-                try:
-                    dbus_connect(self.dbus_obj()[I_SMS].IncomingMessage, self._on_incoming_message)
-                    break
-                except KeyError:
-                    self.dbg('Interface not yet available:', I_SMS)
-                    retries -= 1
-                    time.sleep(1)
-                    if retries <= 0:
-                        self.err('Interface enabled by signal, but not available:', I_SMS)
-                        raise
+            dbus_connect(self.dbus_obj()[I_SMS].IncomingMessage, self._on_incoming_message)
 
     def _on_interface_disabled(self, interface_name):
         self.dbg('Interface disabled:', interface_name)

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I004c15a26753e3b05aa521f0eae1d9f94832059b
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