From 13559ee0bba298a09107f583898c3e02f588627a Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 27 Sep 2007 19:51:39 +0000 Subject: [PATCH] (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. --- src/ChangeLog | 6 ++++++ src/alloc.c | 30 +++++++++++++----------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index f6e21a6f4b1..ae40cbcddd0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,11 @@ 2007-09-27 Stefan Monnier + * 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. diff --git a/src/alloc.c b/src/alloc.c index 9ba21c2c47a..aada45cd93b 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -3023,14 +3023,20 @@ allocate_window () 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_object (arg) 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); @@ -5934,21 +5935,16 @@ mark_buffer (buf) /* Mark the Lisp pointers in the terminal objects. 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); } }