summaryrefslogtreecommitdiff
path: root/Src/exec.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2002-06-07 14:44:21 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2002-06-07 14:44:21 +0000
commit0e08b8c2e485c355acc4818c1b04a81bc7e150be (patch)
tree56936dedd0aa214d20a2909c7ea88db6737e1438 /Src/exec.c
parent37199039b2666815e42072ba934001fadb53b183 (diff)
downloadzsh-0e08b8c2e485c355acc4818c1b04a81bc7e150be.tar.gz
zsh-0e08b8c2e485c355acc4818c1b04a81bc7e150be.zip
17299: Use reference counts in Eprogs so as to be able to free them as soon
as finished with.
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/Src/exec.c b/Src/exec.c
index 4888c9fb8..04a141679 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -725,8 +725,11 @@ execode(Eprog p, int dont_change_job, int exiting)
s.prog = p;
s.pc = p->prog;
s.strs = p->strs;
+ useeprog(p); /* Mark as in use */
execlist(&s, dont_change_job, exiting);
+
+ freeeprog(p); /* Free if now unused */
}
/* Execute a simplified command. This is used to execute things that
@@ -3134,6 +3137,7 @@ execfuncdef(Estate state, int do_exec)
while ((s = (char *) ugetnode(names))) {
prog = (Eprog) zalloc(sizeof(*prog));
prog->npats = npats;
+ prog->nref = 1; /* allocated from permanent storage */
prog->len = len;
if (state->prog->dump) {
prog->flags = EF_MAP;