X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/54ee42dd61458c3bae404a08d4a4da1b619525fc..26c76ace8de7d0fa687d8a76b3a3bce5fb1ee692:/src/alloc.c diff --git a/src/alloc.c b/src/alloc.c index 00a03e850d..9f79ee5aa6 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -15,7 +15,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ /* Note that this declares bzero on OSF/1. How dumb. */ #include @@ -87,6 +88,9 @@ int gc_cons_threshold; /* Nonzero during gc */ int gc_in_progress; +/* Nonzero means display messages at beginning and end of GC. */ +int garbage_collection_messages; + #ifndef VIRT_ADDR_VARIES extern #endif /* VIRT_ADDR_VARIES */ @@ -820,7 +824,7 @@ significance.") XSETFASTINT (len, nargs); if (!NILP (Vpurify_flag)) - val = make_pure_vector (len); + val = make_pure_vector ((EMACS_INT) nargs); else val = Fmake_vector (len, Qnil); p = XVECTOR (val); @@ -899,7 +903,8 @@ Its value and function definition are void, and its property list is nil.") XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index++]); } p = XSYMBOL (val); - p->name = XSTRING (str); + p->name = XSTRING (name); + p->obarray = Qnil; p->plist = Qnil; p->value = Qunbound; p->function = Qunbound; @@ -1013,7 +1018,7 @@ DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, struct string_block_head { struct string_block *next, *prev; - int pos; + EMACS_INT pos; }; struct string_block @@ -1363,7 +1368,7 @@ Does not copy symbols.") size = XVECTOR (obj)->size; if (size & PSEUDOVECTOR_FLAG) size &= PSEUDOVECTOR_SIZE_MASK; - vec = XVECTOR (make_pure_vector (size)); + vec = XVECTOR (make_pure_vector ((EMACS_INT) size)); for (i = 0; i < size; i++) vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]); if (COMPILEDP (obj)) @@ -1446,7 +1451,7 @@ DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "", Returns info on amount of space in use:\n\ ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)\n\ (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS\n\ - (USED-FLOATS . FREE-FLOATS))\n\ + (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS))\n\ Garbage collection happens automatically if you cons more than\n\ `gc-cons-threshold' bytes of Lisp data since previous garbage collection.") () @@ -1489,7 +1494,7 @@ Garbage collection happens automatically if you cons more than\n\ } #endif /* MAX_SAVE_STACK > 0 */ - if (!noninteractive) + if (garbage_collection_messages) message1_nolog ("Garbage collecting..."); /* Don't keep command history around forever */ @@ -1517,7 +1522,7 @@ Garbage collection happens automatically if you cons more than\n\ gc_in_progress = 1; -/* clear_marks (); */ + /* clear_marks (); */ /* In each "large string", set the MARKBIT of the size field. That enables mark_object to recognize them. */ @@ -1598,17 +1603,20 @@ Garbage collection happens automatically if you cons more than\n\ XUNMARK (buffer_defaults.name); XUNMARK (buffer_local_symbols.name); -/* clear_marks (); */ + /* clear_marks (); */ gc_in_progress = 0; consing_since_gc = 0; if (gc_cons_threshold < 10000) gc_cons_threshold = 10000; - if (omessage || minibuf_level > 0) - message2_nolog (omessage, omessage_length); - else if (!noninteractive) - message1_nolog ("Garbage collecting...done"); + if (garbage_collection_messages) + { + if (omessage || minibuf_level > 0) + message2_nolog (omessage, omessage_length); + else + message1_nolog ("Garbage collecting...done"); + } return Fcons (Fcons (make_number (total_conses), make_number (total_free_conses)), @@ -1618,15 +1626,21 @@ Garbage collection happens automatically if you cons more than\n\ make_number (total_free_markers)), Fcons (make_number (total_string_size), Fcons (make_number (total_vector_size), - + Fcons (Fcons #ifdef LISP_FLOAT_TYPE - Fcons (Fcons (make_number (total_floats), - make_number (total_free_floats)), - Qnil) + (make_number (total_floats), + make_number (total_free_floats)), #else /* not LISP_FLOAT_TYPE */ - Qnil + (make_number (0), make_number (0)), #endif /* not LISP_FLOAT_TYPE */ - ))))); + Fcons (Fcons +#ifdef USE_TEXT_PROPERTIES + (make_number (total_intervals), + make_number (total_free_intervals)), +#else /* not USE_TEXT_PROPERTIES */ + (make_number (0), make_number (0)), +#endif /* not USE_TEXT_PROPERTIES */ + Qnil))))))); } #if 0 @@ -1789,7 +1803,6 @@ mark_object (argptr) objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS]; goto loop; } -#ifdef MULTI_FRAME else if (GC_FRAMEP (obj)) { /* See comment above under Lisp_Vector for why this is volatile. */ @@ -1801,6 +1814,7 @@ mark_object (argptr) mark_object (&ptr->name); mark_object (&ptr->icon_name); + mark_object (&ptr->title); mark_object (&ptr->focus_frame); mark_object (&ptr->selected_window); mark_object (&ptr->minibuffer_window); @@ -1812,9 +1826,14 @@ mark_object (argptr) mark_object (&ptr->menu_bar_vector); mark_object (&ptr->buffer_predicate); } -#endif /* MULTI_FRAME */ else if (GC_BOOL_VECTOR_P (obj)) - ; + { + register struct Lisp_Vector *ptr = XVECTOR (obj); + + if (ptr->size & ARRAY_MARK_FLAG) + break; /* Already marked */ + ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ + } else { register struct Lisp_Vector *ptr = XVECTOR (obj); @@ -2582,6 +2601,27 @@ prevent garbage collection during a part of the program."); DEFVAR_INT ("pure-bytes-used", &pureptr, "Number of bytes of sharable Lisp data allocated so far."); + DEFVAR_INT ("cons-cells-consed", &cons_cells_consed, + "Number of cons cells that have been consed so far."); + + DEFVAR_INT ("floats-consed", &floats_consed, + "Number of floats that have been consed so far."); + + DEFVAR_INT ("vector-cells-consed", &vector_cells_consed, + "Number of vector cells that have been consed so far."); + + DEFVAR_INT ("symbols-consed", &symbols_consed, + "Number of symbols that have been consed so far."); + + DEFVAR_INT ("string-chars-consed", &string_chars_consed, + "Number of string characters that have been consed so far."); + + DEFVAR_INT ("misc-objects-consed", &misc_objects_consed, + "Number of miscellaneous objects that have been consed so far."); + + DEFVAR_INT ("intervals-consed", &intervals_consed, + "Number of intervals that have been consed so far."); + #if 0 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used, "Number of bytes of unshared memory allocated in this session."); @@ -2609,6 +2649,10 @@ The size is counted as the number of bytes occupied,\n\ which includes both saved text and other data."); undo_strong_limit = 30000; + DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages, + "Non-nil means display messages at start and end of garbage collection."); + garbage_collection_messages = 0; + /* We build this in advance because if we wait until we need it, we might not be able to allocate the memory to hold it. */ memory_signal_data