483 # rather than "zero bytes", so special case that. |
483 # rather than "zero bytes", so special case that. |
484 return b'' |
484 return b'' |
485 elif size is None: |
485 elif size is None: |
486 size = 0 |
486 size = 0 |
487 fd = getattr(fp, 'fileno', lambda: fp)() |
487 fd = getattr(fp, 'fileno', lambda: fp)() |
488 flags = mmap.MAP_PRIVATE |
488 |
489 bg_populate = hasattr(osutil, "background_mmap_populate") |
489 if pycompat.iswindows: |
490 if pre_populate and not bg_populate: |
490 _mmap = lambda fd, size: mmap.mmap(fd, size, access=mmap.ACCESS_READ) |
491 flags |= getattr(mmap, 'MAP_POPULATE', 0) |
491 else: |
|
492 flags = mmap.MAP_PRIVATE |
|
493 bg_populate = hasattr(osutil, "background_mmap_populate") |
|
494 |
|
495 if pre_populate and not bg_populate: |
|
496 flags |= getattr(mmap, 'MAP_POPULATE', 0) |
|
497 |
|
498 def _mmap(fd, size) -> mmap.mmap: |
|
499 m = mmap.mmap(fd, size, flags=flags, prot=mmap.PROT_READ) |
|
500 if pre_populate and bg_populate: |
|
501 osutil.background_mmap_populate(m) |
|
502 return m |
|
503 |
492 try: |
504 try: |
493 m = mmap.mmap(fd, size, flags=flags, prot=mmap.PROT_READ) |
505 return _mmap(fd, size) |
494 if pre_populate and bg_populate: |
|
495 osutil.background_mmap_populate(m) |
|
496 return m |
|
497 except ValueError: |
506 except ValueError: |
498 # Empty files cannot be mmapped, but mmapread should still work. Check |
507 # Empty files cannot be mmapped, but mmapread should still work. Check |
499 # if the file is empty, and if so, return an empty buffer. |
508 # if the file is empty, and if so, return an empty buffer. |
500 if os.fstat(fd).st_size == 0: |
509 if os.fstat(fd).st_size == 0: |
501 return b'' |
510 return b'' |