Tomas Volf wrote 2 weeks ago
(address . bug-guile@gnu.org)(address . ludo@gnu.org)(name . Tomas Volf)(address . ~@wolfsden.cz)
Use scm_sendfile instead of read-write loop. This moves the work into
the kernel, improving performance. This implements Ludovic's suggestion
from bug 68504.
* libguile/filesys.c (scm_copy_file2): Use scm_sendfile.
---
libguile/filesys.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
Toggle diff (41 lines)
diff --git a/libguile/filesys.c b/libguile/filesys.c
index 3bfa5eb91..8a05f066f 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -1,7 +1,7 @@
/* Copyright 1996-2002,2004,2006,2009-2019,2021
Free Software Foundation, Inc.
Copyright 2021 Maxime Devos <maximedevos@telenet.be>
- Copyright 2024 Tomas Volf <~@wolfsden.cz>
+ Copyright 2024, 2025 Tomas Volf <~@wolfsden.cz>
This file is part of Guile.
@@ -1354,13 +1354,18 @@ SCM_DEFINE (scm_copy_file2, "copy-file", 2, 0, 1,
scm_syserror ("copy-file: copy-on-write failed");
if (clone_res)
- while ((n = read (oldfd, buf, sizeof buf)) > 0)
- if (write (newfd, buf, n) != n)
- {
- close (oldfd);
- close (newfd);
- SCM_SYSERROR;
- }
+ {
+ off_t end;
+ if ((end = lseek_or_lseek64 (oldfd, 0, SEEK_END)) < 0)
+ SCM_SYSERROR;
+ if (lseek_or_lseek64 (oldfd, 0, SEEK_SET) < 0)
+ SCM_SYSERROR;
+
+ scm_sendfile (scm_from_int (newfd),
+ scm_from_int (oldfd),
+ scm_from_off_t (end),
+ SCM_UNDEFINED);
+ }
close (oldfd);
if (close (newfd) == -1)
SCM_SYSERROR;
--
2.48.1