88from .. import introspection as intr
99from ..auth import Authenticator , AuthExternal
1010
11+ import logging
1112import array
1213import asyncio
1314from asyncio import Queue
1617from 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+
1930class _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