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.orgNeels Hofmeyr has submitted this change and it was merged. Change subject: ofono_client: Cancel pending async dbus methods at cleanup time ...................................................................... ofono_client: Cancel pending async dbus methods at cleanup time This commit should fix issue described #2326, in which a test started scanning and quickly afterwards failed, leaving the async Scan() method running and the response arriving when we were already in another suite/test. Change-Id: If5e9bcac8e4114718243d178ff50d1ed8b30c95d --- M src/osmo_gsm_tester/ofono_client.py 1 file changed, 24 insertions(+), 5 deletions(-) Approvals: Neels Hofmeyr: Looks good to me, approved Jenkins Builder: Verified diff --git a/src/osmo_gsm_tester/ofono_client.py b/src/osmo_gsm_tester/ofono_client.py index 4deff9e..70fee25 100644 --- a/src/osmo_gsm_tester/ofono_client.py +++ b/src/osmo_gsm_tester/ofono_client.py @@ -24,6 +24,11 @@ import pprint import sys +# Required for Gio.Cancellable. +# See https://lazka.github.io/pgi-docs/Gio-2.0/classes/Cancellable.html#Gio.Cancellable +from gi.module import get_introspection_module +Gio = get_introspection_module('Gio') + from gi.repository import GLib glib_main_loop = GLib.MainLoop() glib_main_ctx = glib_main_loop.get_context() @@ -90,7 +95,10 @@ try: ret = obj.call_finish(result) except Exception as e: - # return exception as value + if isinstance(e, GLib.Error) and e.code == Gio.IOErrorEnum.CANCELLED: + log.dbg('DBus method cancelled') + return + if error_callback: error_callback(obj, e, real_user_data) else: @@ -108,7 +116,7 @@ def dbus_async_call(instance, proxymethod, *proxymethod_args, result_handler=None, error_handler=None, - user_data=None, timeout=30, + user_data=None, timeout=30, cancellable=None, **proxymethod_kwargs): '''pydbus doesn't support asynchronous methods. This method adds support for it until pydbus implements it''' @@ -122,12 +130,13 @@ timeout = timeout * 1000 user_data = (result_handler, error_handler, user_data) + # See https://lazka.github.io/pgi-docs/Gio-2.0/classes/DBusProxy.html#Gio.DBusProxy.call ret = instance._bus.con.call( instance._bus_name, instance._path, proxymethod._iface_name, proxymethod.__name__, GLib.Variant(proxymethod._sinargs, proxymethod_args), GLib.VariantType.new(proxymethod._soutargs), - 0, timeout, None, + 0, timeout, cancellable, _async_result_handler, user_data) class ModemDbusInteraction(log.Origin): @@ -316,6 +325,8 @@ self.sms_received_list = [] self.dbus = ModemDbusInteraction(self.path) self.register_attempts = 0 + # one Cancellable can handle several concurrent methods. + self.cancellable = Gio.Cancellable.new() self.dbus.required_signals = { I_SMS: ( ('IncomingMessage', self._on_incoming_message), ), I_NETREG: ( ('PropertyChanged', self._on_netreg_property_changed), ), @@ -323,6 +334,13 @@ self.dbus.watch_interfaces() def cleanup(self): + self.dbg('cleanup') + if self.cancellable: + self.cancellable.cancel() + # Cancel op is applied as a signal coming from glib mainloop, so we + # need to run it and wait for the callbacks to handle cancellations. + poll_glib() + self.cancellable = None self.dbus.cleanup() self.dbus = None @@ -408,8 +426,9 @@ register_func = self.scan_cb_register_automatic if mcc_mnc is None else self.scan_cb_register result_handler = lambda obj, result, user_data: defer(register_func, result, user_data) error_handler = lambda obj, e, user_data: defer(self.scan_cb_error_handler, e, mcc_mnc) - dbus_async_call(netreg, netreg.Scan, timeout=30, result_handler=result_handler, - error_handler=error_handler, user_data=mcc_mnc) + dbus_async_call(netreg, netreg.Scan, timeout=30, cancellable=self.cancellable, + result_handler=result_handler, error_handler=error_handler, + user_data=mcc_mnc) def scan_cb_error_handler(self, e, mcc_mnc): # It was detected that Scan() method can fail for some modems on some -- To view, visit https://gerrit.osmocom.org/2910 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: merged Gerrit-Change-Id: If5e9bcac8e4114718243d178ff50d1ed8b30c95d Gerrit-PatchSet: 1 Gerrit-Project: osmo-gsm-tester Gerrit-Branch: master Gerrit-Owner: Pau Espin Pedrol <pespin at sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de> Gerrit-Reviewer: Pau Espin Pedrol <pespin at sysmocom.de>