diff options
author | Bryan Steele <brynet@cvs.openbsd.org> | 2015-04-10 18:05:52 +0000 |
---|---|---|
committer | Bryan Steele <brynet@cvs.openbsd.org> | 2015-04-10 18:05:52 +0000 |
commit | 6a618e2b3faef8f8927350a32726c8b86b0ee4b7 (patch) | |
tree | bed7fb94d09db98d2d253b7cd7a4384ae47238ab | |
parent | 1b26d55b720c4d36560a76c81aa9a37c130278fb (diff) |
This changes vi to use resizeterm(3) instead of reinitializing curses on
window resizes, which was leaking massive amounts of memory.
Try observing vi in top(1) and while resizing the window a few times
before and aftering applying this diff..
Also some more comment cleanup and another memory leak..
From github.com/lichray/nvi2
879d2ad6dd4a4343eb0a588ebfe637e1c9845bc4
a8c38480adb030a05bbb2aafec6067dd65d8c2eb
ok millert@
-rw-r--r-- | usr.bin/vi/cl/cl_screen.c | 25 | ||||
-rw-r--r-- | usr.bin/vi/cl/cl_term.c | 11 |
2 files changed, 19 insertions, 17 deletions
diff --git a/usr.bin/vi/cl/cl_screen.c b/usr.bin/vi/cl/cl_screen.c index f5ee598fe59..6fafff1f849 100644 --- a/usr.bin/vi/cl/cl_screen.c +++ b/usr.bin/vi/cl/cl_screen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cl_screen.c,v 1.22 2014/11/12 16:29:04 millert Exp $ */ +/* $OpenBSD: cl_screen.c,v 1.23 2015/04/10 18:05:51 brynet Exp $ */ /*- * Copyright (c) 1993, 1994 @@ -52,7 +52,9 @@ cl_screen(SCR *sp, u_int32_t flags) /* See if the current information is incorrect. */ if (F_ISSET(gp, G_SRESTART)) { - if (cl_quit(gp)) + if ((!F_ISSET(sp, SC_SCR_EX | SC_SCR_VI) || + resizeterm(O_VAL(sp, O_LINES), O_VAL(sp, O_COLUMNS))) && + cl_quit(gp)) return (1); F_CLR(gp, G_SRESTART); } @@ -222,18 +224,14 @@ cl_vi_init(SCR *sp) cl_putenv("COLUMNS", NULL, (u_long)O_VAL(sp, O_COLUMNS)); /* + * The terminal is aways initialized, either in `main`, or by a + * previous call to newterm(3). + */ + (void)del_curterm(cur_term); + + /* * We don't care about the SCREEN reference returned by newterm, we * never have more than one SCREEN at a time. - * - * XXX - * The SunOS initscr() can't be called twice. Don't even think about - * using it. It fails in subtle ways (e.g. select(2) on fileno(stdin) - * stops working). (The SVID notes that applications should only call - * initscr() once.) - * - * XXX - * The HP/UX newterm doesn't support the NULL first argument, so we - * have to specify the terminal type. */ errno = 0; if (newterm(ttype, stdout, stdin) == NULL) { @@ -395,6 +393,9 @@ cl_vi_end(GS *gp) /* End curses window. */ (void)endwin(); + /* Free the SCREEN created by newterm(3). */ + delscreen(set_term(NULL)); + /* * XXX * The screen TE sequence just got sent. See the comment in diff --git a/usr.bin/vi/cl/cl_term.c b/usr.bin/vi/cl/cl_term.c index 8c194373d75..ea5a8bd7d82 100644 --- a/usr.bin/vi/cl/cl_term.c +++ b/usr.bin/vi/cl/cl_term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cl_term.c,v 1.19 2014/11/12 16:29:04 millert Exp $ */ +/* $OpenBSD: cl_term.c,v 1.20 2015/04/10 18:05:51 brynet Exp $ */ /*- * Copyright (c) 1993, 1994 @@ -227,15 +227,16 @@ cl_optchange(SCR *sp, int opt, char *str, u_long *valp) clp = CLP(sp); switch (opt) { + case O_TERM: + F_CLR(sp, SC_SCR_EX | SC_SCR_VI); + /* FALLTHROUGH */ case O_COLUMNS: case O_LINES: - case O_TERM: /* - * Changing the columns, lines or terminal require that - * we restart the screen. + * Changing the terminal type requires that we reinitialize + * curses, while resizing does not. */ F_SET(sp->gp, G_SRESTART); - F_CLR(sp, SC_SCR_EX | SC_SCR_VI); break; case O_MESG: (void)cl_omesg(sp, clp, !*valp); |