Make ar faster
authorOleg Tolmatcev <oleg.tolmatcev@gmail.com>
Wed, 3 May 2023 15:23:13 +0000 (16:23 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 3 May 2023 15:23:13 +0000 (16:23 +0100)
 * archive.c (_bfd_write_archive_contents): Use a larger buffer in order to improve efficiency.

bfd/ChangeLog
bfd/archive.c

index 61a488c348bc6f9c496dd51c67465aa12ae9ea18..013386d60079187365f0b49b69c1d7d056620dfd 100644 (file)
@@ -1,3 +1,8 @@
+2023-05-03  Oleg Tolmatcev  <oleg.tolmatcev@gmail.com>
+
+       * archive.c (_bfd_write_archive_contents): Use a larger buffer in
+       order to improve efficiency.
+
 2023-05-03  Oleg Tolmatcev  <oleg.tolmatcev@gmail.com>
 
        * coffcode.h (coff_read_word_from_buffer): New function.
index 273a1b3b2419614d2b6a32bb230b59b377cf209c..f6cae7a5b1b08b8cf5a8ae9c92d48b39e4d49519 100644 (file)
@@ -2142,6 +2142,7 @@ _bfd_write_archive_contents (bfd *arch)
   bfd_size_type wrote;
   int tries;
   char *armag;
+  char *buffer = NULL;
 
   /* Verify the viability of all entries; if any of them live in the
      filesystem (as opposed to living in an archive open for input)
@@ -2222,16 +2223,23 @@ _bfd_write_archive_contents (bfd *arch)
        }
     }
 
+#define AR_WRITE_BUFFERSIZE (DEFAULT_BUFFERSIZE * 1024)
+
+  /* FIXME: Find a way to test link_info.reduce_memory_overheads
+     and change the buffer size.  */
+  buffer = bfd_malloc (AR_WRITE_BUFFERSIZE);
+  if (buffer == NULL)
+    goto input_err;
+
   for (current = arch->archive_head;
        current != NULL;
        current = current->archive_next)
     {
-      char buffer[DEFAULT_BUFFERSIZE];
       bfd_size_type remaining = arelt_size (current);
 
       /* Write ar header.  */
       if (!_bfd_write_ar_hdr (arch, current))
-       return false;
+       goto input_err;
       if (bfd_is_thin_archive (arch))
        continue;
       if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
@@ -2239,7 +2247,7 @@ _bfd_write_archive_contents (bfd *arch)
 
       while (remaining)
        {
-         size_t amt = DEFAULT_BUFFERSIZE;
+         size_t amt = AR_WRITE_BUFFERSIZE;
 
          if (amt > remaining)
            amt = remaining;
@@ -2247,17 +2255,19 @@ _bfd_write_archive_contents (bfd *arch)
          if (bfd_bread (buffer, amt, current) != amt)
            goto input_err;
          if (bfd_bwrite (buffer, amt, arch) != amt)
-           return false;
+           goto input_err;
          remaining -= amt;
        }
 
       if ((arelt_size (current) % 2) == 1)
        {
          if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
-           return false;
+           goto input_err;
        }
     }
 
+  free (buffer);
+
   if (makemap && hasobjects)
     {
       /* Verify the timestamp in the archive file.  If it would not be
@@ -2281,6 +2291,7 @@ _bfd_write_archive_contents (bfd *arch)
 
  input_err:
   bfd_set_input_error (current, bfd_get_error ());
+  free (buffer);
   return false;
 }
 \f