On Tue, Feb 23, 2016 at 05:21:02PM +0100, Nahim El Atmani wrote:
> * strace.c: add create_tcbtab() that allocate the minimum required amount of
> memory to create the tcbtab. Add a tcbtab existance check in expand_tcbtab()
> that will be called by alloctcb() when no tcb are available (first call and
> subsequent calls when tcbtab is full). Remove the always done at first tcbtab
> allocation in init(), now replaced by create_tcbtab() and called when needed.
> 
> Signed-off-by: Nahim El Atmani <[email protected]>
> Reviewed-By: Gabriel Laskar <[email protected]>
> Reported-by: haris iqbal <[email protected]>
> ---
>  strace.c | 35 ++++++++++++++++++++++-------------
>  1 file changed, 22 insertions(+), 13 deletions(-)
> 
> diff --git a/strace.c b/strace.c
> index 785cc60..d18aa7e 100644
> --- a/strace.c
> +++ b/strace.c
> @@ -689,6 +689,18 @@ newoutf(struct tcb *tcp)
>  }
>  
>  static void
> +create_tcbtab(void)
> +{
> +     struct tcb *tcp;
> +
> +     /* Allocate the initial tcbtab.  */
> +     tcbtabsize = 1; /* We don't need much more at first */
> +     tcbtab = xcalloc(tcbtabsize, sizeof(tcbtab[0]));
> +     tcp = xcalloc(tcbtabsize, sizeof(*tcp));
> +     tcbtab[0] = tcp;
> +}
> +
> +static void
>  expand_tcbtab(void)
>  {
>       /* Allocate some more TCBs and expand the table.
> @@ -696,10 +708,16 @@ expand_tcbtab(void)
>          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]));
> +     unsigned int i;
> +     struct tcb *newtcbs;
> +     struct tcb **newtab;
> +
> +     if (!tcbtabsize)
> +             create_tcbtab();
> +
> +     i = tcbtabsize;
> +     newtcbs = xcalloc(tcbtabsize, sizeof(newtcbs[0]));
> +     newtab = xreallocarray(tcbtab, tcbtabsize * 2, sizeof(tcbtab[0]));

This means that the first expand_tcbtab() would end up with two calloc
calls (via create_tcbtab) immediately followed by calloc and realloc.
I think we could do better than this.


-- 
ldv

Attachment: pgpBpbFHwYVhy.pgp
Description: PGP signature

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Strace-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to