D3246: keepalive: rewrite readinto() to not use read()
durin42 (Augie Fackler)
phabricator at mercurial-scm.org
Wed Apr 11 16:42:19 EDT 2018
durin42 updated this revision to Diff 8015.
durin42 edited the summary of this revision.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D3246?vs=8010&id=8015
REVISION DETAIL
https://phab.mercurial-scm.org/D3246
AFFECTED FILES
mercurial/keepalive.py
CHANGE DETAILS
diff --git a/mercurial/keepalive.py b/mercurial/keepalive.py
--- a/mercurial/keepalive.py
+++ b/mercurial/keepalive.py
@@ -384,6 +384,7 @@
self._connection = None # (same)
_raw_read = httplib.HTTPResponse.read
+ _raw_readinto = getattr(httplib.HTTPResponse, 'readinto', None)
def close(self):
if self.fp:
@@ -523,12 +524,24 @@
return list
def readinto(self, dest):
- res = self.read(len(dest))
- if not res:
- return 0
-
- dest[0:len(res)] = res
- return len(res)
+ if self._raw_readinto is None:
+ res = self.read(len(dest))
+ if not res:
+ return 0
+ dest[0:len(res)] = res
+ return len(res)
+ total = len(dest)
+ have = len(self._rbuf)
+ if have >= total:
+ dest[0:total] = self._rbuf[:total]
+ self._rbuf = self._rbuf[total:]
+ return total
+ mv = memoryview(dest)
+ got = self._raw_readinto(mv[have:total])
+ dest[0:have] = self._rbuf
+ got += len(self._rbuf)
+ self._rbuf = ''
+ return got
def safesend(self, str):
"""Send `str' to the server.
To: durin42, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list