@@ -246,7 +246,8 @@ def _call_connection_lost(self, exc):
246
246
self ._loop = None
247
247
248
248
249
- class _UnixWritePipeTransport (transports .WriteTransport ):
249
+ class _UnixWritePipeTransport (selector_events ._FlowControlMixin ,
250
+ transports .WriteTransport ):
250
251
251
252
def __init__ (self , loop , pipe , protocol , waiter = None , extra = None ):
252
253
super ().__init__ (extra )
@@ -277,12 +278,17 @@ def __init__(self, loop, pipe, protocol, waiter=None, extra=None):
277
278
if waiter is not None :
278
279
self ._loop .call_soon (waiter .set_result , None )
279
280
281
+ def get_write_buffer_size (self ):
282
+ return sum (len (data ) for data in self ._buffer )
283
+
280
284
def _read_ready (self ):
281
285
# Pipe was closed by peer.
282
286
self ._close ()
283
287
284
288
def write (self , data ):
285
- assert isinstance (data , bytes ), repr (data )
289
+ assert isinstance (data , (bytes , bytearray , memoryview )), repr (data )
290
+ if isinstance (data , bytearray ):
291
+ data = memoryview (data )
286
292
if not data :
287
293
return
288
294
@@ -310,6 +316,7 @@ def write(self, data):
310
316
self ._loop .add_writer (self ._fileno , self ._write_ready )
311
317
312
318
self ._buffer .append (data )
319
+ self ._maybe_pause_protocol ()
313
320
314
321
def _write_ready (self ):
315
322
data = b'' .join (self ._buffer )
@@ -329,7 +336,8 @@ def _write_ready(self):
329
336
else :
330
337
if n == len (data ):
331
338
self ._loop .remove_writer (self ._fileno )
332
- if self ._closing :
339
+ self ._maybe_resume_protocol () # May append to buffer.
340
+ if not self ._buffer and self ._closing :
333
341
self ._loop .remove_reader (self ._fileno )
334
342
self ._call_connection_lost (None )
335
343
return
0 commit comments