Reduce bss usage and speed up string printing
text data bss dec hex filename 237913 660 49284 287857 46471 strace.before 237973 660 28772 267405 4148d strace This reduces L1 D-cache pressure a bit: instead of dirtying 20k of bss, we will reuse already dirty stack area. * util.c (printpathn): Use on-stack buffers instead of static ones. Saves 5*MAXPATHLEN in bss. (printstr): Use tprints() instead of tprintf("%s") when printing formatted string. May be a bit faster, depending on libc. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
7d55801ae9
commit
b3c52cf02a
35
util.c
35
util.c
@ -427,8 +427,6 @@ printuid(const char *text, unsigned long uid)
|
||||
tprintf((uid == -1) ? "%s%ld" : "%s%lu", text, uid);
|
||||
}
|
||||
|
||||
static char path[MAXPATHLEN + 1];
|
||||
|
||||
/*
|
||||
* Quote string `instr' of length `size'
|
||||
* Write up to (3 + `size' * 4) bytes to `outstr' buffer.
|
||||
@ -566,6 +564,8 @@ string_quote(const char *instr, char *outstr, int len, int size)
|
||||
void
|
||||
printpathn(struct tcb *tcp, long addr, int n)
|
||||
{
|
||||
char path[MAXPATHLEN + 1];
|
||||
|
||||
if (!addr) {
|
||||
tprints("NULL");
|
||||
return;
|
||||
@ -581,24 +581,25 @@ printpathn(struct tcb *tcp, long addr, int n)
|
||||
if (umovestr(tcp, addr, n + 1, path) < 0)
|
||||
tprintf("%#lx", addr);
|
||||
else {
|
||||
static char outstr[4*(sizeof path - 1) + sizeof "\"...\""];
|
||||
const char *fmt;
|
||||
char *outstr;
|
||||
int trunc = (path[n] != '\0');
|
||||
|
||||
if (trunc)
|
||||
path[n] = '\0';
|
||||
string_quote(path, outstr, -1, n + 1);
|
||||
fmt = "%s";
|
||||
n++;
|
||||
outstr = alloca(4 * n); /* 4*(n-1) + 2 for quotes */
|
||||
string_quote(path, outstr, -1, n);
|
||||
tprints(outstr);
|
||||
if (trunc)
|
||||
fmt = "%s...";
|
||||
tprintf(fmt, outstr);
|
||||
tprints("...");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
printpath(struct tcb *tcp, long addr)
|
||||
{
|
||||
printpathn(tcp, addr, sizeof path - 1);
|
||||
/* Size must correspond to char path[] size in printpathn */
|
||||
printpathn(tcp, addr, MAXPATHLEN);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -612,7 +613,7 @@ printstr(struct tcb *tcp, long addr, int len)
|
||||
static char *str = NULL;
|
||||
static char *outstr;
|
||||
int size;
|
||||
const char *fmt;
|
||||
int ellipsis;
|
||||
|
||||
if (!addr) {
|
||||
tprints("NULL");
|
||||
@ -623,9 +624,7 @@ printstr(struct tcb *tcp, long addr, int len)
|
||||
str = malloc(max_strlen + 1);
|
||||
if (!str)
|
||||
die_out_of_memory();
|
||||
}
|
||||
if (!outstr) {
|
||||
outstr = malloc(4 * max_strlen + sizeof "\"...\"");
|
||||
outstr = malloc(4 * max_strlen + /*for quotes:*/ 2);
|
||||
if (!outstr)
|
||||
die_out_of_memory();
|
||||
}
|
||||
@ -651,12 +650,12 @@ printstr(struct tcb *tcp, long addr, int len)
|
||||
}
|
||||
}
|
||||
|
||||
fmt = "%s";
|
||||
if (string_quote(str, outstr, len, size) &&
|
||||
(len < 0 || len > max_strlen))
|
||||
fmt = "%s...";
|
||||
ellipsis = (string_quote(str, outstr, len, size) &&
|
||||
(len < 0 || len > max_strlen));
|
||||
|
||||
tprintf(fmt, outstr);
|
||||
tprints(outstr);
|
||||
if (ellipsis)
|
||||
tprints("...");
|
||||
}
|
||||
|
||||
#if HAVE_SYS_UIO_H
|
||||
|
Loading…
Reference in New Issue
Block a user