82 lines
3.2 KiB
Diff
82 lines
3.2 KiB
Diff
|
From 514ef0f93b76cbe0ba6b4de07a7b21fd0c2b7bae Mon Sep 17 00:00:00 2001
|
||
|
From: q66 <q66@chimera-linux.org>
|
||
|
Date: Thu, 6 Jun 2024 13:45:48 +0200
|
||
|
Subject: [PATCH] strbuf: use GREEDY_REALLOC to grow the buffer
|
||
|
|
||
|
This allows us to reserve a bunch of capacity ahead of time,
|
||
|
improving the performance of hwdb significantly thanks to not
|
||
|
having to reallocate so many times.
|
||
|
|
||
|
Before:
|
||
|
```
|
||
|
$ sudo time valgrind --leak-check=full ./systemd-hwdb update
|
||
|
==113297== Memcheck, a memory error detector
|
||
|
==113297== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.
|
||
|
==113297== Using Valgrind-3.23.0 and LibVEX; rerun with -h for copyright info
|
||
|
==113297== Command: ./systemd-hwdb update
|
||
|
==113297==
|
||
|
==113297==
|
||
|
==113297== HEAP SUMMARY:
|
||
|
==113297== in use at exit: 0 bytes in 0 blocks
|
||
|
==113297== total heap usage: 1,412,640 allocs, 1,412,640 frees, 117,920,009,195 bytes allocated
|
||
|
==113297==
|
||
|
==113297== All heap blocks were freed -- no leaks are possible
|
||
|
==113297==
|
||
|
==113297== For lists of detected and suppressed errors, rerun with: -s
|
||
|
==113297== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
|
||
|
132.44user 21.15system 2:35.61elapsed 98%CPU (0avgtext+0avgdata 228560maxresident)k
|
||
|
0inputs+25296outputs (0major+6886930minor)pagefaults 0swaps
|
||
|
```
|
||
|
|
||
|
After:
|
||
|
```
|
||
|
$ sudo time valgrind --leak-check=full ./systemd-hwdb update
|
||
|
==112572== Memcheck, a memory error detector
|
||
|
==112572== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.
|
||
|
==112572== Using Valgrind-3.23.0 and LibVEX; rerun with -h for copyright info
|
||
|
==112572== Command: ./systemd-hwdb update
|
||
|
==112572==
|
||
|
==112572==
|
||
|
==112572== HEAP SUMMARY:
|
||
|
==112572== in use at exit: 0 bytes in 0 blocks
|
||
|
==112572== total heap usage: 1,320,113 allocs, 1,320,113 frees, 70,614,501 bytes allocated
|
||
|
==112572==
|
||
|
==112572== All heap blocks were freed -- no leaks are possible
|
||
|
==112572==
|
||
|
==112572== For lists of detected and suppressed errors, rerun with: -s
|
||
|
==112572== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
|
||
|
21.94user 0.19system 0:22.23elapsed 99%CPU (0avgtext+0avgdata 229876maxresident)k
|
||
|
0inputs+25264outputs (0major+57275minor)pagefaults 0swaps
|
||
|
```
|
||
|
|
||
|
Co-authored-by: Yu Watanabe <watanabe.yu+github@gmail.com>
|
||
|
(cherry picked from commit 621b10fe2c3203c537996e84c7c89b0ff994ad93)
|
||
|
---
|
||
|
src/basic/strbuf.c | 5 +----
|
||
|
1 file changed, 1 insertion(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/src/basic/strbuf.c b/src/basic/strbuf.c
|
||
|
index 0617acc8d2..6d43955bb1 100644
|
||
|
--- a/src/basic/strbuf.c
|
||
|
+++ b/src/basic/strbuf.c
|
||
|
@@ -107,7 +107,6 @@ static void bubbleinsert(struct strbuf_node *node,
|
||
|
/* add string, return the index/offset into the buffer */
|
||
|
ssize_t strbuf_add_string(struct strbuf *str, const char *s, size_t len) {
|
||
|
uint8_t c;
|
||
|
- char *buf_new;
|
||
|
struct strbuf_child_entry *child;
|
||
|
struct strbuf_node *node;
|
||
|
ssize_t off;
|
||
|
@@ -147,10 +146,8 @@ ssize_t strbuf_add_string(struct strbuf *str, const char *s, size_t len) {
|
||
|
}
|
||
|
|
||
|
/* add new string */
|
||
|
- buf_new = realloc(str->buf, str->len + len+1);
|
||
|
- if (!buf_new)
|
||
|
+ if (!GREEDY_REALLOC(str->buf, str->len + len + 1))
|
||
|
return -ENOMEM;
|
||
|
- str->buf = buf_new;
|
||
|
off = str->len;
|
||
|
memcpy(str->buf + off, s, len);
|
||
|
str->len += len;
|