From 6ffdc2c388a93365c4ec0ee5cb37296b120b2e3c Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sun, 23 Jul 2017 07:58:02 +0300 Subject: Avoid unnecessary memory allocation * capture.c (capture_set_input): Don't allocate input sc_base. (capture_DESTROY): Reset sc_base to NULL. --- capture.c | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/capture.c b/capture.c index 67f2bcd..f22fc9f 100644 --- a/capture.c +++ b/capture.c @@ -165,22 +165,28 @@ capture_new(SV *program, ARGV argv, unsigned timeout, SV *cb[2], SV *input) void capture_DESTROY(struct capture *cp) { - free_argv(cp); - runcap_free(&cp->rc); - - free(cp->closure[0].str); - if (cp->program != &PL_sv_undef) SvREFCNT_dec(cp->program); - if (cp->input != &PL_sv_undef) + + if (cp->input != &PL_sv_undef) { SvREFCNT_dec(cp->input); + /* Make sure runcap_free won't free the input sc_base pointer + */ + cp->rc.rc_cap[RUNCAP_STDIN].sc_base = NULL; + cp->rc.rc_cap[RUNCAP_STDIN].sc_fd = -1; + } + free(cp->closure[0].str); if (cp->closure[0].cv != &PL_sv_undef) SvREFCNT_dec(cp->closure[0].cv); free(cp->closure[1].str); if (cp->closure[1].cv != &PL_sv_undef) SvREFCNT_dec(cp->closure[1].cv); + + free_argv(cp); + runcap_free(&cp->rc); + free(cp); } @@ -192,9 +198,9 @@ capture_set_input(struct capture *cp, SV *inp) if (cp->input != &PL_sv_undef) { SvREFCNT_dec(cp->input); cp->input = &PL_sv_undef; - if (cp->rc.rc_cap[0].sc_base) { - free(cp->rc.rc_cap[0].sc_base); - cp->rc.rc_cap[0].sc_base = NULL; + if (cp->rc.rc_cap[RUNCAP_STDIN].sc_base) { + free(cp->rc.rc_cap[RUNCAP_STDIN].sc_base); + cp->rc.rc_cap[RUNCAP_STDIN].sc_base = NULL; } } } @@ -204,27 +210,18 @@ capture_set_input(struct capture *cp, SV *inp) PerlIO *fh = IoIFP(sv_2io(inp)); PerlIO_flush(fh); PerlIO_rewind(fh); - cp->rc.rc_cap[0].sc_fd = PerlIO_fileno(fh); - if (cp->rc.rc_cap[0].sc_fd == -1) + cp->rc.rc_cap[RUNCAP_STDIN].sc_fd = PerlIO_fileno(fh); + if (cp->rc.rc_cap[RUNCAP_STDIN].sc_fd == -1) croak("no file descriptor associated to hanlde"); - cp->rc.rc_cap[0].sc_base = NULL; - cp->rc.rc_cap[0].sc_size = 0; + cp->rc.rc_cap[RUNCAP_STDIN].sc_base = NULL; + cp->rc.rc_cap[RUNCAP_STDIN].sc_size = 0; } else { croak("argument must be a string or file handle"); } } else { - char *s = SvPV(inp, cp->rc.rc_cap[0].sc_size); - - /* FIXME: Unnecessary allocation due to a design flow - in runcap */ - cp->rc.rc_cap[0].sc_base - = malloc(cp->rc.rc_cap[0].sc_size); - if (!cp->rc.rc_cap[0].sc_base) - croak_nomem(); - memcpy(cp->rc.rc_cap[0].sc_base, s, - cp->rc.rc_cap[0].sc_size); - - cp->rc.rc_cap[0].sc_fd = -1; + cp->rc.rc_cap[RUNCAP_STDIN].sc_base + = SvPV(inp, cp->rc.rc_cap[RUNCAP_STDIN].sc_size); + cp->rc.rc_cap[RUNCAP_STDIN].sc_fd = -1; } SvREFCNT_inc(inp); cp->input = inp; -- cgit v1.2.1