diff options
author | Oleg Tolmatcev <oleg.tolmatcev@gmail.com> | 2023-05-03 16:23:13 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2023-05-03 16:23:13 +0100 |
commit | a2243c30bc13c9adce71d70eeb5e97b7846b48f3 (patch) | |
tree | 77273f76536b72de7ffa6007b2ed7736d0a731f6 /bfd/archive.c | |
parent | 9b0ccb1ebaef7474d4f7242f778531ef042a55fc (diff) | |
download | gdb-a2243c30bc13c9adce71d70eeb5e97b7846b48f3.zip gdb-a2243c30bc13c9adce71d70eeb5e97b7846b48f3.tar.gz gdb-a2243c30bc13c9adce71d70eeb5e97b7846b48f3.tar.bz2 |
Make ar faster
* archive.c (_bfd_write_archive_contents): Use a larger buffer in order to improve efficiency.
Diffstat (limited to 'bfd/archive.c')
-rw-r--r-- | bfd/archive.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/bfd/archive.c b/bfd/archive.c index 273a1b3..f6cae7a 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -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; } |