aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarl Heuer1995-06-11 20:14:36 +0000
committerKarl Heuer1995-06-11 20:14:36 +0000
commitd1dad7597ccd82b869cddd28907b82e8c900a9c2 (patch)
treec80f8b73a1801465a69989aac802161ae8aa0d18 /src
parent0a2ea2219a1266af808fb75999267a5d59c13353 (diff)
downloademacs-d1dad7597ccd82b869cddd28907b82e8c900a9c2.tar.gz
emacs-d1dad7597ccd82b869cddd28907b82e8c900a9c2.zip
(Fframe_or_buffer_changed_p): Calculate vector size right.
Add hysteresis when making it larger. Fill it up reliably and check at the end for overflowing it. (syms_of_display): Make frame_and_buffer_state initially with 20 elts.
Diffstat (limited to 'src')
-rw-r--r--src/dispnew.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/dispnew.c b/src/dispnew.c
index a1240cb7c6b..a09d9273e61 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -1953,13 +1953,14 @@ the current state.\n")
1953 /* Start with 1 so there is room for at least one lambda at the end. */ 1953 /* Start with 1 so there is room for at least one lambda at the end. */
1954 n = 1; 1954 n = 1;
1955 FOR_EACH_FRAME (tail, frame) 1955 FOR_EACH_FRAME (tail, frame)
1956 n++; 1956 n += 2;
1957 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr) 1957 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr)
1958 n += 3; 1958 n += 3;
1959 /* Reallocate the vector if it's grown, or if it's shrunk a lot. */ 1959 /* Reallocate the vector if it's grown, or if it's shrunk a lot. */
1960 if (n > XVECTOR (frame_and_buffer_state)->size 1960 if (n > XVECTOR (frame_and_buffer_state)->size
1961 || n < XVECTOR (frame_and_buffer_state)->size / 2) 1961 || n + 20 < XVECTOR (frame_and_buffer_state)->size / 2)
1962 frame_and_buffer_state = Fmake_vector (make_number (n), Qlambda); 1962 /* Add 20 extra so we grow it less often. */
1963 frame_and_buffer_state = Fmake_vector (make_number (n + 20), Qlambda);
1963 vecp = XVECTOR (frame_and_buffer_state)->contents; 1964 vecp = XVECTOR (frame_and_buffer_state)->contents;
1964 FOR_EACH_FRAME (tail, frame) 1965 FOR_EACH_FRAME (tail, frame)
1965 { 1966 {
@@ -1976,9 +1977,15 @@ the current state.\n")
1976 *vecp++ = XBUFFER (buf)->read_only; 1977 *vecp++ = XBUFFER (buf)->read_only;
1977 *vecp++ = Fbuffer_modified_p (buf); 1978 *vecp++ = Fbuffer_modified_p (buf);
1978 } 1979 }
1979 /* If we left any slack in the vector, fill it up now. */ 1980 /* Fill up the vector with lambdas (always at least one). */
1980 for (; n < XVECTOR (frame_and_buffer_state)->size; ++n) 1981 *vecp++ = Qlambda;
1982 while (vecp - XVECTOR (frame_and_buffer_state)->contents
1983 < XVECTOR (frame_and_buffer_state)->size)
1981 *vecp++ = Qlambda; 1984 *vecp++ = Qlambda;
1985 /* Make sure we didn't overflow the vector. */
1986 if (vecp - XVECTOR (frame_and_buffer_state)->contents
1987 > XVECTOR (frame_and_buffer_state)->size)
1988 abort ();
1982 return Qt; 1989 return Qt;
1983} 1990}
1984 1991
@@ -2545,7 +2552,7 @@ syms_of_display ()
2545 defsubr (&Ssleep_for); 2552 defsubr (&Ssleep_for);
2546 defsubr (&Ssend_string_to_terminal); 2553 defsubr (&Ssend_string_to_terminal);
2547 2554
2548 frame_and_buffer_state = Fmake_vector (make_number (1), Qlambda); 2555 frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda);
2549 staticpro (&frame_and_buffer_state); 2556 staticpro (&frame_and_buffer_state);
2550 2557
2551 DEFVAR_INT ("baud-rate", &baud_rate, 2558 DEFVAR_INT ("baud-rate", &baud_rate,