Reduce memory usage while managing tcbs allocation.

* strace.c (init):  Remove initial memory allocation for tcbtab.
(expand_tcbtab): Do initial memory allocation when tcbtabsize == 0.

Signed-off-by: Nahim El Atmani <nahim+dev@naam.me>
Reviewed-By: Gabriel Laskar <gabriel@lse.epita.fr>
Reported-by: haris iqbal <haris.phnx@gmail.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
This commit is contained in:
Nahim El Atmani 2016-03-05 13:35:57 +01:00 committed by Dmitry V. Levin
parent eee3476844
commit c811fa6115

View File

@ -691,19 +691,25 @@ newoutf(struct tcb *tcp)
static void
expand_tcbtab(void)
{
/* Allocate some more TCBs and expand the table.
/* Allocate some (more) TCBs (and expand the table).
We don't want to relocate the TCBs because our
callers have pointers and it would be a pain.
So tcbtab is a table of pointers. Since we never
free the TCBs, we allocate a single chunk of many. */
unsigned int i = tcbtabsize;
struct tcb *newtcbs = xcalloc(tcbtabsize, sizeof(newtcbs[0]));
struct tcb **newtab = xreallocarray(tcbtab, tcbtabsize * 2,
sizeof(tcbtab[0]));
tcbtabsize *= 2;
tcbtab = newtab;
while (i < tcbtabsize)
tcbtab[i++] = newtcbs++;
unsigned int new_tcbtabsize, alloc_tcbtabsize;
struct tcb *newtcbs;
if (tcbtabsize) {
alloc_tcbtabsize = tcbtabsize;
new_tcbtabsize = tcbtabsize * 2;
} else {
new_tcbtabsize = alloc_tcbtabsize = 1;
}
newtcbs = xcalloc(alloc_tcbtabsize, sizeof(newtcbs[0]));
tcbtab = xreallocarray(tcbtab, new_tcbtabsize, sizeof(tcbtab[0]));
while (tcbtabsize < new_tcbtabsize)
tcbtab[tcbtabsize++] = newtcbs++;
}
static struct tcb *
@ -1484,10 +1490,8 @@ get_os_release(void)
static void ATTRIBUTE_NOINLINE
init(int argc, char *argv[])
{
struct tcb *tcp;
int c, i;
int optF = 0;
unsigned int tcbi;
struct sigaction sa;
progname = argv[0] ? argv[0] : "strace";
@ -1503,13 +1507,6 @@ init(int argc, char *argv[])
os_release = get_os_release();
/* Allocate the initial tcbtab. */
tcbtabsize = argc; /* Surely enough for all -p args. */
tcbtab = xcalloc(tcbtabsize, sizeof(tcbtab[0]));
tcp = xcalloc(tcbtabsize, sizeof(*tcp));
for (tcbi = 0; tcbi < tcbtabsize; tcbi++)
tcbtab[tcbi] = tcp++;
shared_log = stderr;
set_sortby(DEFAULT_SORTBY);
set_personality(DEFAULT_PERSONALITY);