From: "Jun T." <takimoto-j@kba.biglobe.ne.jp>
To: zsh-workers@zsh.org
Subject: Re: [PATCH] fix several memory leaks
Date: Tue, 31 Jul 2018 23:30:33 +0900 [thread overview]
Message-ID: <C23A8FC6-D155-4AFB-8209-B819AF0CAB94@kba.biglobe.ne.jp> (raw)
In-Reply-To: <825056567.96193.1532958460017@mail2.virginmedia.com>
> 2018/07/30 22:47, Peter Stephenson <p.w.stephenson@ntlworld.com> wrote:
>
> If setupterm(), over which we have no control, is really a problem we probably
> need a front-end with a lock to make sure it only ever gets called once.
>
> Something like a function in utils.c which as the #ifdef buried in it
> and simply does nothing if we don't HAVE_SETUPTERM, for example?
Ok, it seems we need a reference count of cur_term.
How about this?
diff --git a/Src/Modules/termcap.c b/Src/Modules/termcap.c
index 60a6e138a..af4009a3a 100644
--- a/Src/Modules/termcap.c
+++ b/Src/Modules/termcap.c
@@ -345,16 +345,7 @@ int
boot_(UNUSED(Module m))
{
#ifdef HAVE_TGETENT
-# ifdef HAVE_SETUPTERM
- int errret;
-
- /*
- * Just because we can't set up the terminal doesn't
- * mean the modules hasn't booted---TERM may change,
- * and it should be handled dynamically---so ignore errors here.
- */
- (void)setupterm((char *)0, 1, &errret);
-# endif
+ zsetupterm();
#endif
return 0;
}
@@ -363,6 +354,9 @@ boot_(UNUSED(Module m))
int
cleanup_(Module m)
{
+#ifdef HAVE_TGETENT
+ zdeleteterm();
+#endif
return setfeatureenables(m, &module_features, NULL);
}
diff --git a/Src/Modules/terminfo.c b/Src/Modules/terminfo.c
index bbd325899..4596b41d2 100644
--- a/Src/Modules/terminfo.c
+++ b/Src/Modules/terminfo.c
@@ -338,16 +338,7 @@ int
boot_(UNUSED(Module m))
{
#ifdef USE_TERMINFO_MODULE
-# ifdef HAVE_SETUPTERM
- int errret;
-
- /*
- * Just because we can't set up the terminal doesn't
- * mean the modules hasn't booted---TERM may change,
- * and it should be handled dynamically---so ignore errors here.
- */
- (void)setupterm((char *)0, 1, &errret);
-# endif
+ zsetupterm();
#endif
return 0;
@@ -357,6 +348,9 @@ boot_(UNUSED(Module m))
int
cleanup_(Module m)
{
+#ifdef USE_TERMINFO_MODULE
+ zdeleteterm();
+#endif
return setfeatureenables(m, &module_features, NULL);
}
diff --git a/Src/utils.c b/Src/utils.c
index ee2ad207f..075d27241 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -375,6 +375,43 @@ zerrmsg(FILE *file, const char *fmt, va_list ap)
fflush(file);
}
+/*
+ * Wrapper for setupterm() and del_curterm().
+ * These are called from terminfo.c and termcap.c.
+ */
+static int term_count; /* reference count of cur_term */
+
+/**/
+mod_export void
+zsetupterm(void)
+{
+#ifdef HAVE_SETUPTERM
+ int errret;
+
+ DPUTS(term_count < 0 || (term_count > 0 && !cur_term),
+ "inconsistent term_count and/or cur_term");
+ /*
+ * Just because we can't set up the terminal doesn't
+ * mean the modules hasn't booted---TERM may change,
+ * and it should be handled dynamically---so ignore errors here.
+ */
+ if (term_count++ == 0)
+ (void)setupterm((char *)0, 1, &errret);
+#endif
+}
+
+/**/
+mod_export void
+zdeleteterm(void)
+{
+#ifdef HAVE_SETUPTERM
+ DPUTS(term_count < 1 || !cur_term,
+ "inconsistent term_count and/or cur_term");
+ if (--term_count == 0)
+ del_curterm(cur_term);
+#endif
+}
+
/* Output a single character, for the termcap routines. *
* This is used instead of putchar since it can be a macro. */
next prev parent reply other threads:[~2018-07-31 14:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-28 16:34 Jun T.
2018-07-28 17:20 ` Jun T.
2018-07-28 18:57 ` Bart Schaefer
2018-08-01 11:14 ` Jun T
2018-07-30 13:47 ` Peter Stephenson
2018-07-31 14:30 ` Jun T. [this message]
2018-07-31 14:41 ` Peter Stephenson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=C23A8FC6-D155-4AFB-8209-B819AF0CAB94@kba.biglobe.ne.jp \
--to=takimoto-j@kba.biglobe.ne.jp \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).