@@ -82,7 +82,7 @@ def __init__(self, unresolved_address, sock, *, auth=None, **config):
8282 self .socket = sock
8383 self .server = ServerInfo (Address (sock .getpeername ()), Bolt4x0 .PROTOCOL_VERSION )
8484 self .outbox = Outbox ()
85- self .inbox = Inbox (BufferedSocket ( self .socket , 32768 ) , on_error = self ._set_defunct )
85+ self .inbox = Inbox (self .socket , on_error = self ._set_defunct )
8686 self .packer = Packer (self .outbox )
8787 self .unpacker = Unpacker (self .inbox )
8888 self .responses = deque ()
@@ -461,96 +461,6 @@ def view(self):
461461 return memoryview (self ._data [:end ])
462462
463463
464- class BufferedSocket :
465- """ Wrapper for a regular socket, with an added a dynamically-resizing
466- receive buffer to reduce the number of calls to recv.
467-
468- NOTE: not all socket methods are implemented yet
469- """
470-
471- def __init__ (self , socket_ , initial_capacity = 0 ):
472- self .socket = socket_
473- self .buffer = bytearray (initial_capacity )
474- self .r_pos = 0
475- self .w_pos = 0
476-
477- def _fill_buffer (self , min_bytes ):
478- """ Fill the buffer with at least `min_bytes` bytes, requesting more if
479- the buffer has space. Internally, this method attempts to do as little
480- allocation as possible and make as few calls to socket.recv as
481- possible.
482- """
483- # First, we need to calculate how much spare space exists between the
484- # write cursor and the end of the buffer.
485- space_at_end = len (self .buffer ) - self .w_pos
486- if min_bytes <= space_at_end :
487- # If there's at least enough here for the minimum number of bytes
488- # we need, then do nothing
489- #
490- pass
491- elif min_bytes <= space_at_end + self .r_pos :
492- # If the buffer contains enough space, but it's split between the
493- # end of the buffer and recyclable space at the start of the
494- # buffer, then recycle that space by pushing the remaining data
495- # towards the front.
496- #
497- # print("Recycling {} bytes".format(self.r_pos))
498- size = self .w_pos - self .r_pos
499- view = memoryview (self .buffer )
500- self .buffer [0 :size ] = view [self .r_pos :self .w_pos ]
501- self .r_pos = 0
502- self .w_pos = size
503- else :
504- # Otherwise, there's just not enough space whichever way you shake
505- # it. So, rebuild the buffer from scratch, taking the unread data
506- # and appending empty space big enough to hold the minimum number
507- # of bytes we're looking for.
508- #
509- # print("Rebuilding buffer from {} bytes ({} used) to "
510- # "{} bytes".format(len(self.buffer),
511- # self.w_pos - self.r_pos,
512- # self.w_pos - self.r_pos + min_bytes))
513- self .buffer = (self .buffer [self .r_pos :self .w_pos ] +
514- bytearray (min_bytes ))
515- self .w_pos -= self .r_pos
516- self .r_pos = 0
517- min_end = self .w_pos + min_bytes
518- end = len (self .buffer )
519- view = memoryview (self .buffer )
520- self .socket .setblocking (0 )
521- while self .w_pos < min_end :
522- ready_to_read , _ , _ = select ([self .socket ], [], [])
523- subview = view [self .w_pos :end ]
524- n = self .socket .recv_into (subview , end - self .w_pos )
525- if n == 0 :
526- raise OSError ("No data" )
527- self .w_pos += n
528-
529- def recv_into (self , buffer , n_bytes = 0 , flags = 0 ):
530- """ Intercepts a regular socket.recv_into call, taking data from the
531- internal buffer, if available. If not enough data exists in the buffer,
532- more will be retrieved first.
533-
534- Unlike the lower-level call, this method will never return 0, instead
535- raising an OSError if no data is returned on the underlying socket.
536-
537- :param buffer:
538- :param n_bytes:
539- :param flags:
540- :raises OSError:
541- :return:
542- """
543- available = self .w_pos - self .r_pos
544- required = n_bytes - available
545- if required > 0 :
546- self ._fill_buffer (required )
547- view = memoryview (self .buffer )
548- end = self .r_pos + n_bytes
549- buffer [:] = view [self .r_pos :end ]
550- self .r_pos = end
551- return n_bytes
552-
553-
554464class Inbox (MessageInbox ):
555465
556466 def __next__ (self ):
0 commit comments