Skip to content

Commit 1213667

Browse files
author
Tony Crisci
committed
aio: safe future reply setter methods
1 parent 611d1e8 commit 1213667

1 file changed

Lines changed: 31 additions & 18 deletions

File tree

dbus_next/aio/message_bus.py

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from .. import introspection as intr
99
from ..auth import Authenticator, AuthExternal
1010

11+
import logging
1112
import array
1213
import asyncio
1314
from asyncio import Queue
@@ -16,6 +17,16 @@
1617
from typing import Optional
1718

1819

20+
def _future_set_exception(fut, exc):
21+
if fut is not None and not fut.done():
22+
fut.set_exception(exc)
23+
24+
25+
def _future_set_result(fut, result):
26+
if fut is not None and not fut.done():
27+
fut.set_result(result)
28+
29+
1930
class _MessageWriter:
2031
def __init__(self, bus):
2132
self.messages = Queue()
@@ -27,6 +38,7 @@ def __init__(self, bus):
2738
self.fd = bus._fd
2839
self.offset = 0
2940
self.unix_fds = None
41+
self.fut = None
3042

3143
def write_callback(self):
3244
try:
@@ -53,14 +65,12 @@ def write_callback(self):
5365
if self.offset >= len(self.buf):
5466
# finished writing
5567
self.buf = None
56-
if self.fut is not None:
57-
self.fut.set_result(None)
68+
_future_set_result(self.fut, None)
5869
else:
5970
# wait for writable
6071
return
6172
except Exception as e:
62-
if self.fut is not None and not self.fut.done():
63-
self.fut.set_exception(e)
73+
_future_set_exception(self.fut, e)
6474
self.bus._finalize(e)
6575

6676
def buffer_message(self, msg: Message, future=None):
@@ -145,9 +155,9 @@ def on_hello(reply, err):
145155
raise err
146156
self.unique_name = reply.body[0]
147157
self._writer.schedule_write()
148-
future.set_result(self)
158+
_future_set_result(future, self)
149159
except Exception as e:
150-
future.set_exception(e)
160+
_future_set_exception(future, e)
151161
self.disconnect()
152162
self._finalize(err)
153163

@@ -194,9 +204,9 @@ async def introspect(self, bus_name: str, path: str, timeout: float = 30.0) -> i
194204

195205
def reply_handler(reply, err):
196206
if err:
197-
future.set_exception(err)
207+
_future_set_exception(future, err)
198208
else:
199-
future.set_result(reply)
209+
_future_set_result(future, reply)
200210

201211
super().introspect(bus_name, path, reply_handler)
202212

@@ -224,9 +234,9 @@ async def request_name(self, name: str, flags: NameFlag = NameFlag.NONE) -> Requ
224234

225235
def reply_handler(reply, err):
226236
if err:
227-
future.set_exception(err)
237+
_future_set_exception(future, err)
228238
else:
229-
future.set_result(reply)
239+
_future_set_result(future, reply)
230240

231241
super().request_name(name, flags, reply_handler)
232242

@@ -252,9 +262,9 @@ async def release_name(self, name: str) -> ReleaseNameReply:
252262

253263
def reply_handler(reply, err):
254264
if err:
255-
future.set_exception(err)
265+
_future_set_exception(future, err)
256266
else:
257-
future.set_result(reply)
267+
_future_set_result(future, reply)
258268

259269
super().release_name(name, reply_handler)
260270

@@ -283,9 +293,9 @@ async def call(self, msg: Message) -> Optional[Message]:
283293
def reply_handler(reply, err):
284294
if not future.done():
285295
if err:
286-
future.set_exception(err)
296+
_future_set_exception(future, err)
287297
else:
288-
future.set_result(reply)
298+
_future_set_result(future, reply)
289299

290300
self._call(msg, reply_handler)
291301

@@ -391,16 +401,19 @@ def _create_unmarshaller(self):
391401
def _finalize(self, err=None):
392402
try:
393403
self._loop.remove_reader(self._fd)
404+
except Exception:
405+
logging.warning('could not remove message reader', exc_info=True)
406+
try:
394407
self._loop.remove_writer(self._fd)
395-
except OSError:
396-
pass
408+
except Exception:
409+
logging.warning('could not remove message writer', exc_info=True)
397410

398411
super()._finalize(err)
399412

400413
if self._disconnect_future.done():
401414
return
402415

403416
if err and not self._user_disconnect:
404-
self._disconnect_future.set_exception(err)
417+
_future_set_exception(self._disconnect_future, err)
405418
else:
406-
self._disconnect_future.set_result(None)
419+
_future_set_result(self._disconnect_future, None)

0 commit comments

Comments
 (0)