diff options
author | sheldonh <sheldonh@FreeBSD.org> | 2002-01-31 14:20:50 +0000 |
---|---|---|
committer | sheldonh <sheldonh@FreeBSD.org> | 2002-01-31 14:20:50 +0000 |
commit | 3102470d94db36e49a2262542f69cc4219ae1aee (patch) | |
tree | 910635e9650c97c6dde7f22bde804c2bc28e34d5 /contrib/nvi/vi/vs_line.c | |
parent | 6122421847de7afa5fb3c70ddf001fb674e4d9e3 (diff) | |
download | FreeBSD-src-3102470d94db36e49a2262542f69cc4219ae1aee.zip FreeBSD-src-3102470d94db36e49a2262542f69cc4219ae1aee.tar.gz |
Fix deadlock between warning display and refresh engines. This fix
is taken from nvi-1.51.5.
PR: bin/3170
Reported by: fenner
Obtained from: skimo@kotnet.org
MFC after: 1 month
Diffstat (limited to 'contrib/nvi/vi/vs_line.c')
-rw-r--r-- | contrib/nvi/vi/vs_line.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/contrib/nvi/vi/vs_line.c b/contrib/nvi/vi/vs_line.c index e48d5ef..2e51662 100644 --- a/contrib/nvi/vi/vs_line.c +++ b/contrib/nvi/vi/vs_line.c @@ -49,7 +49,7 @@ vs_line(sp, smp, yp, xp) size_t chlen, cno_cnt, cols_per_screen, len, nlen; size_t offset_in_char, offset_in_line, oldx, oldy; size_t scno, skip_cols, skip_screens; - int ch, dne, is_cached, is_partial, is_tab; + int ch, dne, is_cached, is_partial, is_tab, no_draw; int list_tab, list_dollar; char *p, *cbp, *ecbp, cbuf[128]; @@ -61,10 +61,11 @@ vs_line(sp, smp, yp, xp) * If ex modifies the screen after ex output is already on the screen, * don't touch it -- we'll get scrolling wrong, at best. */ + no_draw = 0; if (!F_ISSET(sp, SC_TINPUT_INFO) && VIP(sp)->totalcount > 1) - return (0); + no_draw = 1; if (F_ISSET(sp, SC_SCR_EXWROTE) && smp - HMAP != LASTLINE(sp)) - return (0); + no_draw = 1; /* * Assume that, if the cache entry for the line is filled in, the @@ -73,7 +74,7 @@ vs_line(sp, smp, yp, xp) * cursor position, we can just return. */ is_cached = SMAP_CACHE(smp); - if (yp == NULL && is_cached) + if (yp == NULL && (is_cached || no_draw)) return (0); /* @@ -158,7 +159,7 @@ vs_line(sp, smp, yp, xp) } /* If the line is on the screen, quit. */ - if (is_cached) + if (is_cached || no_draw) goto ret1; /* Set line cache information. */ @@ -325,7 +326,7 @@ display: offset_in_line + cols_per_screen < sp->cno) { cno_cnt = 0; /* If the line is on the screen, quit. */ - if (is_cached) + if (is_cached || no_draw) goto ret1; } else cno_cnt = (sp->cno - offset_in_line) + 1; @@ -389,12 +390,12 @@ display: *xp += O_NUMBER_LENGTH; /* If the line is on the screen, quit. */ - if (is_cached) + if (is_cached || no_draw) goto ret1; } /* If the line is on the screen, don't display anything. */ - if (is_cached) + if (is_cached || no_draw) continue; #define FLUSH { \ |