GNU bug report logs -
#76623
[PATCH] filesys.c: Use scm_sendfile to copy files.
Previous Next
To reply to this bug, email your comments to 76623 AT debbugs.gnu.org.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-guile <at> gnu.org
:
bug#76623
; Package
guile
.
(Fri, 28 Feb 2025 01:11:04 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Tomas Volf <~@wolfsden.cz>
:
New bug report received and forwarded. Copy sent to
bug-guile <at> gnu.org
.
(Fri, 28 Feb 2025 01:11:04 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
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(-)
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 <at> 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
Information forwarded
to
bug-guile <at> gnu.org
:
bug#76623
; Package
guile
.
(Fri, 28 Feb 2025 20:12:01 GMT)
Full text and
rfc822 format available.
Message #8 received at 76623 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Hi,
Tomas Volf <~@wolfsden.cz> skribis:
> 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.
Nice! I had to apply the changes below to appease GCC.
The patch LGTM but I realize there’s no real ‘copy-file’ test. Not your
fault but would you mind adding one or two tests?
Thanks,
Ludo’.
[Message part 2 (text/x-patch, inline)]
diff --git a/libguile/filesys.c b/libguile/filesys.c
index 00171dade..4f861ab35 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -1306,10 +1306,9 @@ SCM_DEFINE (scm_copy_file2, "copy-file", 2, 0, 1,
{
char *c_oldfile, *c_newfile;
int oldfd, newfd;
- int n, rv;
+ int rv;
SCM cow = sym_auto;
int clone_res;
- char buf[BUFSIZ];
struct stat_or_stat64 oldstat;
scm_dynwind_begin (0);
This bug report was last modified 3 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.