copyFile with POSIX_FADV_SEQUENTIAL (#22776)

- Continuation of https://github.com/nim-lang/Nim/pull/22769
- See
https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_fadvise.html
- The code was already there in `std/posix` since years ago. 3 line
diff.

---------

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
Juan Carlos
2023-10-01 02:19:37 -03:00
committed by GitHub
parent c3b95cbd2c
commit b60f15e0dc
2 changed files with 9 additions and 0 deletions

View File

@@ -9,6 +9,7 @@
[//]: # "Changes:"
- Changed `std/osfiles.copyFile` to allow to specify `bufferSize` instead of a hardcoded one.
- Changed `std/osfiles.copyFile` to use `POSIX_FADV_SEQUENTIAL` hints for kernel-level aggressive sequential read-aheads.
[//]: # "Additions:"

View File

@@ -203,6 +203,7 @@ proc copyFile*(source, dest: string, options = {cfSymlinkFollow}; bufferSize = 1
## `-d:nimLegacyCopyFile` is used.
##
## `copyFile` allows to specify `bufferSize` to improve I/O performance.
##
## See also:
## * `CopyFlag enum`_
## * `copyDir proc`_
@@ -243,6 +244,13 @@ proc copyFile*(source, dest: string, options = {cfSymlinkFollow}; bufferSize = 1
if not open(d, dest, fmWrite):
close(s)
raiseOSError(osLastError(), dest)
# Hints for kernel-level aggressive sequential low-fragmentation read-aheads:
# https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_fadvise.html
when defined(linux) or defined(osx):
discard posix_fadvise(getFileHandle(d), 0.cint, 0.cint, POSIX_FADV_SEQUENTIAL)
discard posix_fadvise(getFileHandle(s), 0.cint, 0.cint, POSIX_FADV_SEQUENTIAL)
var buf = alloc(bufferSize)
while true:
var bytesread = readBuffer(s, buf, bufferSize)