diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-23 07:58:02 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-23 07:58:02 +0300 |
commit | 6ffdc2c388a93365c4ec0ee5cb37296b120b2e3c (patch) | |
tree | 72d0b8c08f9d8d2642d08b56cacfa6ff5f12fc33 | |
parent | 7f5cbd2332df055d8b9e365974f8743f82ad4886 (diff) | |
download | posixruncapture-6ffdc2c388a93365c4ec0ee5cb37296b120b2e3c.tar.gz posixruncapture-6ffdc2c388a93365c4ec0ee5cb37296b120b2e3c.tar.bz2 |
Avoid unnecessary memory allocation
* capture.c (capture_set_input): Don't allocate input sc_base.
(capture_DESTROY): Reset sc_base to NULL.
-rw-r--r-- | capture.c | 47 |
1 files changed, 22 insertions, 25 deletions
@@ -162,72 +162,69 @@ capture_new(SV *program, ARGV argv, unsigned timeout, SV *cb[2], SV *input) return cp; } 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); } void capture_set_input(struct capture *cp, SV *inp) { if (cp->flags & RCF_STDIN) { cp->flags &= ~RCF_STDIN; 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; } } } if (inp != &PL_sv_undef) { if (SvROK(inp)) { if (SvTYPE(SvRV(inp)) == SVt_PVGV) { 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; cp->flags |= RCF_STDIN; } } |