GNU bug report logs - #76623
[PATCH] filesys.c: Use scm_sendfile to copy files.

Previous Next

Package: guile;

Reported by: Tomas Volf <~@wolfsden.cz>

Date: Fri, 28 Feb 2025 01:11:03 UTC

Severity: normal

Tags: patch

Done: Rob Browning <rlb <at> defaultvalue.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Tomas Volf <~@wolfsden.cz>
To: 76623 <at> debbugs.gnu.org
Cc: ludo <at> gnu.org, Tomas Volf <~@wolfsden.cz>
Subject: bug#76623: [PATCH] filesys.c: Use scm_sendfile to copy files.
Date: Fri, 28 Feb 2025 02:10:18 +0100
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





This bug report was last modified 56 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.