Mercurial > emacs
changeset 84954:e4706ef9521d
(allocate_terminal): Set the vector size to only count the Lisp fields.
Initialize those to nil.
(mark_object): Don't treat terminals specially.
(mark_terminal): Remove.
(mark_terminals): Use mark_object instead.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Thu, 27 Sep 2007 19:51:39 +0000 |
parents | 0440e26f0af7 |
children | dfbee4931a6a |
files | src/ChangeLog src/alloc.c |
diffstat | 2 files changed, 19 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Thu Sep 27 19:50:02 2007 +0000 +++ b/src/ChangeLog Thu Sep 27 19:51:39 2007 +0000 @@ -1,5 +1,11 @@ 2007-09-27 Stefan Monnier <monnier@iro.umontreal.ca> + * alloc.c (allocate_terminal): Set the vector size to only count the + lisp fields. Initialize those to nil. + (mark_object): Don't treat terminals specially. + (mark_terminal): Remove. + (mark_terminals): Use mark_object instead. + * termhooks.h (struct terminal): Move all Lisp_Object fields traced by the GC to the beginning.
--- a/src/alloc.c Thu Sep 27 19:50:02 2007 +0000 +++ b/src/alloc.c Thu Sep 27 19:51:39 2007 +0000 @@ -3023,14 +3023,20 @@ struct terminal * allocate_terminal () { - EMACS_INT len = VECSIZE (struct terminal); - struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_TERMINAL); + /* Memory-footprint of the object in nb of Lisp_Object fields. */ + EMACS_INT memlen = VECSIZE (struct terminal); + /* Size if we only count the actual Lisp_Object fields (which need to be + traced by the GC). */ + EMACS_INT lisplen = PSEUDOVECSIZE (struct terminal, next_terminal); + struct Lisp_Vector *v = allocate_vectorlike (memlen, MEM_TYPE_TERMINAL); EMACS_INT i; Lisp_Object tmp, zero = make_number (0); - for (i = 0; i < len; ++i) + for (i = 0; i < lisplen; ++i) + v->contents[i] = Qnil; + for (;i < memlen; ++i) v->contents[i] = zero; - v->size = len; + v->size = lisplen; /* Only trace the Lisp fields. */ XSETTERMINAL (tmp, v); /* Add the appropriate tag. */ return (struct terminal *) v; @@ -5683,11 +5689,6 @@ mark_glyph_matrix (w->desired_matrix); } } - else if (GC_TERMINALP (obj)) - { - CHECK_LIVE (live_vector_p); - mark_terminal (XTERMINAL (obj)); - } else if (GC_HASH_TABLE_P (obj)) { struct Lisp_Hash_Table *h = XHASH_TABLE (obj); @@ -5935,20 +5936,15 @@ Called by the Fgarbage_collector. */ static void -mark_terminal (struct terminal *t) -{ - VECTOR_MARK (t); - mark_object (t->param_alist); -} - -static void mark_terminals (void) { struct terminal *t; + Lisp_Object tmp; for (t = terminal_list; t; t = t->next_terminal) { eassert (t->name != NULL); - mark_terminal (t); + XSETVECTOR (tmp, t); + mark_object (tmp); } }