docs: def deallocate(self, buf):
          """
          Return buffers to the pool. If they are of the poolable size add them
          to the free list, otherwise just mark the memory as free.
  
          Arguments:
              buffer_ (io.BytesIO): The buffer to return
          """
          with self._lock:
              # BytesIO.truncate here makes the pool somewhat pointless
              # but we stick with the BufferPool API until migrating to
              # bytesarray / memoryview. The buffer we return must not
              # expose any prior data on read().
              buf.truncate(0)
              self._free.append(buf)
              if self._waiters:
                  self._waiters[0].notify()