Skip to content

Commit

Permalink
Clear exception flag on disconnect future if its also sent to handlers
Browse files Browse the repository at this point in the history
If we do not clear the exception retrieved flag on the disconnect
future it will likely never be retrieved since wait_for_disconnect
will never be called when the reply handler raises.
  • Loading branch information
bdraco committed May 20, 2024
1 parent f73e13e commit f44a65f
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/dbus_fast/aio/message_bus.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import array
import asyncio
import contextlib
import logging
import socket
from collections import deque
Expand Down Expand Up @@ -522,13 +523,23 @@ def _finalize(self, err: Optional[Exception] = None) -> None:
except Exception:
logging.warning("could not remove message writer", exc_info=True)

had_handlers = bool(self._method_return_handlers or self._user_message_handlers)

super()._finalize(err)

if self._disconnect_future.done():
return

if err and not self._user_disconnect:
_future_set_exception(self._disconnect_future, err)
# If this happens during a reply the message handlers
# will have the exception set and wait_for_disconnect will
# never be called so we need to manually set the exception
# as retrieved to avoid asyncio warnings when the future
# is garbage collected.
if had_handlers:
with contextlib.suppress(Exception):
self._disconnect_future.exception()
else:
_future_set_result(self._disconnect_future, None)

Expand Down

0 comments on commit f44a65f

Please sign in to comment.