# HG changeset patch # User Pierre-Yves David # Date 2020-01-07 11:09:36 # Node ID 8ed8dfbeabb9d05c16813dece81f8d7160c8a922 # Parent ab595920de0ecfaf2c8b66b5d558f1d95ca3c62c mmap: add a size argument to mmapread With this argument, we can control the size of the mmap created. (previously it was always the whole file. Differential Revision: https://phab.mercurial-scm.org/D7808 diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -415,10 +415,16 @@ class bufferedinputpipe(object): return data -def mmapread(fp): +def mmapread(fp, size=None): + if size == 0: + # size of 0 to mmap.mmap() means "all data" + # rather than "zero bytes", so special case that. + return b'' + elif size is None: + size = 0 try: fd = getattr(fp, 'fileno', lambda: fp)() - return mmap.mmap(fd, 0, access=mmap.ACCESS_READ) + return mmap.mmap(fd, size, access=mmap.ACCESS_READ) except ValueError: # Empty files cannot be mmapped, but mmapread should still work. Check # if the file is empty, and if so, return an empty buffer.