docs: def readinto(self, b):
          """
          Read bytes into a pre-allocated, writable bytes-like object b,
          and return the number of bytes read.
  
          Args:
              b (bytes-like object): buffer.
  
          Returns:
              int: number of bytes read
          """
          if not self._readable:
              raise UnsupportedOperation('read')
  
          # Get and update stream positions
          size = len(b)
          with self._seek_lock:
              start = self._seek
              end = start + size
              self._seek = end
  
          # Read data range
          with handle_os_exceptions():
              read_data = self._read_range(start, end)
  
          # Copy to bytes-like object
          read_size = len(read_data)
          if read_size:
              memoryview(b)[:read_size] = read_data
  
          # Update stream position if end of file
          if read_size != size:
              with self._seek_lock:
                  self._seek = start + read_size
  
          # Return read size
          return read_size