(single_menu_item): Change last parameter to void* to
[emacs.git] / src / alloc.c
blobf82cde61c2778af56e0acc5e6a5241dfdc2ac0a9
1 /* Storage allocation and gc for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #include <config.h>
23 #include <stdio.h>
25 #ifdef ALLOC_DEBUG
26 #undef INLINE
27 #endif
29 /* Note that this declares bzero on OSF/1. How dumb. */
31 #include <signal.h>
33 /* GC_MALLOC_CHECK defined means perform validity checks of malloc'd
34 memory. Can do this only if using gmalloc.c. */
36 #if defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC
37 #undef GC_MALLOC_CHECK
38 #endif
40 /* This file is part of the core Lisp implementation, and thus must
41 deal with the real data structures. If the Lisp implementation is
42 replaced, this file likely will not be used. */
44 #undef HIDE_LISP_IMPLEMENTATION
45 #include "lisp.h"
46 #include "process.h"
47 #include "intervals.h"
48 #include "puresize.h"
49 #include "buffer.h"
50 #include "window.h"
51 #include "keyboard.h"
52 #include "frame.h"
53 #include "blockinput.h"
54 #include "charset.h"
55 #include "syssignal.h"
56 #include <setjmp.h>
58 #ifdef HAVE_UNISTD_H
59 #include <unistd.h>
60 #else
61 extern POINTER_TYPE *sbrk ();
62 #endif
64 #ifdef DOUG_LEA_MALLOC
66 #include <malloc.h>
67 /* malloc.h #defines this as size_t, at least in glibc2. */
68 #ifndef __malloc_size_t
69 #define __malloc_size_t int
70 #endif
72 /* Specify maximum number of areas to mmap. It would be nice to use a
73 value that explicitly means "no limit". */
75 #define MMAP_MAX_AREAS 100000000
77 #else /* not DOUG_LEA_MALLOC */
79 /* The following come from gmalloc.c. */
81 #define __malloc_size_t size_t
82 extern __malloc_size_t _bytes_used;
83 extern __malloc_size_t __malloc_extra_blocks;
85 #endif /* not DOUG_LEA_MALLOC */
87 /* Value of _bytes_used, when spare_memory was freed. */
89 static __malloc_size_t bytes_used_when_full;
91 /* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
92 to a struct Lisp_String. */
94 #define MARK_STRING(S) ((S)->size |= MARKBIT)
95 #define UNMARK_STRING(S) ((S)->size &= ~MARKBIT)
96 #define STRING_MARKED_P(S) ((S)->size & MARKBIT)
98 /* Value is the number of bytes/chars of S, a pointer to a struct
99 Lisp_String. This must be used instead of STRING_BYTES (S) or
100 S->size during GC, because S->size contains the mark bit for
101 strings. */
103 #define GC_STRING_BYTES(S) (STRING_BYTES (S) & ~MARKBIT)
104 #define GC_STRING_CHARS(S) ((S)->size & ~MARKBIT)
106 /* Number of bytes of consing done since the last gc. */
108 int consing_since_gc;
110 /* Count the amount of consing of various sorts of space. */
112 EMACS_INT cons_cells_consed;
113 EMACS_INT floats_consed;
114 EMACS_INT vector_cells_consed;
115 EMACS_INT symbols_consed;
116 EMACS_INT string_chars_consed;
117 EMACS_INT misc_objects_consed;
118 EMACS_INT intervals_consed;
119 EMACS_INT strings_consed;
121 /* Number of bytes of consing since GC before another GC should be done. */
123 EMACS_INT gc_cons_threshold;
125 /* Nonzero during GC. */
127 int gc_in_progress;
129 /* Nonzero means abort if try to GC.
130 This is for code which is written on the assumption that
131 no GC will happen, so as to verify that assumption. */
133 int abort_on_gc;
135 /* Nonzero means display messages at beginning and end of GC. */
137 int garbage_collection_messages;
139 #ifndef VIRT_ADDR_VARIES
140 extern
141 #endif /* VIRT_ADDR_VARIES */
142 int malloc_sbrk_used;
144 #ifndef VIRT_ADDR_VARIES
145 extern
146 #endif /* VIRT_ADDR_VARIES */
147 int malloc_sbrk_unused;
149 /* Two limits controlling how much undo information to keep. */
151 EMACS_INT undo_limit;
152 EMACS_INT undo_strong_limit;
154 /* Number of live and free conses etc. */
156 static int total_conses, total_markers, total_symbols, total_vector_size;
157 static int total_free_conses, total_free_markers, total_free_symbols;
158 static int total_free_floats, total_floats;
160 /* Points to memory space allocated as "spare", to be freed if we run
161 out of memory. */
163 static char *spare_memory;
165 /* Amount of spare memory to keep in reserve. */
167 #define SPARE_MEMORY (1 << 14)
169 /* Number of extra blocks malloc should get when it needs more core. */
171 static int malloc_hysteresis;
173 /* Non-nil means defun should do purecopy on the function definition. */
175 Lisp_Object Vpurify_flag;
177 /* Non-nil means we are handling a memory-full error. */
179 Lisp_Object Vmemory_full;
181 #ifndef HAVE_SHM
183 /* Force it into data space! */
185 EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {0,};
186 #define PUREBEG (char *) pure
188 #else /* HAVE_SHM */
190 #define pure PURE_SEG_BITS /* Use shared memory segment */
191 #define PUREBEG (char *)PURE_SEG_BITS
193 #endif /* HAVE_SHM */
195 /* Pointer to the pure area, and its size. */
197 static char *purebeg;
198 static size_t pure_size;
200 /* Number of bytes of pure storage used before pure storage overflowed.
201 If this is non-zero, this implies that an overflow occurred. */
203 static size_t pure_bytes_used_before_overflow;
205 /* Value is non-zero if P points into pure space. */
207 #define PURE_POINTER_P(P) \
208 (((PNTR_COMPARISON_TYPE) (P) \
209 < (PNTR_COMPARISON_TYPE) ((char *) purebeg + pure_size)) \
210 && ((PNTR_COMPARISON_TYPE) (P) \
211 >= (PNTR_COMPARISON_TYPE) purebeg))
213 /* Index in pure at which next pure object will be allocated.. */
215 EMACS_INT pure_bytes_used;
217 /* If nonzero, this is a warning delivered by malloc and not yet
218 displayed. */
220 char *pending_malloc_warning;
222 /* Pre-computed signal argument for use when memory is exhausted. */
224 Lisp_Object Vmemory_signal_data;
226 /* Maximum amount of C stack to save when a GC happens. */
228 #ifndef MAX_SAVE_STACK
229 #define MAX_SAVE_STACK 16000
230 #endif
232 /* Buffer in which we save a copy of the C stack at each GC. */
234 char *stack_copy;
235 int stack_copy_size;
237 /* Non-zero means ignore malloc warnings. Set during initialization.
238 Currently not used. */
240 int ignore_warnings;
242 Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots;
244 /* Hook run after GC has finished. */
246 Lisp_Object Vpost_gc_hook, Qpost_gc_hook;
248 Lisp_Object Vgc_elapsed; /* accumulated elapsed time in GC */
249 EMACS_INT gcs_done; /* accumulated GCs */
251 static void mark_buffer P_ ((Lisp_Object));
252 static void mark_kboards P_ ((void));
253 static void gc_sweep P_ ((void));
254 static void mark_glyph_matrix P_ ((struct glyph_matrix *));
255 static void mark_face_cache P_ ((struct face_cache *));
257 #ifdef HAVE_WINDOW_SYSTEM
258 static void mark_image P_ ((struct image *));
259 static void mark_image_cache P_ ((struct frame *));
260 #endif /* HAVE_WINDOW_SYSTEM */
262 static struct Lisp_String *allocate_string P_ ((void));
263 static void compact_small_strings P_ ((void));
264 static void free_large_strings P_ ((void));
265 static void sweep_strings P_ ((void));
267 extern int message_enable_multibyte;
269 /* When scanning the C stack for live Lisp objects, Emacs keeps track
270 of what memory allocated via lisp_malloc is intended for what
271 purpose. This enumeration specifies the type of memory. */
273 enum mem_type
275 MEM_TYPE_NON_LISP,
276 MEM_TYPE_BUFFER,
277 MEM_TYPE_CONS,
278 MEM_TYPE_STRING,
279 MEM_TYPE_MISC,
280 MEM_TYPE_SYMBOL,
281 MEM_TYPE_FLOAT,
282 /* Keep the following vector-like types together, with
283 MEM_TYPE_WINDOW being the last, and MEM_TYPE_VECTOR the
284 first. Or change the code of live_vector_p, for instance. */
285 MEM_TYPE_VECTOR,
286 MEM_TYPE_PROCESS,
287 MEM_TYPE_HASH_TABLE,
288 MEM_TYPE_FRAME,
289 MEM_TYPE_WINDOW
292 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
294 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
295 #include <stdio.h> /* For fprintf. */
296 #endif
298 /* A unique object in pure space used to make some Lisp objects
299 on free lists recognizable in O(1). */
301 Lisp_Object Vdead;
303 #ifdef GC_MALLOC_CHECK
305 enum mem_type allocated_mem_type;
306 int dont_register_blocks;
308 #endif /* GC_MALLOC_CHECK */
310 /* A node in the red-black tree describing allocated memory containing
311 Lisp data. Each such block is recorded with its start and end
312 address when it is allocated, and removed from the tree when it
313 is freed.
315 A red-black tree is a balanced binary tree with the following
316 properties:
318 1. Every node is either red or black.
319 2. Every leaf is black.
320 3. If a node is red, then both of its children are black.
321 4. Every simple path from a node to a descendant leaf contains
322 the same number of black nodes.
323 5. The root is always black.
325 When nodes are inserted into the tree, or deleted from the tree,
326 the tree is "fixed" so that these properties are always true.
328 A red-black tree with N internal nodes has height at most 2
329 log(N+1). Searches, insertions and deletions are done in O(log N).
330 Please see a text book about data structures for a detailed
331 description of red-black trees. Any book worth its salt should
332 describe them. */
334 struct mem_node
336 /* Children of this node. These pointers are never NULL. When there
337 is no child, the value is MEM_NIL, which points to a dummy node. */
338 struct mem_node *left, *right;
340 /* The parent of this node. In the root node, this is NULL. */
341 struct mem_node *parent;
343 /* Start and end of allocated region. */
344 void *start, *end;
346 /* Node color. */
347 enum {MEM_BLACK, MEM_RED} color;
349 /* Memory type. */
350 enum mem_type type;
353 /* Base address of stack. Set in main. */
355 Lisp_Object *stack_base;
357 /* Root of the tree describing allocated Lisp memory. */
359 static struct mem_node *mem_root;
361 /* Lowest and highest known address in the heap. */
363 static void *min_heap_address, *max_heap_address;
365 /* Sentinel node of the tree. */
367 static struct mem_node mem_z;
368 #define MEM_NIL &mem_z
370 static POINTER_TYPE *lisp_malloc P_ ((size_t, enum mem_type));
371 static struct Lisp_Vector *allocate_vectorlike P_ ((EMACS_INT, enum mem_type));
372 static void lisp_free P_ ((POINTER_TYPE *));
373 static void mark_stack P_ ((void));
374 static int live_vector_p P_ ((struct mem_node *, void *));
375 static int live_buffer_p P_ ((struct mem_node *, void *));
376 static int live_string_p P_ ((struct mem_node *, void *));
377 static int live_cons_p P_ ((struct mem_node *, void *));
378 static int live_symbol_p P_ ((struct mem_node *, void *));
379 static int live_float_p P_ ((struct mem_node *, void *));
380 static int live_misc_p P_ ((struct mem_node *, void *));
381 static void mark_maybe_object P_ ((Lisp_Object));
382 static void mark_memory P_ ((void *, void *));
383 static void mem_init P_ ((void));
384 static struct mem_node *mem_insert P_ ((void *, void *, enum mem_type));
385 static void mem_insert_fixup P_ ((struct mem_node *));
386 static void mem_rotate_left P_ ((struct mem_node *));
387 static void mem_rotate_right P_ ((struct mem_node *));
388 static void mem_delete P_ ((struct mem_node *));
389 static void mem_delete_fixup P_ ((struct mem_node *));
390 static INLINE struct mem_node *mem_find P_ ((void *));
392 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
393 static void check_gcpros P_ ((void));
394 #endif
396 #endif /* GC_MARK_STACK || GC_MALLOC_CHECK */
398 /* Recording what needs to be marked for gc. */
400 struct gcpro *gcprolist;
402 /* Addresses of staticpro'd variables. */
404 #define NSTATICS 1280
405 Lisp_Object *staticvec[NSTATICS] = {0};
407 /* Index of next unused slot in staticvec. */
409 int staticidx = 0;
411 static POINTER_TYPE *pure_alloc P_ ((size_t, int));
414 /* Value is SZ rounded up to the next multiple of ALIGNMENT.
415 ALIGNMENT must be a power of 2. */
417 #define ALIGN(SZ, ALIGNMENT) \
418 (((SZ) + (ALIGNMENT) - 1) & ~((ALIGNMENT) - 1))
422 /************************************************************************
423 Malloc
424 ************************************************************************/
426 /* Function malloc calls this if it finds we are near exhausting storage. */
428 void
429 malloc_warning (str)
430 char *str;
432 pending_malloc_warning = str;
436 /* Display an already-pending malloc warning. */
438 void
439 display_malloc_warning ()
441 call3 (intern ("display-warning"),
442 intern ("alloc"),
443 build_string (pending_malloc_warning),
444 intern ("emergency"));
445 pending_malloc_warning = 0;
449 #ifdef DOUG_LEA_MALLOC
450 # define BYTES_USED (mallinfo ().arena)
451 #else
452 # define BYTES_USED _bytes_used
453 #endif
456 /* Called if malloc returns zero. */
458 void
459 memory_full ()
461 Vmemory_full = Qt;
463 #ifndef SYSTEM_MALLOC
464 bytes_used_when_full = BYTES_USED;
465 #endif
467 /* The first time we get here, free the spare memory. */
468 if (spare_memory)
470 free (spare_memory);
471 spare_memory = 0;
474 /* This used to call error, but if we've run out of memory, we could
475 get infinite recursion trying to build the string. */
476 while (1)
477 Fsignal (Qnil, Vmemory_signal_data);
481 /* Called if we can't allocate relocatable space for a buffer. */
483 void
484 buffer_memory_full ()
486 /* If buffers use the relocating allocator, no need to free
487 spare_memory, because we may have plenty of malloc space left
488 that we could get, and if we don't, the malloc that fails will
489 itself cause spare_memory to be freed. If buffers don't use the
490 relocating allocator, treat this like any other failing
491 malloc. */
493 #ifndef REL_ALLOC
494 memory_full ();
495 #endif
497 Vmemory_full = Qt;
499 /* This used to call error, but if we've run out of memory, we could
500 get infinite recursion trying to build the string. */
501 while (1)
502 Fsignal (Qnil, Vmemory_signal_data);
506 /* Like malloc but check for no memory and block interrupt input.. */
508 POINTER_TYPE *
509 xmalloc (size)
510 size_t size;
512 register POINTER_TYPE *val;
514 BLOCK_INPUT;
515 val = (POINTER_TYPE *) malloc (size);
516 UNBLOCK_INPUT;
518 if (!val && size)
519 memory_full ();
520 return val;
524 /* Like realloc but check for no memory and block interrupt input.. */
526 POINTER_TYPE *
527 xrealloc (block, size)
528 POINTER_TYPE *block;
529 size_t size;
531 register POINTER_TYPE *val;
533 BLOCK_INPUT;
534 /* We must call malloc explicitly when BLOCK is 0, since some
535 reallocs don't do this. */
536 if (! block)
537 val = (POINTER_TYPE *) malloc (size);
538 else
539 val = (POINTER_TYPE *) realloc (block, size);
540 UNBLOCK_INPUT;
542 if (!val && size) memory_full ();
543 return val;
547 /* Like free but block interrupt input.. */
549 void
550 xfree (block)
551 POINTER_TYPE *block;
553 BLOCK_INPUT;
554 free (block);
555 UNBLOCK_INPUT;
559 /* Like strdup, but uses xmalloc. */
561 char *
562 xstrdup (s)
563 const char *s;
565 size_t len = strlen (s) + 1;
566 char *p = (char *) xmalloc (len);
567 bcopy (s, p, len);
568 return p;
572 /* Like malloc but used for allocating Lisp data. NBYTES is the
573 number of bytes to allocate, TYPE describes the intended use of the
574 allcated memory block (for strings, for conses, ...). */
576 static void *lisp_malloc_loser;
578 static POINTER_TYPE *
579 lisp_malloc (nbytes, type)
580 size_t nbytes;
581 enum mem_type type;
583 register void *val;
585 BLOCK_INPUT;
587 #ifdef GC_MALLOC_CHECK
588 allocated_mem_type = type;
589 #endif
591 val = (void *) malloc (nbytes);
593 /* If the memory just allocated cannot be addressed thru a Lisp
594 object's pointer, and it needs to be,
595 that's equivalent to running out of memory. */
596 if (val && type != MEM_TYPE_NON_LISP)
598 Lisp_Object tem;
599 XSETCONS (tem, (char *) val + nbytes - 1);
600 if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
602 lisp_malloc_loser = val;
603 free (val);
604 val = 0;
608 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
609 if (val && type != MEM_TYPE_NON_LISP)
610 mem_insert (val, (char *) val + nbytes, type);
611 #endif
613 UNBLOCK_INPUT;
614 if (!val && nbytes)
615 memory_full ();
616 return val;
620 /* Return a new buffer structure allocated from the heap with
621 a call to lisp_malloc. */
623 struct buffer *
624 allocate_buffer ()
626 struct buffer *b
627 = (struct buffer *) lisp_malloc (sizeof (struct buffer),
628 MEM_TYPE_BUFFER);
629 return b;
633 /* Free BLOCK. This must be called to free memory allocated with a
634 call to lisp_malloc. */
636 static void
637 lisp_free (block)
638 POINTER_TYPE *block;
640 BLOCK_INPUT;
641 free (block);
642 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
643 mem_delete (mem_find (block));
644 #endif
645 UNBLOCK_INPUT;
649 /* Arranging to disable input signals while we're in malloc.
651 This only works with GNU malloc. To help out systems which can't
652 use GNU malloc, all the calls to malloc, realloc, and free
653 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
654 pairs; unfortunately, we have no idea what C library functions
655 might call malloc, so we can't really protect them unless you're
656 using GNU malloc. Fortunately, most of the major operating systems
657 can use GNU malloc. */
659 #ifndef SYSTEM_MALLOC
660 #ifndef DOUG_LEA_MALLOC
661 extern void * (*__malloc_hook) P_ ((size_t));
662 extern void * (*__realloc_hook) P_ ((void *, size_t));
663 extern void (*__free_hook) P_ ((void *));
664 /* Else declared in malloc.h, perhaps with an extra arg. */
665 #endif /* DOUG_LEA_MALLOC */
666 static void * (*old_malloc_hook) ();
667 static void * (*old_realloc_hook) ();
668 static void (*old_free_hook) ();
670 /* This function is used as the hook for free to call. */
672 static void
673 emacs_blocked_free (ptr)
674 void *ptr;
676 BLOCK_INPUT;
678 #ifdef GC_MALLOC_CHECK
679 if (ptr)
681 struct mem_node *m;
683 m = mem_find (ptr);
684 if (m == MEM_NIL || m->start != ptr)
686 fprintf (stderr,
687 "Freeing `%p' which wasn't allocated with malloc\n", ptr);
688 abort ();
690 else
692 /* fprintf (stderr, "free %p...%p (%p)\n", m->start, m->end, ptr); */
693 mem_delete (m);
696 #endif /* GC_MALLOC_CHECK */
698 __free_hook = old_free_hook;
699 free (ptr);
701 /* If we released our reserve (due to running out of memory),
702 and we have a fair amount free once again,
703 try to set aside another reserve in case we run out once more. */
704 if (spare_memory == 0
705 /* Verify there is enough space that even with the malloc
706 hysteresis this call won't run out again.
707 The code here is correct as long as SPARE_MEMORY
708 is substantially larger than the block size malloc uses. */
709 && (bytes_used_when_full
710 > BYTES_USED + max (malloc_hysteresis, 4) * SPARE_MEMORY))
711 spare_memory = (char *) malloc ((size_t) SPARE_MEMORY);
713 __free_hook = emacs_blocked_free;
714 UNBLOCK_INPUT;
718 /* If we released our reserve (due to running out of memory),
719 and we have a fair amount free once again,
720 try to set aside another reserve in case we run out once more.
722 This is called when a relocatable block is freed in ralloc.c. */
724 void
725 refill_memory_reserve ()
727 if (spare_memory == 0)
728 spare_memory = (char *) malloc ((size_t) SPARE_MEMORY);
732 /* This function is the malloc hook that Emacs uses. */
734 static void *
735 emacs_blocked_malloc (size)
736 size_t size;
738 void *value;
740 BLOCK_INPUT;
741 __malloc_hook = old_malloc_hook;
742 #ifdef DOUG_LEA_MALLOC
743 mallopt (M_TOP_PAD, malloc_hysteresis * 4096);
744 #else
745 __malloc_extra_blocks = malloc_hysteresis;
746 #endif
748 value = (void *) malloc (size);
750 #ifdef GC_MALLOC_CHECK
752 struct mem_node *m = mem_find (value);
753 if (m != MEM_NIL)
755 fprintf (stderr, "Malloc returned %p which is already in use\n",
756 value);
757 fprintf (stderr, "Region in use is %p...%p, %u bytes, type %d\n",
758 m->start, m->end, (char *) m->end - (char *) m->start,
759 m->type);
760 abort ();
763 if (!dont_register_blocks)
765 mem_insert (value, (char *) value + max (1, size), allocated_mem_type);
766 allocated_mem_type = MEM_TYPE_NON_LISP;
769 #endif /* GC_MALLOC_CHECK */
771 __malloc_hook = emacs_blocked_malloc;
772 UNBLOCK_INPUT;
774 /* fprintf (stderr, "%p malloc\n", value); */
775 return value;
779 /* This function is the realloc hook that Emacs uses. */
781 static void *
782 emacs_blocked_realloc (ptr, size)
783 void *ptr;
784 size_t size;
786 void *value;
788 BLOCK_INPUT;
789 __realloc_hook = old_realloc_hook;
791 #ifdef GC_MALLOC_CHECK
792 if (ptr)
794 struct mem_node *m = mem_find (ptr);
795 if (m == MEM_NIL || m->start != ptr)
797 fprintf (stderr,
798 "Realloc of %p which wasn't allocated with malloc\n",
799 ptr);
800 abort ();
803 mem_delete (m);
806 /* fprintf (stderr, "%p -> realloc\n", ptr); */
808 /* Prevent malloc from registering blocks. */
809 dont_register_blocks = 1;
810 #endif /* GC_MALLOC_CHECK */
812 value = (void *) realloc (ptr, size);
814 #ifdef GC_MALLOC_CHECK
815 dont_register_blocks = 0;
818 struct mem_node *m = mem_find (value);
819 if (m != MEM_NIL)
821 fprintf (stderr, "Realloc returns memory that is already in use\n");
822 abort ();
825 /* Can't handle zero size regions in the red-black tree. */
826 mem_insert (value, (char *) value + max (size, 1), MEM_TYPE_NON_LISP);
829 /* fprintf (stderr, "%p <- realloc\n", value); */
830 #endif /* GC_MALLOC_CHECK */
832 __realloc_hook = emacs_blocked_realloc;
833 UNBLOCK_INPUT;
835 return value;
839 /* Called from main to set up malloc to use our hooks. */
841 void
842 uninterrupt_malloc ()
844 if (__free_hook != emacs_blocked_free)
845 old_free_hook = __free_hook;
846 __free_hook = emacs_blocked_free;
848 if (__malloc_hook != emacs_blocked_malloc)
849 old_malloc_hook = __malloc_hook;
850 __malloc_hook = emacs_blocked_malloc;
852 if (__realloc_hook != emacs_blocked_realloc)
853 old_realloc_hook = __realloc_hook;
854 __realloc_hook = emacs_blocked_realloc;
857 #endif /* not SYSTEM_MALLOC */
861 /***********************************************************************
862 Interval Allocation
863 ***********************************************************************/
865 /* Number of intervals allocated in an interval_block structure.
866 The 1020 is 1024 minus malloc overhead. */
868 #define INTERVAL_BLOCK_SIZE \
869 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
871 /* Intervals are allocated in chunks in form of an interval_block
872 structure. */
874 struct interval_block
876 struct interval_block *next;
877 struct interval intervals[INTERVAL_BLOCK_SIZE];
880 /* Current interval block. Its `next' pointer points to older
881 blocks. */
883 struct interval_block *interval_block;
885 /* Index in interval_block above of the next unused interval
886 structure. */
888 static int interval_block_index;
890 /* Number of free and live intervals. */
892 static int total_free_intervals, total_intervals;
894 /* List of free intervals. */
896 INTERVAL interval_free_list;
898 /* Total number of interval blocks now in use. */
900 int n_interval_blocks;
903 /* Initialize interval allocation. */
905 static void
906 init_intervals ()
908 interval_block
909 = (struct interval_block *) lisp_malloc (sizeof *interval_block,
910 MEM_TYPE_NON_LISP);
911 interval_block->next = 0;
912 bzero ((char *) interval_block->intervals, sizeof interval_block->intervals);
913 interval_block_index = 0;
914 interval_free_list = 0;
915 n_interval_blocks = 1;
919 /* Return a new interval. */
921 INTERVAL
922 make_interval ()
924 INTERVAL val;
926 if (interval_free_list)
928 val = interval_free_list;
929 interval_free_list = INTERVAL_PARENT (interval_free_list);
931 else
933 if (interval_block_index == INTERVAL_BLOCK_SIZE)
935 register struct interval_block *newi;
937 newi = (struct interval_block *) lisp_malloc (sizeof *newi,
938 MEM_TYPE_NON_LISP);
940 newi->next = interval_block;
941 interval_block = newi;
942 interval_block_index = 0;
943 n_interval_blocks++;
945 val = &interval_block->intervals[interval_block_index++];
947 consing_since_gc += sizeof (struct interval);
948 intervals_consed++;
949 RESET_INTERVAL (val);
950 return val;
954 /* Mark Lisp objects in interval I. */
956 static void
957 mark_interval (i, dummy)
958 register INTERVAL i;
959 Lisp_Object dummy;
961 if (XMARKBIT (i->plist))
962 abort ();
963 mark_object (&i->plist);
964 XMARK (i->plist);
968 /* Mark the interval tree rooted in TREE. Don't call this directly;
969 use the macro MARK_INTERVAL_TREE instead. */
971 static void
972 mark_interval_tree (tree)
973 register INTERVAL tree;
975 /* No need to test if this tree has been marked already; this
976 function is always called through the MARK_INTERVAL_TREE macro,
977 which takes care of that. */
979 /* XMARK expands to an assignment; the LHS of an assignment can't be
980 a cast. */
981 XMARK (tree->up.obj);
983 traverse_intervals_noorder (tree, mark_interval, Qnil);
987 /* Mark the interval tree rooted in I. */
989 #define MARK_INTERVAL_TREE(i) \
990 do { \
991 if (!NULL_INTERVAL_P (i) \
992 && ! XMARKBIT (i->up.obj)) \
993 mark_interval_tree (i); \
994 } while (0)
997 /* The oddity in the call to XUNMARK is necessary because XUNMARK
998 expands to an assignment to its argument, and most C compilers
999 don't support casts on the left operand of `='. */
1001 #define UNMARK_BALANCE_INTERVALS(i) \
1002 do { \
1003 if (! NULL_INTERVAL_P (i)) \
1005 XUNMARK ((i)->up.obj); \
1006 (i) = balance_intervals (i); \
1008 } while (0)
1011 /* Number support. If NO_UNION_TYPE isn't in effect, we
1012 can't create number objects in macros. */
1013 #ifndef make_number
1014 Lisp_Object
1015 make_number (n)
1016 int n;
1018 Lisp_Object obj;
1019 obj.s.val = n;
1020 obj.s.type = Lisp_Int;
1021 return obj;
1023 #endif
1025 /***********************************************************************
1026 String Allocation
1027 ***********************************************************************/
1029 /* Lisp_Strings are allocated in string_block structures. When a new
1030 string_block is allocated, all the Lisp_Strings it contains are
1031 added to a free-list string_free_list. When a new Lisp_String is
1032 needed, it is taken from that list. During the sweep phase of GC,
1033 string_blocks that are entirely free are freed, except two which
1034 we keep.
1036 String data is allocated from sblock structures. Strings larger
1037 than LARGE_STRING_BYTES, get their own sblock, data for smaller
1038 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
1040 Sblocks consist internally of sdata structures, one for each
1041 Lisp_String. The sdata structure points to the Lisp_String it
1042 belongs to. The Lisp_String points back to the `u.data' member of
1043 its sdata structure.
1045 When a Lisp_String is freed during GC, it is put back on
1046 string_free_list, and its `data' member and its sdata's `string'
1047 pointer is set to null. The size of the string is recorded in the
1048 `u.nbytes' member of the sdata. So, sdata structures that are no
1049 longer used, can be easily recognized, and it's easy to compact the
1050 sblocks of small strings which we do in compact_small_strings. */
1052 /* Size in bytes of an sblock structure used for small strings. This
1053 is 8192 minus malloc overhead. */
1055 #define SBLOCK_SIZE 8188
1057 /* Strings larger than this are considered large strings. String data
1058 for large strings is allocated from individual sblocks. */
1060 #define LARGE_STRING_BYTES 1024
1062 /* Structure describing string memory sub-allocated from an sblock.
1063 This is where the contents of Lisp strings are stored. */
1065 struct sdata
1067 /* Back-pointer to the string this sdata belongs to. If null, this
1068 structure is free, and the NBYTES member of the union below
1069 contains the string's byte size (the same value that STRING_BYTES
1070 would return if STRING were non-null). If non-null, STRING_BYTES
1071 (STRING) is the size of the data, and DATA contains the string's
1072 contents. */
1073 struct Lisp_String *string;
1075 #ifdef GC_CHECK_STRING_BYTES
1077 EMACS_INT nbytes;
1078 unsigned char data[1];
1080 #define SDATA_NBYTES(S) (S)->nbytes
1081 #define SDATA_DATA(S) (S)->data
1083 #else /* not GC_CHECK_STRING_BYTES */
1085 union
1087 /* When STRING in non-null. */
1088 unsigned char data[1];
1090 /* When STRING is null. */
1091 EMACS_INT nbytes;
1092 } u;
1095 #define SDATA_NBYTES(S) (S)->u.nbytes
1096 #define SDATA_DATA(S) (S)->u.data
1098 #endif /* not GC_CHECK_STRING_BYTES */
1102 /* Structure describing a block of memory which is sub-allocated to
1103 obtain string data memory for strings. Blocks for small strings
1104 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
1105 as large as needed. */
1107 struct sblock
1109 /* Next in list. */
1110 struct sblock *next;
1112 /* Pointer to the next free sdata block. This points past the end
1113 of the sblock if there isn't any space left in this block. */
1114 struct sdata *next_free;
1116 /* Start of data. */
1117 struct sdata first_data;
1120 /* Number of Lisp strings in a string_block structure. The 1020 is
1121 1024 minus malloc overhead. */
1123 #define STRINGS_IN_STRING_BLOCK \
1124 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
1126 /* Structure describing a block from which Lisp_String structures
1127 are allocated. */
1129 struct string_block
1131 struct string_block *next;
1132 struct Lisp_String strings[STRINGS_IN_STRING_BLOCK];
1135 /* Head and tail of the list of sblock structures holding Lisp string
1136 data. We always allocate from current_sblock. The NEXT pointers
1137 in the sblock structures go from oldest_sblock to current_sblock. */
1139 static struct sblock *oldest_sblock, *current_sblock;
1141 /* List of sblocks for large strings. */
1143 static struct sblock *large_sblocks;
1145 /* List of string_block structures, and how many there are. */
1147 static struct string_block *string_blocks;
1148 static int n_string_blocks;
1150 /* Free-list of Lisp_Strings. */
1152 static struct Lisp_String *string_free_list;
1154 /* Number of live and free Lisp_Strings. */
1156 static int total_strings, total_free_strings;
1158 /* Number of bytes used by live strings. */
1160 static int total_string_size;
1162 /* Given a pointer to a Lisp_String S which is on the free-list
1163 string_free_list, return a pointer to its successor in the
1164 free-list. */
1166 #define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
1168 /* Return a pointer to the sdata structure belonging to Lisp string S.
1169 S must be live, i.e. S->data must not be null. S->data is actually
1170 a pointer to the `u.data' member of its sdata structure; the
1171 structure starts at a constant offset in front of that. */
1173 #ifdef GC_CHECK_STRING_BYTES
1175 #define SDATA_OF_STRING(S) \
1176 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *) \
1177 - sizeof (EMACS_INT)))
1179 #else /* not GC_CHECK_STRING_BYTES */
1181 #define SDATA_OF_STRING(S) \
1182 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *)))
1184 #endif /* not GC_CHECK_STRING_BYTES */
1186 /* Value is the size of an sdata structure large enough to hold NBYTES
1187 bytes of string data. The value returned includes a terminating
1188 NUL byte, the size of the sdata structure, and padding. */
1190 #ifdef GC_CHECK_STRING_BYTES
1192 #define SDATA_SIZE(NBYTES) \
1193 ((sizeof (struct Lisp_String *) \
1194 + (NBYTES) + 1 \
1195 + sizeof (EMACS_INT) \
1196 + sizeof (EMACS_INT) - 1) \
1197 & ~(sizeof (EMACS_INT) - 1))
1199 #else /* not GC_CHECK_STRING_BYTES */
1201 #define SDATA_SIZE(NBYTES) \
1202 ((sizeof (struct Lisp_String *) \
1203 + (NBYTES) + 1 \
1204 + sizeof (EMACS_INT) - 1) \
1205 & ~(sizeof (EMACS_INT) - 1))
1207 #endif /* not GC_CHECK_STRING_BYTES */
1209 /* Initialize string allocation. Called from init_alloc_once. */
1211 void
1212 init_strings ()
1214 total_strings = total_free_strings = total_string_size = 0;
1215 oldest_sblock = current_sblock = large_sblocks = NULL;
1216 string_blocks = NULL;
1217 n_string_blocks = 0;
1218 string_free_list = NULL;
1222 #ifdef GC_CHECK_STRING_BYTES
1224 static int check_string_bytes_count;
1226 void check_string_bytes P_ ((int));
1227 void check_sblock P_ ((struct sblock *));
1229 #define CHECK_STRING_BYTES(S) STRING_BYTES (S)
1232 /* Like GC_STRING_BYTES, but with debugging check. */
1235 string_bytes (s)
1236 struct Lisp_String *s;
1238 int nbytes = (s->size_byte < 0 ? s->size : s->size_byte) & ~MARKBIT;
1239 if (!PURE_POINTER_P (s)
1240 && s->data
1241 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1242 abort ();
1243 return nbytes;
1246 /* Check validity of Lisp strings' string_bytes member in B. */
1248 void
1249 check_sblock (b)
1250 struct sblock *b;
1252 struct sdata *from, *end, *from_end;
1254 end = b->next_free;
1256 for (from = &b->first_data; from < end; from = from_end)
1258 /* Compute the next FROM here because copying below may
1259 overwrite data we need to compute it. */
1260 int nbytes;
1262 /* Check that the string size recorded in the string is the
1263 same as the one recorded in the sdata structure. */
1264 if (from->string)
1265 CHECK_STRING_BYTES (from->string);
1267 if (from->string)
1268 nbytes = GC_STRING_BYTES (from->string);
1269 else
1270 nbytes = SDATA_NBYTES (from);
1272 nbytes = SDATA_SIZE (nbytes);
1273 from_end = (struct sdata *) ((char *) from + nbytes);
1278 /* Check validity of Lisp strings' string_bytes member. ALL_P
1279 non-zero means check all strings, otherwise check only most
1280 recently allocated strings. Used for hunting a bug. */
1282 void
1283 check_string_bytes (all_p)
1284 int all_p;
1286 if (all_p)
1288 struct sblock *b;
1290 for (b = large_sblocks; b; b = b->next)
1292 struct Lisp_String *s = b->first_data.string;
1293 if (s)
1294 CHECK_STRING_BYTES (s);
1297 for (b = oldest_sblock; b; b = b->next)
1298 check_sblock (b);
1300 else
1301 check_sblock (current_sblock);
1304 #endif /* GC_CHECK_STRING_BYTES */
1307 /* Return a new Lisp_String. */
1309 static struct Lisp_String *
1310 allocate_string ()
1312 struct Lisp_String *s;
1314 /* If the free-list is empty, allocate a new string_block, and
1315 add all the Lisp_Strings in it to the free-list. */
1316 if (string_free_list == NULL)
1318 struct string_block *b;
1319 int i;
1321 b = (struct string_block *) lisp_malloc (sizeof *b, MEM_TYPE_STRING);
1322 bzero (b, sizeof *b);
1323 b->next = string_blocks;
1324 string_blocks = b;
1325 ++n_string_blocks;
1327 for (i = STRINGS_IN_STRING_BLOCK - 1; i >= 0; --i)
1329 s = b->strings + i;
1330 NEXT_FREE_LISP_STRING (s) = string_free_list;
1331 string_free_list = s;
1334 total_free_strings += STRINGS_IN_STRING_BLOCK;
1337 /* Pop a Lisp_String off the free-list. */
1338 s = string_free_list;
1339 string_free_list = NEXT_FREE_LISP_STRING (s);
1341 /* Probably not strictly necessary, but play it safe. */
1342 bzero (s, sizeof *s);
1344 --total_free_strings;
1345 ++total_strings;
1346 ++strings_consed;
1347 consing_since_gc += sizeof *s;
1349 #ifdef GC_CHECK_STRING_BYTES
1350 if (!noninteractive
1351 #ifdef MAC_OS8
1352 && current_sblock
1353 #endif
1356 if (++check_string_bytes_count == 200)
1358 check_string_bytes_count = 0;
1359 check_string_bytes (1);
1361 else
1362 check_string_bytes (0);
1364 #endif /* GC_CHECK_STRING_BYTES */
1366 return s;
1370 /* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
1371 plus a NUL byte at the end. Allocate an sdata structure for S, and
1372 set S->data to its `u.data' member. Store a NUL byte at the end of
1373 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
1374 S->data if it was initially non-null. */
1376 void
1377 allocate_string_data (s, nchars, nbytes)
1378 struct Lisp_String *s;
1379 int nchars, nbytes;
1381 struct sdata *data, *old_data;
1382 struct sblock *b;
1383 int needed, old_nbytes;
1385 /* Determine the number of bytes needed to store NBYTES bytes
1386 of string data. */
1387 needed = SDATA_SIZE (nbytes);
1389 if (nbytes > LARGE_STRING_BYTES)
1391 size_t size = sizeof *b - sizeof (struct sdata) + needed;
1393 #ifdef DOUG_LEA_MALLOC
1394 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
1395 because mapped region contents are not preserved in
1396 a dumped Emacs. */
1397 mallopt (M_MMAP_MAX, 0);
1398 #endif
1400 b = (struct sblock *) lisp_malloc (size, MEM_TYPE_NON_LISP);
1402 #ifdef DOUG_LEA_MALLOC
1403 /* Back to a reasonable maximum of mmap'ed areas. */
1404 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1405 #endif
1407 b->next_free = &b->first_data;
1408 b->first_data.string = NULL;
1409 b->next = large_sblocks;
1410 large_sblocks = b;
1412 else if (current_sblock == NULL
1413 || (((char *) current_sblock + SBLOCK_SIZE
1414 - (char *) current_sblock->next_free)
1415 < needed))
1417 /* Not enough room in the current sblock. */
1418 b = (struct sblock *) lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP);
1419 b->next_free = &b->first_data;
1420 b->first_data.string = NULL;
1421 b->next = NULL;
1423 if (current_sblock)
1424 current_sblock->next = b;
1425 else
1426 oldest_sblock = b;
1427 current_sblock = b;
1429 else
1430 b = current_sblock;
1432 old_data = s->data ? SDATA_OF_STRING (s) : NULL;
1433 old_nbytes = GC_STRING_BYTES (s);
1435 data = b->next_free;
1436 data->string = s;
1437 s->data = SDATA_DATA (data);
1438 #ifdef GC_CHECK_STRING_BYTES
1439 SDATA_NBYTES (data) = nbytes;
1440 #endif
1441 s->size = nchars;
1442 s->size_byte = nbytes;
1443 s->data[nbytes] = '\0';
1444 b->next_free = (struct sdata *) ((char *) data + needed);
1446 /* If S had already data assigned, mark that as free by setting its
1447 string back-pointer to null, and recording the size of the data
1448 in it. */
1449 if (old_data)
1451 SDATA_NBYTES (old_data) = old_nbytes;
1452 old_data->string = NULL;
1455 consing_since_gc += needed;
1459 /* Sweep and compact strings. */
1461 static void
1462 sweep_strings ()
1464 struct string_block *b, *next;
1465 struct string_block *live_blocks = NULL;
1467 string_free_list = NULL;
1468 total_strings = total_free_strings = 0;
1469 total_string_size = 0;
1471 /* Scan strings_blocks, free Lisp_Strings that aren't marked. */
1472 for (b = string_blocks; b; b = next)
1474 int i, nfree = 0;
1475 struct Lisp_String *free_list_before = string_free_list;
1477 next = b->next;
1479 for (i = 0; i < STRINGS_IN_STRING_BLOCK; ++i)
1481 struct Lisp_String *s = b->strings + i;
1483 if (s->data)
1485 /* String was not on free-list before. */
1486 if (STRING_MARKED_P (s))
1488 /* String is live; unmark it and its intervals. */
1489 UNMARK_STRING (s);
1491 if (!NULL_INTERVAL_P (s->intervals))
1492 UNMARK_BALANCE_INTERVALS (s->intervals);
1494 ++total_strings;
1495 total_string_size += STRING_BYTES (s);
1497 else
1499 /* String is dead. Put it on the free-list. */
1500 struct sdata *data = SDATA_OF_STRING (s);
1502 /* Save the size of S in its sdata so that we know
1503 how large that is. Reset the sdata's string
1504 back-pointer so that we know it's free. */
1505 #ifdef GC_CHECK_STRING_BYTES
1506 if (GC_STRING_BYTES (s) != SDATA_NBYTES (data))
1507 abort ();
1508 #else
1509 data->u.nbytes = GC_STRING_BYTES (s);
1510 #endif
1511 data->string = NULL;
1513 /* Reset the strings's `data' member so that we
1514 know it's free. */
1515 s->data = NULL;
1517 /* Put the string on the free-list. */
1518 NEXT_FREE_LISP_STRING (s) = string_free_list;
1519 string_free_list = s;
1520 ++nfree;
1523 else
1525 /* S was on the free-list before. Put it there again. */
1526 NEXT_FREE_LISP_STRING (s) = string_free_list;
1527 string_free_list = s;
1528 ++nfree;
1532 /* Free blocks that contain free Lisp_Strings only, except
1533 the first two of them. */
1534 if (nfree == STRINGS_IN_STRING_BLOCK
1535 && total_free_strings > STRINGS_IN_STRING_BLOCK)
1537 lisp_free (b);
1538 --n_string_blocks;
1539 string_free_list = free_list_before;
1541 else
1543 total_free_strings += nfree;
1544 b->next = live_blocks;
1545 live_blocks = b;
1549 string_blocks = live_blocks;
1550 free_large_strings ();
1551 compact_small_strings ();
1555 /* Free dead large strings. */
1557 static void
1558 free_large_strings ()
1560 struct sblock *b, *next;
1561 struct sblock *live_blocks = NULL;
1563 for (b = large_sblocks; b; b = next)
1565 next = b->next;
1567 if (b->first_data.string == NULL)
1568 lisp_free (b);
1569 else
1571 b->next = live_blocks;
1572 live_blocks = b;
1576 large_sblocks = live_blocks;
1580 /* Compact data of small strings. Free sblocks that don't contain
1581 data of live strings after compaction. */
1583 static void
1584 compact_small_strings ()
1586 struct sblock *b, *tb, *next;
1587 struct sdata *from, *to, *end, *tb_end;
1588 struct sdata *to_end, *from_end;
1590 /* TB is the sblock we copy to, TO is the sdata within TB we copy
1591 to, and TB_END is the end of TB. */
1592 tb = oldest_sblock;
1593 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
1594 to = &tb->first_data;
1596 /* Step through the blocks from the oldest to the youngest. We
1597 expect that old blocks will stabilize over time, so that less
1598 copying will happen this way. */
1599 for (b = oldest_sblock; b; b = b->next)
1601 end = b->next_free;
1602 xassert ((char *) end <= (char *) b + SBLOCK_SIZE);
1604 for (from = &b->first_data; from < end; from = from_end)
1606 /* Compute the next FROM here because copying below may
1607 overwrite data we need to compute it. */
1608 int nbytes;
1610 #ifdef GC_CHECK_STRING_BYTES
1611 /* Check that the string size recorded in the string is the
1612 same as the one recorded in the sdata structure. */
1613 if (from->string
1614 && GC_STRING_BYTES (from->string) != SDATA_NBYTES (from))
1615 abort ();
1616 #endif /* GC_CHECK_STRING_BYTES */
1618 if (from->string)
1619 nbytes = GC_STRING_BYTES (from->string);
1620 else
1621 nbytes = SDATA_NBYTES (from);
1623 nbytes = SDATA_SIZE (nbytes);
1624 from_end = (struct sdata *) ((char *) from + nbytes);
1626 /* FROM->string non-null means it's alive. Copy its data. */
1627 if (from->string)
1629 /* If TB is full, proceed with the next sblock. */
1630 to_end = (struct sdata *) ((char *) to + nbytes);
1631 if (to_end > tb_end)
1633 tb->next_free = to;
1634 tb = tb->next;
1635 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
1636 to = &tb->first_data;
1637 to_end = (struct sdata *) ((char *) to + nbytes);
1640 /* Copy, and update the string's `data' pointer. */
1641 if (from != to)
1643 xassert (tb != b || to <= from);
1644 safe_bcopy ((char *) from, (char *) to, nbytes);
1645 to->string->data = SDATA_DATA (to);
1648 /* Advance past the sdata we copied to. */
1649 to = to_end;
1654 /* The rest of the sblocks following TB don't contain live data, so
1655 we can free them. */
1656 for (b = tb->next; b; b = next)
1658 next = b->next;
1659 lisp_free (b);
1662 tb->next_free = to;
1663 tb->next = NULL;
1664 current_sblock = tb;
1668 DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
1669 doc: /* Return a newly created string of length LENGTH, with each element being INIT.
1670 Both LENGTH and INIT must be numbers. */)
1671 (length, init)
1672 Lisp_Object length, init;
1674 register Lisp_Object val;
1675 register unsigned char *p, *end;
1676 int c, nbytes;
1678 CHECK_NATNUM (length);
1679 CHECK_NUMBER (init);
1681 c = XINT (init);
1682 if (SINGLE_BYTE_CHAR_P (c))
1684 nbytes = XINT (length);
1685 val = make_uninit_string (nbytes);
1686 p = SDATA (val);
1687 end = p + SCHARS (val);
1688 while (p != end)
1689 *p++ = c;
1691 else
1693 unsigned char str[MAX_MULTIBYTE_LENGTH];
1694 int len = CHAR_STRING (c, str);
1696 nbytes = len * XINT (length);
1697 val = make_uninit_multibyte_string (XINT (length), nbytes);
1698 p = SDATA (val);
1699 end = p + nbytes;
1700 while (p != end)
1702 bcopy (str, p, len);
1703 p += len;
1707 *p = 0;
1708 return val;
1712 DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
1713 doc: /* Return a new bool-vector of length LENGTH, using INIT for as each element.
1714 LENGTH must be a number. INIT matters only in whether it is t or nil. */)
1715 (length, init)
1716 Lisp_Object length, init;
1718 register Lisp_Object val;
1719 struct Lisp_Bool_Vector *p;
1720 int real_init, i;
1721 int length_in_chars, length_in_elts, bits_per_value;
1723 CHECK_NATNUM (length);
1725 bits_per_value = sizeof (EMACS_INT) * BITS_PER_CHAR;
1727 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
1728 length_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1) / BITS_PER_CHAR);
1730 /* We must allocate one more elements than LENGTH_IN_ELTS for the
1731 slot `size' of the struct Lisp_Bool_Vector. */
1732 val = Fmake_vector (make_number (length_in_elts + 1), Qnil);
1733 p = XBOOL_VECTOR (val);
1735 /* Get rid of any bits that would cause confusion. */
1736 p->vector_size = 0;
1737 XSETBOOL_VECTOR (val, p);
1738 p->size = XFASTINT (length);
1740 real_init = (NILP (init) ? 0 : -1);
1741 for (i = 0; i < length_in_chars ; i++)
1742 p->data[i] = real_init;
1744 /* Clear the extraneous bits in the last byte. */
1745 if (XINT (length) != length_in_chars * BITS_PER_CHAR)
1746 XBOOL_VECTOR (val)->data[length_in_chars - 1]
1747 &= (1 << (XINT (length) % BITS_PER_CHAR)) - 1;
1749 return val;
1753 /* Make a string from NBYTES bytes at CONTENTS, and compute the number
1754 of characters from the contents. This string may be unibyte or
1755 multibyte, depending on the contents. */
1757 Lisp_Object
1758 make_string (contents, nbytes)
1759 const char *contents;
1760 int nbytes;
1762 register Lisp_Object val;
1763 int nchars, multibyte_nbytes;
1765 parse_str_as_multibyte (contents, nbytes, &nchars, &multibyte_nbytes);
1766 if (nbytes == nchars || nbytes != multibyte_nbytes)
1767 /* CONTENTS contains no multibyte sequences or contains an invalid
1768 multibyte sequence. We must make unibyte string. */
1769 val = make_unibyte_string (contents, nbytes);
1770 else
1771 val = make_multibyte_string (contents, nchars, nbytes);
1772 return val;
1776 /* Make an unibyte string from LENGTH bytes at CONTENTS. */
1778 Lisp_Object
1779 make_unibyte_string (contents, length)
1780 const char *contents;
1781 int length;
1783 register Lisp_Object val;
1784 val = make_uninit_string (length);
1785 bcopy (contents, SDATA (val), length);
1786 STRING_SET_UNIBYTE (val);
1787 return val;
1791 /* Make a multibyte string from NCHARS characters occupying NBYTES
1792 bytes at CONTENTS. */
1794 Lisp_Object
1795 make_multibyte_string (contents, nchars, nbytes)
1796 const char *contents;
1797 int nchars, nbytes;
1799 register Lisp_Object val;
1800 val = make_uninit_multibyte_string (nchars, nbytes);
1801 bcopy (contents, SDATA (val), nbytes);
1802 return val;
1806 /* Make a string from NCHARS characters occupying NBYTES bytes at
1807 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
1809 Lisp_Object
1810 make_string_from_bytes (contents, nchars, nbytes)
1811 const char *contents;
1812 int nchars, nbytes;
1814 register Lisp_Object val;
1815 val = make_uninit_multibyte_string (nchars, nbytes);
1816 bcopy (contents, SDATA (val), nbytes);
1817 if (SBYTES (val) == SCHARS (val))
1818 STRING_SET_UNIBYTE (val);
1819 return val;
1823 /* Make a string from NCHARS characters occupying NBYTES bytes at
1824 CONTENTS. The argument MULTIBYTE controls whether to label the
1825 string as multibyte. If NCHARS is negative, it counts the number of
1826 characters by itself. */
1828 Lisp_Object
1829 make_specified_string (contents, nchars, nbytes, multibyte)
1830 const char *contents;
1831 int nchars, nbytes;
1832 int multibyte;
1834 register Lisp_Object val;
1836 if (nchars < 0)
1838 if (multibyte)
1839 nchars = multibyte_chars_in_text (contents, nbytes);
1840 else
1841 nchars = nbytes;
1843 val = make_uninit_multibyte_string (nchars, nbytes);
1844 bcopy (contents, SDATA (val), nbytes);
1845 if (!multibyte)
1846 STRING_SET_UNIBYTE (val);
1847 return val;
1851 /* Make a string from the data at STR, treating it as multibyte if the
1852 data warrants. */
1854 Lisp_Object
1855 build_string (str)
1856 const char *str;
1858 return make_string (str, strlen (str));
1862 /* Return an unibyte Lisp_String set up to hold LENGTH characters
1863 occupying LENGTH bytes. */
1865 Lisp_Object
1866 make_uninit_string (length)
1867 int length;
1869 Lisp_Object val;
1870 val = make_uninit_multibyte_string (length, length);
1871 STRING_SET_UNIBYTE (val);
1872 return val;
1876 /* Return a multibyte Lisp_String set up to hold NCHARS characters
1877 which occupy NBYTES bytes. */
1879 Lisp_Object
1880 make_uninit_multibyte_string (nchars, nbytes)
1881 int nchars, nbytes;
1883 Lisp_Object string;
1884 struct Lisp_String *s;
1886 if (nchars < 0)
1887 abort ();
1889 s = allocate_string ();
1890 allocate_string_data (s, nchars, nbytes);
1891 XSETSTRING (string, s);
1892 string_chars_consed += nbytes;
1893 return string;
1898 /***********************************************************************
1899 Float Allocation
1900 ***********************************************************************/
1902 /* We store float cells inside of float_blocks, allocating a new
1903 float_block with malloc whenever necessary. Float cells reclaimed
1904 by GC are put on a free list to be reallocated before allocating
1905 any new float cells from the latest float_block.
1907 Each float_block is just under 1020 bytes long, since malloc really
1908 allocates in units of powers of two and uses 4 bytes for its own
1909 overhead. */
1911 #define FLOAT_BLOCK_SIZE \
1912 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float))
1914 struct float_block
1916 struct float_block *next;
1917 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
1920 /* Current float_block. */
1922 struct float_block *float_block;
1924 /* Index of first unused Lisp_Float in the current float_block. */
1926 int float_block_index;
1928 /* Total number of float blocks now in use. */
1930 int n_float_blocks;
1932 /* Free-list of Lisp_Floats. */
1934 struct Lisp_Float *float_free_list;
1937 /* Initialize float allocation. */
1939 void
1940 init_float ()
1942 float_block = (struct float_block *) lisp_malloc (sizeof *float_block,
1943 MEM_TYPE_FLOAT);
1944 float_block->next = 0;
1945 bzero ((char *) float_block->floats, sizeof float_block->floats);
1946 float_block_index = 0;
1947 float_free_list = 0;
1948 n_float_blocks = 1;
1952 /* Explicitly free a float cell by putting it on the free-list. */
1954 void
1955 free_float (ptr)
1956 struct Lisp_Float *ptr;
1958 *(struct Lisp_Float **)&ptr->data = float_free_list;
1959 #if GC_MARK_STACK
1960 ptr->type = Vdead;
1961 #endif
1962 float_free_list = ptr;
1966 /* Return a new float object with value FLOAT_VALUE. */
1968 Lisp_Object
1969 make_float (float_value)
1970 double float_value;
1972 register Lisp_Object val;
1974 if (float_free_list)
1976 /* We use the data field for chaining the free list
1977 so that we won't use the same field that has the mark bit. */
1978 XSETFLOAT (val, float_free_list);
1979 float_free_list = *(struct Lisp_Float **)&float_free_list->data;
1981 else
1983 if (float_block_index == FLOAT_BLOCK_SIZE)
1985 register struct float_block *new;
1987 new = (struct float_block *) lisp_malloc (sizeof *new,
1988 MEM_TYPE_FLOAT);
1989 new->next = float_block;
1990 float_block = new;
1991 float_block_index = 0;
1992 n_float_blocks++;
1994 XSETFLOAT (val, &float_block->floats[float_block_index++]);
1997 XFLOAT_DATA (val) = float_value;
1998 XSETFASTINT (XFLOAT (val)->type, 0); /* bug chasing -wsr */
1999 consing_since_gc += sizeof (struct Lisp_Float);
2000 floats_consed++;
2001 return val;
2006 /***********************************************************************
2007 Cons Allocation
2008 ***********************************************************************/
2010 /* We store cons cells inside of cons_blocks, allocating a new
2011 cons_block with malloc whenever necessary. Cons cells reclaimed by
2012 GC are put on a free list to be reallocated before allocating
2013 any new cons cells from the latest cons_block.
2015 Each cons_block is just under 1020 bytes long,
2016 since malloc really allocates in units of powers of two
2017 and uses 4 bytes for its own overhead. */
2019 #define CONS_BLOCK_SIZE \
2020 ((1020 - sizeof (struct cons_block *)) / sizeof (struct Lisp_Cons))
2022 struct cons_block
2024 struct cons_block *next;
2025 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
2028 /* Current cons_block. */
2030 struct cons_block *cons_block;
2032 /* Index of first unused Lisp_Cons in the current block. */
2034 int cons_block_index;
2036 /* Free-list of Lisp_Cons structures. */
2038 struct Lisp_Cons *cons_free_list;
2040 /* Total number of cons blocks now in use. */
2042 int n_cons_blocks;
2045 /* Initialize cons allocation. */
2047 void
2048 init_cons ()
2050 cons_block = (struct cons_block *) lisp_malloc (sizeof *cons_block,
2051 MEM_TYPE_CONS);
2052 cons_block->next = 0;
2053 bzero ((char *) cons_block->conses, sizeof cons_block->conses);
2054 cons_block_index = 0;
2055 cons_free_list = 0;
2056 n_cons_blocks = 1;
2060 /* Explicitly free a cons cell by putting it on the free-list. */
2062 void
2063 free_cons (ptr)
2064 struct Lisp_Cons *ptr;
2066 *(struct Lisp_Cons **)&ptr->cdr = cons_free_list;
2067 #if GC_MARK_STACK
2068 ptr->car = Vdead;
2069 #endif
2070 cons_free_list = ptr;
2074 DEFUN ("cons", Fcons, Scons, 2, 2, 0,
2075 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
2076 (car, cdr)
2077 Lisp_Object car, cdr;
2079 register Lisp_Object val;
2081 if (cons_free_list)
2083 /* We use the cdr for chaining the free list
2084 so that we won't use the same field that has the mark bit. */
2085 XSETCONS (val, cons_free_list);
2086 cons_free_list = *(struct Lisp_Cons **)&cons_free_list->cdr;
2088 else
2090 if (cons_block_index == CONS_BLOCK_SIZE)
2092 register struct cons_block *new;
2093 new = (struct cons_block *) lisp_malloc (sizeof *new,
2094 MEM_TYPE_CONS);
2095 new->next = cons_block;
2096 cons_block = new;
2097 cons_block_index = 0;
2098 n_cons_blocks++;
2100 XSETCONS (val, &cons_block->conses[cons_block_index++]);
2103 XSETCAR (val, car);
2104 XSETCDR (val, cdr);
2105 consing_since_gc += sizeof (struct Lisp_Cons);
2106 cons_cells_consed++;
2107 return val;
2111 /* Make a list of 2, 3, 4 or 5 specified objects. */
2113 Lisp_Object
2114 list2 (arg1, arg2)
2115 Lisp_Object arg1, arg2;
2117 return Fcons (arg1, Fcons (arg2, Qnil));
2121 Lisp_Object
2122 list3 (arg1, arg2, arg3)
2123 Lisp_Object arg1, arg2, arg3;
2125 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
2129 Lisp_Object
2130 list4 (arg1, arg2, arg3, arg4)
2131 Lisp_Object arg1, arg2, arg3, arg4;
2133 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
2137 Lisp_Object
2138 list5 (arg1, arg2, arg3, arg4, arg5)
2139 Lisp_Object arg1, arg2, arg3, arg4, arg5;
2141 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
2142 Fcons (arg5, Qnil)))));
2146 DEFUN ("list", Flist, Slist, 0, MANY, 0,
2147 doc: /* Return a newly created list with specified arguments as elements.
2148 Any number of arguments, even zero arguments, are allowed.
2149 usage: (list &rest OBJECTS) */)
2150 (nargs, args)
2151 int nargs;
2152 register Lisp_Object *args;
2154 register Lisp_Object val;
2155 val = Qnil;
2157 while (nargs > 0)
2159 nargs--;
2160 val = Fcons (args[nargs], val);
2162 return val;
2166 DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
2167 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
2168 (length, init)
2169 register Lisp_Object length, init;
2171 register Lisp_Object val;
2172 register int size;
2174 CHECK_NATNUM (length);
2175 size = XFASTINT (length);
2177 val = Qnil;
2178 while (size > 0)
2180 val = Fcons (init, val);
2181 --size;
2183 if (size > 0)
2185 val = Fcons (init, val);
2186 --size;
2188 if (size > 0)
2190 val = Fcons (init, val);
2191 --size;
2193 if (size > 0)
2195 val = Fcons (init, val);
2196 --size;
2198 if (size > 0)
2200 val = Fcons (init, val);
2201 --size;
2207 QUIT;
2210 return val;
2215 /***********************************************************************
2216 Vector Allocation
2217 ***********************************************************************/
2219 /* Singly-linked list of all vectors. */
2221 struct Lisp_Vector *all_vectors;
2223 /* Total number of vector-like objects now in use. */
2225 int n_vectors;
2228 /* Value is a pointer to a newly allocated Lisp_Vector structure
2229 with room for LEN Lisp_Objects. */
2231 static struct Lisp_Vector *
2232 allocate_vectorlike (len, type)
2233 EMACS_INT len;
2234 enum mem_type type;
2236 struct Lisp_Vector *p;
2237 size_t nbytes;
2239 #ifdef DOUG_LEA_MALLOC
2240 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
2241 because mapped region contents are not preserved in
2242 a dumped Emacs. */
2243 mallopt (M_MMAP_MAX, 0);
2244 #endif
2246 nbytes = sizeof *p + (len - 1) * sizeof p->contents[0];
2247 p = (struct Lisp_Vector *) lisp_malloc (nbytes, type);
2249 #ifdef DOUG_LEA_MALLOC
2250 /* Back to a reasonable maximum of mmap'ed areas. */
2251 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
2252 #endif
2254 consing_since_gc += nbytes;
2255 vector_cells_consed += len;
2257 p->next = all_vectors;
2258 all_vectors = p;
2259 ++n_vectors;
2260 return p;
2264 /* Allocate a vector with NSLOTS slots. */
2266 struct Lisp_Vector *
2267 allocate_vector (nslots)
2268 EMACS_INT nslots;
2270 struct Lisp_Vector *v = allocate_vectorlike (nslots, MEM_TYPE_VECTOR);
2271 v->size = nslots;
2272 return v;
2276 /* Allocate other vector-like structures. */
2278 struct Lisp_Hash_Table *
2279 allocate_hash_table ()
2281 EMACS_INT len = VECSIZE (struct Lisp_Hash_Table);
2282 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_HASH_TABLE);
2283 EMACS_INT i;
2285 v->size = len;
2286 for (i = 0; i < len; ++i)
2287 v->contents[i] = Qnil;
2289 return (struct Lisp_Hash_Table *) v;
2293 struct window *
2294 allocate_window ()
2296 EMACS_INT len = VECSIZE (struct window);
2297 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_WINDOW);
2298 EMACS_INT i;
2300 for (i = 0; i < len; ++i)
2301 v->contents[i] = Qnil;
2302 v->size = len;
2304 return (struct window *) v;
2308 struct frame *
2309 allocate_frame ()
2311 EMACS_INT len = VECSIZE (struct frame);
2312 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_FRAME);
2313 EMACS_INT i;
2315 for (i = 0; i < len; ++i)
2316 v->contents[i] = make_number (0);
2317 v->size = len;
2318 return (struct frame *) v;
2322 struct Lisp_Process *
2323 allocate_process ()
2325 EMACS_INT len = VECSIZE (struct Lisp_Process);
2326 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_PROCESS);
2327 EMACS_INT i;
2329 for (i = 0; i < len; ++i)
2330 v->contents[i] = Qnil;
2331 v->size = len;
2333 return (struct Lisp_Process *) v;
2337 struct Lisp_Vector *
2338 allocate_other_vector (len)
2339 EMACS_INT len;
2341 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_VECTOR);
2342 EMACS_INT i;
2344 for (i = 0; i < len; ++i)
2345 v->contents[i] = Qnil;
2346 v->size = len;
2348 return v;
2352 DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
2353 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
2354 See also the function `vector'. */)
2355 (length, init)
2356 register Lisp_Object length, init;
2358 Lisp_Object vector;
2359 register EMACS_INT sizei;
2360 register int index;
2361 register struct Lisp_Vector *p;
2363 CHECK_NATNUM (length);
2364 sizei = XFASTINT (length);
2366 p = allocate_vector (sizei);
2367 for (index = 0; index < sizei; index++)
2368 p->contents[index] = init;
2370 XSETVECTOR (vector, p);
2371 return vector;
2375 DEFUN ("make-char-table", Fmake_char_table, Smake_char_table, 1, 2, 0,
2376 doc: /* Return a newly created char-table, with purpose PURPOSE.
2377 Each element is initialized to INIT, which defaults to nil.
2378 PURPOSE should be a symbol which has a `char-table-extra-slots' property.
2379 The property's value should be an integer between 0 and 10. */)
2380 (purpose, init)
2381 register Lisp_Object purpose, init;
2383 Lisp_Object vector;
2384 Lisp_Object n;
2385 CHECK_SYMBOL (purpose);
2386 n = Fget (purpose, Qchar_table_extra_slots);
2387 CHECK_NUMBER (n);
2388 if (XINT (n) < 0 || XINT (n) > 10)
2389 args_out_of_range (n, Qnil);
2390 /* Add 2 to the size for the defalt and parent slots. */
2391 vector = Fmake_vector (make_number (CHAR_TABLE_STANDARD_SLOTS + XINT (n)),
2392 init);
2393 XCHAR_TABLE (vector)->top = Qt;
2394 XCHAR_TABLE (vector)->parent = Qnil;
2395 XCHAR_TABLE (vector)->purpose = purpose;
2396 XSETCHAR_TABLE (vector, XCHAR_TABLE (vector));
2397 return vector;
2401 /* Return a newly created sub char table with default value DEFALT.
2402 Since a sub char table does not appear as a top level Emacs Lisp
2403 object, we don't need a Lisp interface to make it. */
2405 Lisp_Object
2406 make_sub_char_table (defalt)
2407 Lisp_Object defalt;
2409 Lisp_Object vector
2410 = Fmake_vector (make_number (SUB_CHAR_TABLE_STANDARD_SLOTS), Qnil);
2411 XCHAR_TABLE (vector)->top = Qnil;
2412 XCHAR_TABLE (vector)->defalt = defalt;
2413 XSETCHAR_TABLE (vector, XCHAR_TABLE (vector));
2414 return vector;
2418 DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
2419 doc: /* Return a newly created vector with specified arguments as elements.
2420 Any number of arguments, even zero arguments, are allowed.
2421 usage: (vector &rest OBJECTS) */)
2422 (nargs, args)
2423 register int nargs;
2424 Lisp_Object *args;
2426 register Lisp_Object len, val;
2427 register int index;
2428 register struct Lisp_Vector *p;
2430 XSETFASTINT (len, nargs);
2431 val = Fmake_vector (len, Qnil);
2432 p = XVECTOR (val);
2433 for (index = 0; index < nargs; index++)
2434 p->contents[index] = args[index];
2435 return val;
2439 DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
2440 doc: /* Create a byte-code object with specified arguments as elements.
2441 The arguments should be the arglist, bytecode-string, constant vector,
2442 stack size, (optional) doc string, and (optional) interactive spec.
2443 The first four arguments are required; at most six have any
2444 significance.
2445 usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
2446 (nargs, args)
2447 register int nargs;
2448 Lisp_Object *args;
2450 register Lisp_Object len, val;
2451 register int index;
2452 register struct Lisp_Vector *p;
2454 XSETFASTINT (len, nargs);
2455 if (!NILP (Vpurify_flag))
2456 val = make_pure_vector ((EMACS_INT) nargs);
2457 else
2458 val = Fmake_vector (len, Qnil);
2460 if (STRINGP (args[1]) && STRING_MULTIBYTE (args[1]))
2461 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
2462 earlier because they produced a raw 8-bit string for byte-code
2463 and now such a byte-code string is loaded as multibyte while
2464 raw 8-bit characters converted to multibyte form. Thus, now we
2465 must convert them back to the original unibyte form. */
2466 args[1] = Fstring_as_unibyte (args[1]);
2468 p = XVECTOR (val);
2469 for (index = 0; index < nargs; index++)
2471 if (!NILP (Vpurify_flag))
2472 args[index] = Fpurecopy (args[index]);
2473 p->contents[index] = args[index];
2475 XSETCOMPILED (val, p);
2476 return val;
2481 /***********************************************************************
2482 Symbol Allocation
2483 ***********************************************************************/
2485 /* Each symbol_block is just under 1020 bytes long, since malloc
2486 really allocates in units of powers of two and uses 4 bytes for its
2487 own overhead. */
2489 #define SYMBOL_BLOCK_SIZE \
2490 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
2492 struct symbol_block
2494 struct symbol_block *next;
2495 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
2498 /* Current symbol block and index of first unused Lisp_Symbol
2499 structure in it. */
2501 struct symbol_block *symbol_block;
2502 int symbol_block_index;
2504 /* List of free symbols. */
2506 struct Lisp_Symbol *symbol_free_list;
2508 /* Total number of symbol blocks now in use. */
2510 int n_symbol_blocks;
2513 /* Initialize symbol allocation. */
2515 void
2516 init_symbol ()
2518 symbol_block = (struct symbol_block *) lisp_malloc (sizeof *symbol_block,
2519 MEM_TYPE_SYMBOL);
2520 symbol_block->next = 0;
2521 bzero ((char *) symbol_block->symbols, sizeof symbol_block->symbols);
2522 symbol_block_index = 0;
2523 symbol_free_list = 0;
2524 n_symbol_blocks = 1;
2528 DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
2529 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
2530 Its value and function definition are void, and its property list is nil. */)
2531 (name)
2532 Lisp_Object name;
2534 register Lisp_Object val;
2535 register struct Lisp_Symbol *p;
2537 CHECK_STRING (name);
2539 if (symbol_free_list)
2541 XSETSYMBOL (val, symbol_free_list);
2542 symbol_free_list = *(struct Lisp_Symbol **)&symbol_free_list->value;
2544 else
2546 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
2548 struct symbol_block *new;
2549 new = (struct symbol_block *) lisp_malloc (sizeof *new,
2550 MEM_TYPE_SYMBOL);
2551 new->next = symbol_block;
2552 symbol_block = new;
2553 symbol_block_index = 0;
2554 n_symbol_blocks++;
2556 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index++]);
2559 p = XSYMBOL (val);
2560 p->xname = name;
2561 p->plist = Qnil;
2562 p->value = Qunbound;
2563 p->function = Qunbound;
2564 p->next = NULL;
2565 p->interned = SYMBOL_UNINTERNED;
2566 p->constant = 0;
2567 p->indirect_variable = 0;
2568 consing_since_gc += sizeof (struct Lisp_Symbol);
2569 symbols_consed++;
2570 return val;
2575 /***********************************************************************
2576 Marker (Misc) Allocation
2577 ***********************************************************************/
2579 /* Allocation of markers and other objects that share that structure.
2580 Works like allocation of conses. */
2582 #define MARKER_BLOCK_SIZE \
2583 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
2585 struct marker_block
2587 struct marker_block *next;
2588 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
2591 struct marker_block *marker_block;
2592 int marker_block_index;
2594 union Lisp_Misc *marker_free_list;
2596 /* Total number of marker blocks now in use. */
2598 int n_marker_blocks;
2600 void
2601 init_marker ()
2603 marker_block = (struct marker_block *) lisp_malloc (sizeof *marker_block,
2604 MEM_TYPE_MISC);
2605 marker_block->next = 0;
2606 bzero ((char *) marker_block->markers, sizeof marker_block->markers);
2607 marker_block_index = 0;
2608 marker_free_list = 0;
2609 n_marker_blocks = 1;
2612 /* Return a newly allocated Lisp_Misc object, with no substructure. */
2614 Lisp_Object
2615 allocate_misc ()
2617 Lisp_Object val;
2619 if (marker_free_list)
2621 XSETMISC (val, marker_free_list);
2622 marker_free_list = marker_free_list->u_free.chain;
2624 else
2626 if (marker_block_index == MARKER_BLOCK_SIZE)
2628 struct marker_block *new;
2629 new = (struct marker_block *) lisp_malloc (sizeof *new,
2630 MEM_TYPE_MISC);
2631 new->next = marker_block;
2632 marker_block = new;
2633 marker_block_index = 0;
2634 n_marker_blocks++;
2636 XSETMISC (val, &marker_block->markers[marker_block_index++]);
2639 consing_since_gc += sizeof (union Lisp_Misc);
2640 misc_objects_consed++;
2641 return val;
2644 /* Return a Lisp_Misc_Save_Value object containing POINTER and
2645 INTEGER. This is used to package C values to call record_unwind_protect.
2646 The unwind function can get the C values back using XSAVE_VALUE. */
2648 Lisp_Object
2649 make_save_value (pointer, integer)
2650 void *pointer;
2651 int integer;
2653 register Lisp_Object val;
2654 register struct Lisp_Save_Value *p;
2656 val = allocate_misc ();
2657 XMISCTYPE (val) = Lisp_Misc_Save_Value;
2658 p = XSAVE_VALUE (val);
2659 p->pointer = pointer;
2660 p->integer = integer;
2661 return val;
2664 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
2665 doc: /* Return a newly allocated marker which does not point at any place. */)
2668 register Lisp_Object val;
2669 register struct Lisp_Marker *p;
2671 val = allocate_misc ();
2672 XMISCTYPE (val) = Lisp_Misc_Marker;
2673 p = XMARKER (val);
2674 p->buffer = 0;
2675 p->bytepos = 0;
2676 p->charpos = 0;
2677 p->chain = Qnil;
2678 p->insertion_type = 0;
2679 return val;
2682 /* Put MARKER back on the free list after using it temporarily. */
2684 void
2685 free_marker (marker)
2686 Lisp_Object marker;
2688 unchain_marker (marker);
2690 XMISC (marker)->u_marker.type = Lisp_Misc_Free;
2691 XMISC (marker)->u_free.chain = marker_free_list;
2692 marker_free_list = XMISC (marker);
2694 total_free_markers++;
2698 /* Return a newly created vector or string with specified arguments as
2699 elements. If all the arguments are characters that can fit
2700 in a string of events, make a string; otherwise, make a vector.
2702 Any number of arguments, even zero arguments, are allowed. */
2704 Lisp_Object
2705 make_event_array (nargs, args)
2706 register int nargs;
2707 Lisp_Object *args;
2709 int i;
2711 for (i = 0; i < nargs; i++)
2712 /* The things that fit in a string
2713 are characters that are in 0...127,
2714 after discarding the meta bit and all the bits above it. */
2715 if (!INTEGERP (args[i])
2716 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200)
2717 return Fvector (nargs, args);
2719 /* Since the loop exited, we know that all the things in it are
2720 characters, so we can make a string. */
2722 Lisp_Object result;
2724 result = Fmake_string (make_number (nargs), make_number (0));
2725 for (i = 0; i < nargs; i++)
2727 SSET (result, i, XINT (args[i]));
2728 /* Move the meta bit to the right place for a string char. */
2729 if (XINT (args[i]) & CHAR_META)
2730 SSET (result, i, SREF (result, i) | 0x80);
2733 return result;
2739 /************************************************************************
2740 C Stack Marking
2741 ************************************************************************/
2743 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
2745 /* Conservative C stack marking requires a method to identify possibly
2746 live Lisp objects given a pointer value. We do this by keeping
2747 track of blocks of Lisp data that are allocated in a red-black tree
2748 (see also the comment of mem_node which is the type of nodes in
2749 that tree). Function lisp_malloc adds information for an allocated
2750 block to the red-black tree with calls to mem_insert, and function
2751 lisp_free removes it with mem_delete. Functions live_string_p etc
2752 call mem_find to lookup information about a given pointer in the
2753 tree, and use that to determine if the pointer points to a Lisp
2754 object or not. */
2756 /* Initialize this part of alloc.c. */
2758 static void
2759 mem_init ()
2761 mem_z.left = mem_z.right = MEM_NIL;
2762 mem_z.parent = NULL;
2763 mem_z.color = MEM_BLACK;
2764 mem_z.start = mem_z.end = NULL;
2765 mem_root = MEM_NIL;
2769 /* Value is a pointer to the mem_node containing START. Value is
2770 MEM_NIL if there is no node in the tree containing START. */
2772 static INLINE struct mem_node *
2773 mem_find (start)
2774 void *start;
2776 struct mem_node *p;
2778 if (start < min_heap_address || start > max_heap_address)
2779 return MEM_NIL;
2781 /* Make the search always successful to speed up the loop below. */
2782 mem_z.start = start;
2783 mem_z.end = (char *) start + 1;
2785 p = mem_root;
2786 while (start < p->start || start >= p->end)
2787 p = start < p->start ? p->left : p->right;
2788 return p;
2792 /* Insert a new node into the tree for a block of memory with start
2793 address START, end address END, and type TYPE. Value is a
2794 pointer to the node that was inserted. */
2796 static struct mem_node *
2797 mem_insert (start, end, type)
2798 void *start, *end;
2799 enum mem_type type;
2801 struct mem_node *c, *parent, *x;
2803 if (start < min_heap_address)
2804 min_heap_address = start;
2805 if (end > max_heap_address)
2806 max_heap_address = end;
2808 /* See where in the tree a node for START belongs. In this
2809 particular application, it shouldn't happen that a node is already
2810 present. For debugging purposes, let's check that. */
2811 c = mem_root;
2812 parent = NULL;
2814 #if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
2816 while (c != MEM_NIL)
2818 if (start >= c->start && start < c->end)
2819 abort ();
2820 parent = c;
2821 c = start < c->start ? c->left : c->right;
2824 #else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
2826 while (c != MEM_NIL)
2828 parent = c;
2829 c = start < c->start ? c->left : c->right;
2832 #endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
2834 /* Create a new node. */
2835 #ifdef GC_MALLOC_CHECK
2836 x = (struct mem_node *) _malloc_internal (sizeof *x);
2837 if (x == NULL)
2838 abort ();
2839 #else
2840 x = (struct mem_node *) xmalloc (sizeof *x);
2841 #endif
2842 x->start = start;
2843 x->end = end;
2844 x->type = type;
2845 x->parent = parent;
2846 x->left = x->right = MEM_NIL;
2847 x->color = MEM_RED;
2849 /* Insert it as child of PARENT or install it as root. */
2850 if (parent)
2852 if (start < parent->start)
2853 parent->left = x;
2854 else
2855 parent->right = x;
2857 else
2858 mem_root = x;
2860 /* Re-establish red-black tree properties. */
2861 mem_insert_fixup (x);
2863 return x;
2867 /* Re-establish the red-black properties of the tree, and thereby
2868 balance the tree, after node X has been inserted; X is always red. */
2870 static void
2871 mem_insert_fixup (x)
2872 struct mem_node *x;
2874 while (x != mem_root && x->parent->color == MEM_RED)
2876 /* X is red and its parent is red. This is a violation of
2877 red-black tree property #3. */
2879 if (x->parent == x->parent->parent->left)
2881 /* We're on the left side of our grandparent, and Y is our
2882 "uncle". */
2883 struct mem_node *y = x->parent->parent->right;
2885 if (y->color == MEM_RED)
2887 /* Uncle and parent are red but should be black because
2888 X is red. Change the colors accordingly and proceed
2889 with the grandparent. */
2890 x->parent->color = MEM_BLACK;
2891 y->color = MEM_BLACK;
2892 x->parent->parent->color = MEM_RED;
2893 x = x->parent->parent;
2895 else
2897 /* Parent and uncle have different colors; parent is
2898 red, uncle is black. */
2899 if (x == x->parent->right)
2901 x = x->parent;
2902 mem_rotate_left (x);
2905 x->parent->color = MEM_BLACK;
2906 x->parent->parent->color = MEM_RED;
2907 mem_rotate_right (x->parent->parent);
2910 else
2912 /* This is the symmetrical case of above. */
2913 struct mem_node *y = x->parent->parent->left;
2915 if (y->color == MEM_RED)
2917 x->parent->color = MEM_BLACK;
2918 y->color = MEM_BLACK;
2919 x->parent->parent->color = MEM_RED;
2920 x = x->parent->parent;
2922 else
2924 if (x == x->parent->left)
2926 x = x->parent;
2927 mem_rotate_right (x);
2930 x->parent->color = MEM_BLACK;
2931 x->parent->parent->color = MEM_RED;
2932 mem_rotate_left (x->parent->parent);
2937 /* The root may have been changed to red due to the algorithm. Set
2938 it to black so that property #5 is satisfied. */
2939 mem_root->color = MEM_BLACK;
2943 /* (x) (y)
2944 / \ / \
2945 a (y) ===> (x) c
2946 / \ / \
2947 b c a b */
2949 static void
2950 mem_rotate_left (x)
2951 struct mem_node *x;
2953 struct mem_node *y;
2955 /* Turn y's left sub-tree into x's right sub-tree. */
2956 y = x->right;
2957 x->right = y->left;
2958 if (y->left != MEM_NIL)
2959 y->left->parent = x;
2961 /* Y's parent was x's parent. */
2962 if (y != MEM_NIL)
2963 y->parent = x->parent;
2965 /* Get the parent to point to y instead of x. */
2966 if (x->parent)
2968 if (x == x->parent->left)
2969 x->parent->left = y;
2970 else
2971 x->parent->right = y;
2973 else
2974 mem_root = y;
2976 /* Put x on y's left. */
2977 y->left = x;
2978 if (x != MEM_NIL)
2979 x->parent = y;
2983 /* (x) (Y)
2984 / \ / \
2985 (y) c ===> a (x)
2986 / \ / \
2987 a b b c */
2989 static void
2990 mem_rotate_right (x)
2991 struct mem_node *x;
2993 struct mem_node *y = x->left;
2995 x->left = y->right;
2996 if (y->right != MEM_NIL)
2997 y->right->parent = x;
2999 if (y != MEM_NIL)
3000 y->parent = x->parent;
3001 if (x->parent)
3003 if (x == x->parent->right)
3004 x->parent->right = y;
3005 else
3006 x->parent->left = y;
3008 else
3009 mem_root = y;
3011 y->right = x;
3012 if (x != MEM_NIL)
3013 x->parent = y;
3017 /* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
3019 static void
3020 mem_delete (z)
3021 struct mem_node *z;
3023 struct mem_node *x, *y;
3025 if (!z || z == MEM_NIL)
3026 return;
3028 if (z->left == MEM_NIL || z->right == MEM_NIL)
3029 y = z;
3030 else
3032 y = z->right;
3033 while (y->left != MEM_NIL)
3034 y = y->left;
3037 if (y->left != MEM_NIL)
3038 x = y->left;
3039 else
3040 x = y->right;
3042 x->parent = y->parent;
3043 if (y->parent)
3045 if (y == y->parent->left)
3046 y->parent->left = x;
3047 else
3048 y->parent->right = x;
3050 else
3051 mem_root = x;
3053 if (y != z)
3055 z->start = y->start;
3056 z->end = y->end;
3057 z->type = y->type;
3060 if (y->color == MEM_BLACK)
3061 mem_delete_fixup (x);
3063 #ifdef GC_MALLOC_CHECK
3064 _free_internal (y);
3065 #else
3066 xfree (y);
3067 #endif
3071 /* Re-establish the red-black properties of the tree, after a
3072 deletion. */
3074 static void
3075 mem_delete_fixup (x)
3076 struct mem_node *x;
3078 while (x != mem_root && x->color == MEM_BLACK)
3080 if (x == x->parent->left)
3082 struct mem_node *w = x->parent->right;
3084 if (w->color == MEM_RED)
3086 w->color = MEM_BLACK;
3087 x->parent->color = MEM_RED;
3088 mem_rotate_left (x->parent);
3089 w = x->parent->right;
3092 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
3094 w->color = MEM_RED;
3095 x = x->parent;
3097 else
3099 if (w->right->color == MEM_BLACK)
3101 w->left->color = MEM_BLACK;
3102 w->color = MEM_RED;
3103 mem_rotate_right (w);
3104 w = x->parent->right;
3106 w->color = x->parent->color;
3107 x->parent->color = MEM_BLACK;
3108 w->right->color = MEM_BLACK;
3109 mem_rotate_left (x->parent);
3110 x = mem_root;
3113 else
3115 struct mem_node *w = x->parent->left;
3117 if (w->color == MEM_RED)
3119 w->color = MEM_BLACK;
3120 x->parent->color = MEM_RED;
3121 mem_rotate_right (x->parent);
3122 w = x->parent->left;
3125 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
3127 w->color = MEM_RED;
3128 x = x->parent;
3130 else
3132 if (w->left->color == MEM_BLACK)
3134 w->right->color = MEM_BLACK;
3135 w->color = MEM_RED;
3136 mem_rotate_left (w);
3137 w = x->parent->left;
3140 w->color = x->parent->color;
3141 x->parent->color = MEM_BLACK;
3142 w->left->color = MEM_BLACK;
3143 mem_rotate_right (x->parent);
3144 x = mem_root;
3149 x->color = MEM_BLACK;
3153 /* Value is non-zero if P is a pointer to a live Lisp string on
3154 the heap. M is a pointer to the mem_block for P. */
3156 static INLINE int
3157 live_string_p (m, p)
3158 struct mem_node *m;
3159 void *p;
3161 if (m->type == MEM_TYPE_STRING)
3163 struct string_block *b = (struct string_block *) m->start;
3164 int offset = (char *) p - (char *) &b->strings[0];
3166 /* P must point to the start of a Lisp_String structure, and it
3167 must not be on the free-list. */
3168 return (offset >= 0
3169 && offset % sizeof b->strings[0] == 0
3170 && ((struct Lisp_String *) p)->data != NULL);
3172 else
3173 return 0;
3177 /* Value is non-zero if P is a pointer to a live Lisp cons on
3178 the heap. M is a pointer to the mem_block for P. */
3180 static INLINE int
3181 live_cons_p (m, p)
3182 struct mem_node *m;
3183 void *p;
3185 if (m->type == MEM_TYPE_CONS)
3187 struct cons_block *b = (struct cons_block *) m->start;
3188 int offset = (char *) p - (char *) &b->conses[0];
3190 /* P must point to the start of a Lisp_Cons, not be
3191 one of the unused cells in the current cons block,
3192 and not be on the free-list. */
3193 return (offset >= 0
3194 && offset % sizeof b->conses[0] == 0
3195 && (b != cons_block
3196 || offset / sizeof b->conses[0] < cons_block_index)
3197 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
3199 else
3200 return 0;
3204 /* Value is non-zero if P is a pointer to a live Lisp symbol on
3205 the heap. M is a pointer to the mem_block for P. */
3207 static INLINE int
3208 live_symbol_p (m, p)
3209 struct mem_node *m;
3210 void *p;
3212 if (m->type == MEM_TYPE_SYMBOL)
3214 struct symbol_block *b = (struct symbol_block *) m->start;
3215 int offset = (char *) p - (char *) &b->symbols[0];
3217 /* P must point to the start of a Lisp_Symbol, not be
3218 one of the unused cells in the current symbol block,
3219 and not be on the free-list. */
3220 return (offset >= 0
3221 && offset % sizeof b->symbols[0] == 0
3222 && (b != symbol_block
3223 || offset / sizeof b->symbols[0] < symbol_block_index)
3224 && !EQ (((struct Lisp_Symbol *) p)->function, Vdead));
3226 else
3227 return 0;
3231 /* Value is non-zero if P is a pointer to a live Lisp float on
3232 the heap. M is a pointer to the mem_block for P. */
3234 static INLINE int
3235 live_float_p (m, p)
3236 struct mem_node *m;
3237 void *p;
3239 if (m->type == MEM_TYPE_FLOAT)
3241 struct float_block *b = (struct float_block *) m->start;
3242 int offset = (char *) p - (char *) &b->floats[0];
3244 /* P must point to the start of a Lisp_Float, not be
3245 one of the unused cells in the current float block,
3246 and not be on the free-list. */
3247 return (offset >= 0
3248 && offset % sizeof b->floats[0] == 0
3249 && (b != float_block
3250 || offset / sizeof b->floats[0] < float_block_index)
3251 && !EQ (((struct Lisp_Float *) p)->type, Vdead));
3253 else
3254 return 0;
3258 /* Value is non-zero if P is a pointer to a live Lisp Misc on
3259 the heap. M is a pointer to the mem_block for P. */
3261 static INLINE int
3262 live_misc_p (m, p)
3263 struct mem_node *m;
3264 void *p;
3266 if (m->type == MEM_TYPE_MISC)
3268 struct marker_block *b = (struct marker_block *) m->start;
3269 int offset = (char *) p - (char *) &b->markers[0];
3271 /* P must point to the start of a Lisp_Misc, not be
3272 one of the unused cells in the current misc block,
3273 and not be on the free-list. */
3274 return (offset >= 0
3275 && offset % sizeof b->markers[0] == 0
3276 && (b != marker_block
3277 || offset / sizeof b->markers[0] < marker_block_index)
3278 && ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free);
3280 else
3281 return 0;
3285 /* Value is non-zero if P is a pointer to a live vector-like object.
3286 M is a pointer to the mem_block for P. */
3288 static INLINE int
3289 live_vector_p (m, p)
3290 struct mem_node *m;
3291 void *p;
3293 return (p == m->start
3294 && m->type >= MEM_TYPE_VECTOR
3295 && m->type <= MEM_TYPE_WINDOW);
3299 /* Value is non-zero of P is a pointer to a live buffer. M is a
3300 pointer to the mem_block for P. */
3302 static INLINE int
3303 live_buffer_p (m, p)
3304 struct mem_node *m;
3305 void *p;
3307 /* P must point to the start of the block, and the buffer
3308 must not have been killed. */
3309 return (m->type == MEM_TYPE_BUFFER
3310 && p == m->start
3311 && !NILP (((struct buffer *) p)->name));
3314 #endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
3316 #if GC_MARK_STACK
3318 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3320 /* Array of objects that are kept alive because the C stack contains
3321 a pattern that looks like a reference to them . */
3323 #define MAX_ZOMBIES 10
3324 static Lisp_Object zombies[MAX_ZOMBIES];
3326 /* Number of zombie objects. */
3328 static int nzombies;
3330 /* Number of garbage collections. */
3332 static int ngcs;
3334 /* Average percentage of zombies per collection. */
3336 static double avg_zombies;
3338 /* Max. number of live and zombie objects. */
3340 static int max_live, max_zombies;
3342 /* Average number of live objects per GC. */
3344 static double avg_live;
3346 DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
3347 doc: /* Show information about live and zombie objects. */)
3350 Lisp_Object args[8], zombie_list = Qnil;
3351 int i;
3352 for (i = 0; i < nzombies; i++)
3353 zombie_list = Fcons (zombies[i], zombie_list);
3354 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
3355 args[1] = make_number (ngcs);
3356 args[2] = make_float (avg_live);
3357 args[3] = make_float (avg_zombies);
3358 args[4] = make_float (avg_zombies / avg_live / 100);
3359 args[5] = make_number (max_live);
3360 args[6] = make_number (max_zombies);
3361 args[7] = zombie_list;
3362 return Fmessage (8, args);
3365 #endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
3368 /* Mark OBJ if we can prove it's a Lisp_Object. */
3370 static INLINE void
3371 mark_maybe_object (obj)
3372 Lisp_Object obj;
3374 void *po = (void *) XPNTR (obj);
3375 struct mem_node *m = mem_find (po);
3377 if (m != MEM_NIL)
3379 int mark_p = 0;
3381 switch (XGCTYPE (obj))
3383 case Lisp_String:
3384 mark_p = (live_string_p (m, po)
3385 && !STRING_MARKED_P ((struct Lisp_String *) po));
3386 break;
3388 case Lisp_Cons:
3389 mark_p = (live_cons_p (m, po)
3390 && !XMARKBIT (XCONS (obj)->car));
3391 break;
3393 case Lisp_Symbol:
3394 mark_p = (live_symbol_p (m, po)
3395 && !XMARKBIT (XSYMBOL (obj)->plist));
3396 break;
3398 case Lisp_Float:
3399 mark_p = (live_float_p (m, po)
3400 && !XMARKBIT (XFLOAT (obj)->type));
3401 break;
3403 case Lisp_Vectorlike:
3404 /* Note: can't check GC_BUFFERP before we know it's a
3405 buffer because checking that dereferences the pointer
3406 PO which might point anywhere. */
3407 if (live_vector_p (m, po))
3408 mark_p = (!GC_SUBRP (obj)
3409 && !(XVECTOR (obj)->size & ARRAY_MARK_FLAG));
3410 else if (live_buffer_p (m, po))
3411 mark_p = GC_BUFFERP (obj) && !XMARKBIT (XBUFFER (obj)->name);
3412 break;
3414 case Lisp_Misc:
3415 if (live_misc_p (m, po))
3417 switch (XMISCTYPE (obj))
3419 case Lisp_Misc_Marker:
3420 mark_p = !XMARKBIT (XMARKER (obj)->chain);
3421 break;
3423 case Lisp_Misc_Buffer_Local_Value:
3424 case Lisp_Misc_Some_Buffer_Local_Value:
3425 mark_p = !XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue);
3426 break;
3428 case Lisp_Misc_Overlay:
3429 mark_p = !XMARKBIT (XOVERLAY (obj)->plist);
3430 break;
3433 break;
3435 case Lisp_Int:
3436 case Lisp_Type_Limit:
3437 break;
3440 if (mark_p)
3442 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3443 if (nzombies < MAX_ZOMBIES)
3444 zombies[nzombies] = obj;
3445 ++nzombies;
3446 #endif
3447 mark_object (&obj);
3453 /* If P points to Lisp data, mark that as live if it isn't already
3454 marked. */
3456 static INLINE void
3457 mark_maybe_pointer (p)
3458 void *p;
3460 struct mem_node *m;
3462 /* Quickly rule out some values which can't point to Lisp data. We
3463 assume that Lisp data is aligned on even addresses. */
3464 if ((EMACS_INT) p & 1)
3465 return;
3467 m = mem_find (p);
3468 if (m != MEM_NIL)
3470 Lisp_Object obj = Qnil;
3472 switch (m->type)
3474 case MEM_TYPE_NON_LISP:
3475 /* Nothing to do; not a pointer to Lisp memory. */
3476 break;
3478 case MEM_TYPE_BUFFER:
3479 if (live_buffer_p (m, p)
3480 && !XMARKBIT (((struct buffer *) p)->name))
3481 XSETVECTOR (obj, p);
3482 break;
3484 case MEM_TYPE_CONS:
3485 if (live_cons_p (m, p)
3486 && !XMARKBIT (((struct Lisp_Cons *) p)->car))
3487 XSETCONS (obj, p);
3488 break;
3490 case MEM_TYPE_STRING:
3491 if (live_string_p (m, p)
3492 && !STRING_MARKED_P ((struct Lisp_String *) p))
3493 XSETSTRING (obj, p);
3494 break;
3496 case MEM_TYPE_MISC:
3497 if (live_misc_p (m, p))
3499 Lisp_Object tem;
3500 XSETMISC (tem, p);
3502 switch (XMISCTYPE (tem))
3504 case Lisp_Misc_Marker:
3505 if (!XMARKBIT (XMARKER (tem)->chain))
3506 obj = tem;
3507 break;
3509 case Lisp_Misc_Buffer_Local_Value:
3510 case Lisp_Misc_Some_Buffer_Local_Value:
3511 if (!XMARKBIT (XBUFFER_LOCAL_VALUE (tem)->realvalue))
3512 obj = tem;
3513 break;
3515 case Lisp_Misc_Overlay:
3516 if (!XMARKBIT (XOVERLAY (tem)->plist))
3517 obj = tem;
3518 break;
3521 break;
3523 case MEM_TYPE_SYMBOL:
3524 if (live_symbol_p (m, p)
3525 && !XMARKBIT (((struct Lisp_Symbol *) p)->plist))
3526 XSETSYMBOL (obj, p);
3527 break;
3529 case MEM_TYPE_FLOAT:
3530 if (live_float_p (m, p)
3531 && !XMARKBIT (((struct Lisp_Float *) p)->type))
3532 XSETFLOAT (obj, p);
3533 break;
3535 case MEM_TYPE_VECTOR:
3536 case MEM_TYPE_PROCESS:
3537 case MEM_TYPE_HASH_TABLE:
3538 case MEM_TYPE_FRAME:
3539 case MEM_TYPE_WINDOW:
3540 if (live_vector_p (m, p))
3542 Lisp_Object tem;
3543 XSETVECTOR (tem, p);
3544 if (!GC_SUBRP (tem)
3545 && !(XVECTOR (tem)->size & ARRAY_MARK_FLAG))
3546 obj = tem;
3548 break;
3550 default:
3551 abort ();
3554 if (!GC_NILP (obj))
3555 mark_object (&obj);
3560 /* Mark Lisp objects referenced from the address range START..END. */
3562 static void
3563 mark_memory (start, end)
3564 void *start, *end;
3566 Lisp_Object *p;
3567 void **pp;
3569 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3570 nzombies = 0;
3571 #endif
3573 /* Make START the pointer to the start of the memory region,
3574 if it isn't already. */
3575 if (end < start)
3577 void *tem = start;
3578 start = end;
3579 end = tem;
3582 /* Mark Lisp_Objects. */
3583 for (p = (Lisp_Object *) start; (void *) p < end; ++p)
3584 mark_maybe_object (*p);
3586 /* Mark Lisp data pointed to. This is necessary because, in some
3587 situations, the C compiler optimizes Lisp objects away, so that
3588 only a pointer to them remains. Example:
3590 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
3593 Lisp_Object obj = build_string ("test");
3594 struct Lisp_String *s = XSTRING (obj);
3595 Fgarbage_collect ();
3596 fprintf (stderr, "test `%s'\n", s->data);
3597 return Qnil;
3600 Here, `obj' isn't really used, and the compiler optimizes it
3601 away. The only reference to the life string is through the
3602 pointer `s'. */
3604 for (pp = (void **) start; (void *) pp < end; ++pp)
3605 mark_maybe_pointer (*pp);
3608 /* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in
3609 the GCC system configuration. In gcc 3.2, the only systems for
3610 which this is so are i386-sco5 non-ELF, i386-sysv3 (maybe included
3611 by others?) and ns32k-pc532-min. */
3613 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
3615 static int setjmp_tested_p, longjmps_done;
3617 #define SETJMP_WILL_LIKELY_WORK "\
3619 Emacs garbage collector has been changed to use conservative stack\n\
3620 marking. Emacs has determined that the method it uses to do the\n\
3621 marking will likely work on your system, but this isn't sure.\n\
3623 If you are a system-programmer, or can get the help of a local wizard\n\
3624 who is, please take a look at the function mark_stack in alloc.c, and\n\
3625 verify that the methods used are appropriate for your system.\n\
3627 Please mail the result to <emacs-devel@gnu.org>.\n\
3630 #define SETJMP_WILL_NOT_WORK "\
3632 Emacs garbage collector has been changed to use conservative stack\n\
3633 marking. Emacs has determined that the default method it uses to do the\n\
3634 marking will not work on your system. We will need a system-dependent\n\
3635 solution for your system.\n\
3637 Please take a look at the function mark_stack in alloc.c, and\n\
3638 try to find a way to make it work on your system.\n\
3640 Note that you may get false negatives, depending on the compiler.\n\
3641 In particular, you need to use -O with GCC for this test.\n\
3643 Please mail the result to <emacs-devel@gnu.org>.\n\
3647 /* Perform a quick check if it looks like setjmp saves registers in a
3648 jmp_buf. Print a message to stderr saying so. When this test
3649 succeeds, this is _not_ a proof that setjmp is sufficient for
3650 conservative stack marking. Only the sources or a disassembly
3651 can prove that. */
3653 static void
3654 test_setjmp ()
3656 char buf[10];
3657 register int x;
3658 jmp_buf jbuf;
3659 int result = 0;
3661 /* Arrange for X to be put in a register. */
3662 sprintf (buf, "1");
3663 x = strlen (buf);
3664 x = 2 * x - 1;
3666 setjmp (jbuf);
3667 if (longjmps_done == 1)
3669 /* Came here after the longjmp at the end of the function.
3671 If x == 1, the longjmp has restored the register to its
3672 value before the setjmp, and we can hope that setjmp
3673 saves all such registers in the jmp_buf, although that
3674 isn't sure.
3676 For other values of X, either something really strange is
3677 taking place, or the setjmp just didn't save the register. */
3679 if (x == 1)
3680 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
3681 else
3683 fprintf (stderr, SETJMP_WILL_NOT_WORK);
3684 exit (1);
3688 ++longjmps_done;
3689 x = 2;
3690 if (longjmps_done == 1)
3691 longjmp (jbuf, 1);
3694 #endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
3697 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
3699 /* Abort if anything GCPRO'd doesn't survive the GC. */
3701 static void
3702 check_gcpros ()
3704 struct gcpro *p;
3705 int i;
3707 for (p = gcprolist; p; p = p->next)
3708 for (i = 0; i < p->nvars; ++i)
3709 if (!survives_gc_p (p->var[i]))
3710 /* FIXME: It's not necessarily a bug. It might just be that the
3711 GCPRO is unnecessary or should release the object sooner. */
3712 abort ();
3715 #elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3717 static void
3718 dump_zombies ()
3720 int i;
3722 fprintf (stderr, "\nZombies kept alive = %d:\n", nzombies);
3723 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
3725 fprintf (stderr, " %d = ", i);
3726 debug_print (zombies[i]);
3730 #endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
3733 /* Mark live Lisp objects on the C stack.
3735 There are several system-dependent problems to consider when
3736 porting this to new architectures:
3738 Processor Registers
3740 We have to mark Lisp objects in CPU registers that can hold local
3741 variables or are used to pass parameters.
3743 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
3744 something that either saves relevant registers on the stack, or
3745 calls mark_maybe_object passing it each register's contents.
3747 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
3748 implementation assumes that calling setjmp saves registers we need
3749 to see in a jmp_buf which itself lies on the stack. This doesn't
3750 have to be true! It must be verified for each system, possibly
3751 by taking a look at the source code of setjmp.
3753 Stack Layout
3755 Architectures differ in the way their processor stack is organized.
3756 For example, the stack might look like this
3758 +----------------+
3759 | Lisp_Object | size = 4
3760 +----------------+
3761 | something else | size = 2
3762 +----------------+
3763 | Lisp_Object | size = 4
3764 +----------------+
3765 | ... |
3767 In such a case, not every Lisp_Object will be aligned equally. To
3768 find all Lisp_Object on the stack it won't be sufficient to walk
3769 the stack in steps of 4 bytes. Instead, two passes will be
3770 necessary, one starting at the start of the stack, and a second
3771 pass starting at the start of the stack + 2. Likewise, if the
3772 minimal alignment of Lisp_Objects on the stack is 1, four passes
3773 would be necessary, each one starting with one byte more offset
3774 from the stack start.
3776 The current code assumes by default that Lisp_Objects are aligned
3777 equally on the stack. */
3779 static void
3780 mark_stack ()
3782 int i;
3783 jmp_buf j;
3784 volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
3785 void *end;
3787 /* This trick flushes the register windows so that all the state of
3788 the process is contained in the stack. */
3789 /* Fixme: Code in the Boehm GC sugests flushing (with `flushrs') is
3790 needed on ia64 too. See mach_dep.c, where it also says inline
3791 assembler doesn't work with relevant proprietary compilers. */
3792 #ifdef sparc
3793 asm ("ta 3");
3794 #endif
3796 /* Save registers that we need to see on the stack. We need to see
3797 registers used to hold register variables and registers used to
3798 pass parameters. */
3799 #ifdef GC_SAVE_REGISTERS_ON_STACK
3800 GC_SAVE_REGISTERS_ON_STACK (end);
3801 #else /* not GC_SAVE_REGISTERS_ON_STACK */
3803 #ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
3804 setjmp will definitely work, test it
3805 and print a message with the result
3806 of the test. */
3807 if (!setjmp_tested_p)
3809 setjmp_tested_p = 1;
3810 test_setjmp ();
3812 #endif /* GC_SETJMP_WORKS */
3814 setjmp (j);
3815 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
3816 #endif /* not GC_SAVE_REGISTERS_ON_STACK */
3818 /* This assumes that the stack is a contiguous region in memory. If
3819 that's not the case, something has to be done here to iterate
3820 over the stack segments. */
3821 #ifndef GC_LISP_OBJECT_ALIGNMENT
3822 #ifdef __GNUC__
3823 #define GC_LISP_OBJECT_ALIGNMENT __alignof__ (Lisp_Object)
3824 #else
3825 #define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object)
3826 #endif
3827 #endif
3828 for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT)
3829 mark_memory ((char *) stack_base + i, end);
3831 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
3832 check_gcpros ();
3833 #endif
3837 #endif /* GC_MARK_STACK != 0 */
3841 /***********************************************************************
3842 Pure Storage Management
3843 ***********************************************************************/
3845 /* Allocate room for SIZE bytes from pure Lisp storage and return a
3846 pointer to it. TYPE is the Lisp type for which the memory is
3847 allocated. TYPE < 0 means it's not used for a Lisp object.
3849 If store_pure_type_info is set and TYPE is >= 0, the type of
3850 the allocated object is recorded in pure_types. */
3852 static POINTER_TYPE *
3853 pure_alloc (size, type)
3854 size_t size;
3855 int type;
3857 POINTER_TYPE *result;
3858 size_t alignment = sizeof (EMACS_INT);
3860 /* Give Lisp_Floats an extra alignment. */
3861 if (type == Lisp_Float)
3863 #if defined __GNUC__ && __GNUC__ >= 2
3864 alignment = __alignof (struct Lisp_Float);
3865 #else
3866 alignment = sizeof (struct Lisp_Float);
3867 #endif
3870 again:
3871 result = (POINTER_TYPE *) ALIGN ((EMACS_UINT)purebeg + pure_bytes_used, alignment);
3872 pure_bytes_used = ((char *)result - (char *)purebeg) + size;
3874 if (pure_bytes_used <= pure_size)
3875 return result;
3877 /* Don't allocate a large amount here,
3878 because it might get mmap'd and then its address
3879 might not be usable. */
3880 purebeg = (char *) xmalloc (10000);
3881 pure_size = 10000;
3882 pure_bytes_used_before_overflow += pure_bytes_used - size;
3883 pure_bytes_used = 0;
3884 goto again;
3888 /* Print a warning if PURESIZE is too small. */
3890 void
3891 check_pure_size ()
3893 if (pure_bytes_used_before_overflow)
3894 message ("Pure Lisp storage overflow (approx. %d bytes needed)",
3895 (int) (pure_bytes_used + pure_bytes_used_before_overflow));
3899 /* Return a string allocated in pure space. DATA is a buffer holding
3900 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
3901 non-zero means make the result string multibyte.
3903 Must get an error if pure storage is full, since if it cannot hold
3904 a large string it may be able to hold conses that point to that
3905 string; then the string is not protected from gc. */
3907 Lisp_Object
3908 make_pure_string (data, nchars, nbytes, multibyte)
3909 char *data;
3910 int nchars, nbytes;
3911 int multibyte;
3913 Lisp_Object string;
3914 struct Lisp_String *s;
3916 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
3917 s->data = (unsigned char *) pure_alloc (nbytes + 1, -1);
3918 s->size = nchars;
3919 s->size_byte = multibyte ? nbytes : -1;
3920 bcopy (data, s->data, nbytes);
3921 s->data[nbytes] = '\0';
3922 s->intervals = NULL_INTERVAL;
3923 XSETSTRING (string, s);
3924 return string;
3928 /* Return a cons allocated from pure space. Give it pure copies
3929 of CAR as car and CDR as cdr. */
3931 Lisp_Object
3932 pure_cons (car, cdr)
3933 Lisp_Object car, cdr;
3935 register Lisp_Object new;
3936 struct Lisp_Cons *p;
3938 p = (struct Lisp_Cons *) pure_alloc (sizeof *p, Lisp_Cons);
3939 XSETCONS (new, p);
3940 XSETCAR (new, Fpurecopy (car));
3941 XSETCDR (new, Fpurecopy (cdr));
3942 return new;
3946 /* Value is a float object with value NUM allocated from pure space. */
3948 Lisp_Object
3949 make_pure_float (num)
3950 double num;
3952 register Lisp_Object new;
3953 struct Lisp_Float *p;
3955 p = (struct Lisp_Float *) pure_alloc (sizeof *p, Lisp_Float);
3956 XSETFLOAT (new, p);
3957 XFLOAT_DATA (new) = num;
3958 return new;
3962 /* Return a vector with room for LEN Lisp_Objects allocated from
3963 pure space. */
3965 Lisp_Object
3966 make_pure_vector (len)
3967 EMACS_INT len;
3969 Lisp_Object new;
3970 struct Lisp_Vector *p;
3971 size_t size = sizeof *p + (len - 1) * sizeof (Lisp_Object);
3973 p = (struct Lisp_Vector *) pure_alloc (size, Lisp_Vectorlike);
3974 XSETVECTOR (new, p);
3975 XVECTOR (new)->size = len;
3976 return new;
3980 DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
3981 doc: /* Make a copy of OBJECT in pure storage.
3982 Recursively copies contents of vectors and cons cells.
3983 Does not copy symbols. Copies strings without text properties. */)
3984 (obj)
3985 register Lisp_Object obj;
3987 if (NILP (Vpurify_flag))
3988 return obj;
3990 if (PURE_POINTER_P (XPNTR (obj)))
3991 return obj;
3993 if (CONSP (obj))
3994 return pure_cons (XCAR (obj), XCDR (obj));
3995 else if (FLOATP (obj))
3996 return make_pure_float (XFLOAT_DATA (obj));
3997 else if (STRINGP (obj))
3998 return make_pure_string (SDATA (obj), SCHARS (obj),
3999 SBYTES (obj),
4000 STRING_MULTIBYTE (obj));
4001 else if (COMPILEDP (obj) || VECTORP (obj))
4003 register struct Lisp_Vector *vec;
4004 register int i, size;
4006 size = XVECTOR (obj)->size;
4007 if (size & PSEUDOVECTOR_FLAG)
4008 size &= PSEUDOVECTOR_SIZE_MASK;
4009 vec = XVECTOR (make_pure_vector ((EMACS_INT) size));
4010 for (i = 0; i < size; i++)
4011 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]);
4012 if (COMPILEDP (obj))
4013 XSETCOMPILED (obj, vec);
4014 else
4015 XSETVECTOR (obj, vec);
4016 return obj;
4018 else if (MARKERP (obj))
4019 error ("Attempt to copy a marker to pure storage");
4021 return obj;
4026 /***********************************************************************
4027 Protection from GC
4028 ***********************************************************************/
4030 /* Put an entry in staticvec, pointing at the variable with address
4031 VARADDRESS. */
4033 void
4034 staticpro (varaddress)
4035 Lisp_Object *varaddress;
4037 staticvec[staticidx++] = varaddress;
4038 if (staticidx >= NSTATICS)
4039 abort ();
4042 struct catchtag
4044 Lisp_Object tag;
4045 Lisp_Object val;
4046 struct catchtag *next;
4049 struct backtrace
4051 struct backtrace *next;
4052 Lisp_Object *function;
4053 Lisp_Object *args; /* Points to vector of args. */
4054 int nargs; /* Length of vector. */
4055 /* If nargs is UNEVALLED, args points to slot holding list of
4056 unevalled args. */
4057 char evalargs;
4062 /***********************************************************************
4063 Protection from GC
4064 ***********************************************************************/
4066 /* Temporarily prevent garbage collection. */
4069 inhibit_garbage_collection ()
4071 int count = SPECPDL_INDEX ();
4072 int nbits = min (VALBITS, BITS_PER_INT);
4074 specbind (Qgc_cons_threshold, make_number (((EMACS_INT) 1 << (nbits - 1)) - 1));
4075 return count;
4079 DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
4080 doc: /* Reclaim storage for Lisp objects no longer needed.
4081 Returns info on amount of space in use:
4082 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)
4083 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS
4084 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS)
4085 (USED-STRINGS . FREE-STRINGS))
4086 Garbage collection happens automatically if you cons more than
4087 `gc-cons-threshold' bytes of Lisp data since previous garbage collection. */)
4090 register struct gcpro *tail;
4091 register struct specbinding *bind;
4092 struct catchtag *catch;
4093 struct handler *handler;
4094 register struct backtrace *backlist;
4095 char stack_top_variable;
4096 register int i;
4097 int message_p;
4098 Lisp_Object total[8];
4099 int count = SPECPDL_INDEX ();
4100 EMACS_TIME t1, t2, t3;
4102 if (abort_on_gc)
4103 abort ();
4105 EMACS_GET_TIME (t1);
4107 /* Can't GC if pure storage overflowed because we can't determine
4108 if something is a pure object or not. */
4109 if (pure_bytes_used_before_overflow)
4110 return Qnil;
4112 /* In case user calls debug_print during GC,
4113 don't let that cause a recursive GC. */
4114 consing_since_gc = 0;
4116 /* Save what's currently displayed in the echo area. */
4117 message_p = push_message ();
4118 record_unwind_protect (pop_message_unwind, Qnil);
4120 /* Save a copy of the contents of the stack, for debugging. */
4121 #if MAX_SAVE_STACK > 0
4122 if (NILP (Vpurify_flag))
4124 i = &stack_top_variable - stack_bottom;
4125 if (i < 0) i = -i;
4126 if (i < MAX_SAVE_STACK)
4128 if (stack_copy == 0)
4129 stack_copy = (char *) xmalloc (stack_copy_size = i);
4130 else if (stack_copy_size < i)
4131 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i));
4132 if (stack_copy)
4134 if ((EMACS_INT) (&stack_top_variable - stack_bottom) > 0)
4135 bcopy (stack_bottom, stack_copy, i);
4136 else
4137 bcopy (&stack_top_variable, stack_copy, i);
4141 #endif /* MAX_SAVE_STACK > 0 */
4143 if (garbage_collection_messages)
4144 message1_nolog ("Garbage collecting...");
4146 BLOCK_INPUT;
4148 shrink_regexp_cache ();
4150 /* Don't keep undo information around forever. */
4152 register struct buffer *nextb = all_buffers;
4154 while (nextb)
4156 /* If a buffer's undo list is Qt, that means that undo is
4157 turned off in that buffer. Calling truncate_undo_list on
4158 Qt tends to return NULL, which effectively turns undo back on.
4159 So don't call truncate_undo_list if undo_list is Qt. */
4160 if (! EQ (nextb->undo_list, Qt))
4161 nextb->undo_list
4162 = truncate_undo_list (nextb->undo_list, undo_limit,
4163 undo_strong_limit);
4165 /* Shrink buffer gaps, but skip indirect and dead buffers. */
4166 if (nextb->base_buffer == 0 && !NILP (nextb->name))
4168 /* If a buffer's gap size is more than 10% of the buffer
4169 size, or larger than 2000 bytes, then shrink it
4170 accordingly. Keep a minimum size of 20 bytes. */
4171 int size = min (2000, max (20, (nextb->text->z_byte / 10)));
4173 if (nextb->text->gap_size > size)
4175 struct buffer *save_current = current_buffer;
4176 current_buffer = nextb;
4177 make_gap (-(nextb->text->gap_size - size));
4178 current_buffer = save_current;
4182 nextb = nextb->next;
4186 gc_in_progress = 1;
4188 /* clear_marks (); */
4190 /* Mark all the special slots that serve as the roots of accessibility.
4192 Usually the special slots to mark are contained in particular structures.
4193 Then we know no slot is marked twice because the structures don't overlap.
4194 In some cases, the structures point to the slots to be marked.
4195 For these, we use MARKBIT to avoid double marking of the slot. */
4197 for (i = 0; i < staticidx; i++)
4198 mark_object (staticvec[i]);
4200 #if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
4201 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
4202 mark_stack ();
4203 #else
4204 for (tail = gcprolist; tail; tail = tail->next)
4205 for (i = 0; i < tail->nvars; i++)
4206 if (!XMARKBIT (tail->var[i]))
4208 /* Explicit casting prevents compiler warning about
4209 discarding the `volatile' qualifier. */
4210 mark_object ((Lisp_Object *)&tail->var[i]);
4211 XMARK (tail->var[i]);
4213 #endif
4215 mark_byte_stack ();
4216 for (bind = specpdl; bind != specpdl_ptr; bind++)
4218 mark_object (&bind->symbol);
4219 mark_object (&bind->old_value);
4221 for (catch = catchlist; catch; catch = catch->next)
4223 mark_object (&catch->tag);
4224 mark_object (&catch->val);
4226 for (handler = handlerlist; handler; handler = handler->next)
4228 mark_object (&handler->handler);
4229 mark_object (&handler->var);
4231 for (backlist = backtrace_list; backlist; backlist = backlist->next)
4233 if (!XMARKBIT (*backlist->function))
4235 mark_object (backlist->function);
4236 XMARK (*backlist->function);
4238 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
4239 i = 0;
4240 else
4241 i = backlist->nargs - 1;
4242 for (; i >= 0; i--)
4243 if (!XMARKBIT (backlist->args[i]))
4245 mark_object (&backlist->args[i]);
4246 XMARK (backlist->args[i]);
4249 mark_kboards ();
4251 /* Look thru every buffer's undo list
4252 for elements that update markers that were not marked,
4253 and delete them. */
4255 register struct buffer *nextb = all_buffers;
4257 while (nextb)
4259 /* If a buffer's undo list is Qt, that means that undo is
4260 turned off in that buffer. Calling truncate_undo_list on
4261 Qt tends to return NULL, which effectively turns undo back on.
4262 So don't call truncate_undo_list if undo_list is Qt. */
4263 if (! EQ (nextb->undo_list, Qt))
4265 Lisp_Object tail, prev;
4266 tail = nextb->undo_list;
4267 prev = Qnil;
4268 while (CONSP (tail))
4270 if (GC_CONSP (XCAR (tail))
4271 && GC_MARKERP (XCAR (XCAR (tail)))
4272 && ! XMARKBIT (XMARKER (XCAR (XCAR (tail)))->chain))
4274 if (NILP (prev))
4275 nextb->undo_list = tail = XCDR (tail);
4276 else
4278 tail = XCDR (tail);
4279 XSETCDR (prev, tail);
4282 else
4284 prev = tail;
4285 tail = XCDR (tail);
4290 nextb = nextb->next;
4294 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4295 mark_stack ();
4296 #endif
4298 #ifdef USE_GTK
4300 extern void xg_mark_data ();
4301 xg_mark_data ();
4303 #endif
4305 gc_sweep ();
4307 /* Clear the mark bits that we set in certain root slots. */
4309 #if (GC_MARK_STACK == GC_USE_GCPROS_AS_BEFORE \
4310 || GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES)
4311 for (tail = gcprolist; tail; tail = tail->next)
4312 for (i = 0; i < tail->nvars; i++)
4313 XUNMARK (tail->var[i]);
4314 #endif
4316 unmark_byte_stack ();
4317 for (backlist = backtrace_list; backlist; backlist = backlist->next)
4319 XUNMARK (*backlist->function);
4320 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
4321 i = 0;
4322 else
4323 i = backlist->nargs - 1;
4324 for (; i >= 0; i--)
4325 XUNMARK (backlist->args[i]);
4327 XUNMARK (buffer_defaults.name);
4328 XUNMARK (buffer_local_symbols.name);
4330 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
4331 dump_zombies ();
4332 #endif
4334 UNBLOCK_INPUT;
4336 /* clear_marks (); */
4337 gc_in_progress = 0;
4339 consing_since_gc = 0;
4340 if (gc_cons_threshold < 10000)
4341 gc_cons_threshold = 10000;
4343 if (garbage_collection_messages)
4345 if (message_p || minibuf_level > 0)
4346 restore_message ();
4347 else
4348 message1_nolog ("Garbage collecting...done");
4351 unbind_to (count, Qnil);
4353 total[0] = Fcons (make_number (total_conses),
4354 make_number (total_free_conses));
4355 total[1] = Fcons (make_number (total_symbols),
4356 make_number (total_free_symbols));
4357 total[2] = Fcons (make_number (total_markers),
4358 make_number (total_free_markers));
4359 total[3] = make_number (total_string_size);
4360 total[4] = make_number (total_vector_size);
4361 total[5] = Fcons (make_number (total_floats),
4362 make_number (total_free_floats));
4363 total[6] = Fcons (make_number (total_intervals),
4364 make_number (total_free_intervals));
4365 total[7] = Fcons (make_number (total_strings),
4366 make_number (total_free_strings));
4368 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4370 /* Compute average percentage of zombies. */
4371 double nlive = 0;
4373 for (i = 0; i < 7; ++i)
4374 if (CONSP (total[i]))
4375 nlive += XFASTINT (XCAR (total[i]));
4377 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
4378 max_live = max (nlive, max_live);
4379 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
4380 max_zombies = max (nzombies, max_zombies);
4381 ++ngcs;
4383 #endif
4385 if (!NILP (Vpost_gc_hook))
4387 int count = inhibit_garbage_collection ();
4388 safe_run_hooks (Qpost_gc_hook);
4389 unbind_to (count, Qnil);
4392 /* Accumulate statistics. */
4393 EMACS_GET_TIME (t2);
4394 EMACS_SUB_TIME (t3, t2, t1);
4395 if (FLOATP (Vgc_elapsed))
4396 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed) +
4397 EMACS_SECS (t3) +
4398 EMACS_USECS (t3) * 1.0e-6);
4399 gcs_done++;
4401 return Flist (sizeof total / sizeof *total, total);
4405 /* Mark Lisp objects in glyph matrix MATRIX. Currently the
4406 only interesting objects referenced from glyphs are strings. */
4408 static void
4409 mark_glyph_matrix (matrix)
4410 struct glyph_matrix *matrix;
4412 struct glyph_row *row = matrix->rows;
4413 struct glyph_row *end = row + matrix->nrows;
4415 for (; row < end; ++row)
4416 if (row->enabled_p)
4418 int area;
4419 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
4421 struct glyph *glyph = row->glyphs[area];
4422 struct glyph *end_glyph = glyph + row->used[area];
4424 for (; glyph < end_glyph; ++glyph)
4425 if (GC_STRINGP (glyph->object)
4426 && !STRING_MARKED_P (XSTRING (glyph->object)))
4427 mark_object (&glyph->object);
4433 /* Mark Lisp faces in the face cache C. */
4435 static void
4436 mark_face_cache (c)
4437 struct face_cache *c;
4439 if (c)
4441 int i, j;
4442 for (i = 0; i < c->used; ++i)
4444 struct face *face = FACE_FROM_ID (c->f, i);
4446 if (face)
4448 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
4449 mark_object (&face->lface[j]);
4456 #ifdef HAVE_WINDOW_SYSTEM
4458 /* Mark Lisp objects in image IMG. */
4460 static void
4461 mark_image (img)
4462 struct image *img;
4464 mark_object (&img->spec);
4466 if (!NILP (img->data.lisp_val))
4467 mark_object (&img->data.lisp_val);
4471 /* Mark Lisp objects in image cache of frame F. It's done this way so
4472 that we don't have to include xterm.h here. */
4474 static void
4475 mark_image_cache (f)
4476 struct frame *f;
4478 forall_images_in_image_cache (f, mark_image);
4481 #endif /* HAVE_X_WINDOWS */
4485 /* Mark reference to a Lisp_Object.
4486 If the object referred to has not been seen yet, recursively mark
4487 all the references contained in it. */
4489 #define LAST_MARKED_SIZE 500
4490 Lisp_Object *last_marked[LAST_MARKED_SIZE];
4491 int last_marked_index;
4493 /* For debugging--call abort when we cdr down this many
4494 links of a list, in mark_object. In debugging,
4495 the call to abort will hit a breakpoint.
4496 Normally this is zero and the check never goes off. */
4497 int mark_object_loop_halt;
4499 void
4500 mark_object (argptr)
4501 Lisp_Object *argptr;
4503 Lisp_Object *objptr = argptr;
4504 register Lisp_Object obj;
4505 #ifdef GC_CHECK_MARKED_OBJECTS
4506 void *po;
4507 struct mem_node *m;
4508 #endif
4509 int cdr_count = 0;
4511 loop:
4512 obj = *objptr;
4513 loop2:
4514 XUNMARK (obj);
4516 if (PURE_POINTER_P (XPNTR (obj)))
4517 return;
4519 last_marked[last_marked_index++] = objptr;
4520 if (last_marked_index == LAST_MARKED_SIZE)
4521 last_marked_index = 0;
4523 /* Perform some sanity checks on the objects marked here. Abort if
4524 we encounter an object we know is bogus. This increases GC time
4525 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
4526 #ifdef GC_CHECK_MARKED_OBJECTS
4528 po = (void *) XPNTR (obj);
4530 /* Check that the object pointed to by PO is known to be a Lisp
4531 structure allocated from the heap. */
4532 #define CHECK_ALLOCATED() \
4533 do { \
4534 m = mem_find (po); \
4535 if (m == MEM_NIL) \
4536 abort (); \
4537 } while (0)
4539 /* Check that the object pointed to by PO is live, using predicate
4540 function LIVEP. */
4541 #define CHECK_LIVE(LIVEP) \
4542 do { \
4543 if (!LIVEP (m, po)) \
4544 abort (); \
4545 } while (0)
4547 /* Check both of the above conditions. */
4548 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
4549 do { \
4550 CHECK_ALLOCATED (); \
4551 CHECK_LIVE (LIVEP); \
4552 } while (0) \
4554 #else /* not GC_CHECK_MARKED_OBJECTS */
4556 #define CHECK_ALLOCATED() (void) 0
4557 #define CHECK_LIVE(LIVEP) (void) 0
4558 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
4560 #endif /* not GC_CHECK_MARKED_OBJECTS */
4562 switch (SWITCH_ENUM_CAST (XGCTYPE (obj)))
4564 case Lisp_String:
4566 register struct Lisp_String *ptr = XSTRING (obj);
4567 CHECK_ALLOCATED_AND_LIVE (live_string_p);
4568 MARK_INTERVAL_TREE (ptr->intervals);
4569 MARK_STRING (ptr);
4570 #ifdef GC_CHECK_STRING_BYTES
4571 /* Check that the string size recorded in the string is the
4572 same as the one recorded in the sdata structure. */
4573 CHECK_STRING_BYTES (ptr);
4574 #endif /* GC_CHECK_STRING_BYTES */
4576 break;
4578 case Lisp_Vectorlike:
4579 #ifdef GC_CHECK_MARKED_OBJECTS
4580 m = mem_find (po);
4581 if (m == MEM_NIL && !GC_SUBRP (obj)
4582 && po != &buffer_defaults
4583 && po != &buffer_local_symbols)
4584 abort ();
4585 #endif /* GC_CHECK_MARKED_OBJECTS */
4587 if (GC_BUFFERP (obj))
4589 if (!XMARKBIT (XBUFFER (obj)->name))
4591 #ifdef GC_CHECK_MARKED_OBJECTS
4592 if (po != &buffer_defaults && po != &buffer_local_symbols)
4594 struct buffer *b;
4595 for (b = all_buffers; b && b != po; b = b->next)
4597 if (b == NULL)
4598 abort ();
4600 #endif /* GC_CHECK_MARKED_OBJECTS */
4601 mark_buffer (obj);
4604 else if (GC_SUBRP (obj))
4605 break;
4606 else if (GC_COMPILEDP (obj))
4607 /* We could treat this just like a vector, but it is better to
4608 save the COMPILED_CONSTANTS element for last and avoid
4609 recursion there. */
4611 register struct Lisp_Vector *ptr = XVECTOR (obj);
4612 register EMACS_INT size = ptr->size;
4613 register int i;
4615 if (size & ARRAY_MARK_FLAG)
4616 break; /* Already marked */
4618 CHECK_LIVE (live_vector_p);
4619 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
4620 size &= PSEUDOVECTOR_SIZE_MASK;
4621 for (i = 0; i < size; i++) /* and then mark its elements */
4623 if (i != COMPILED_CONSTANTS)
4624 mark_object (&ptr->contents[i]);
4626 /* This cast should be unnecessary, but some Mips compiler complains
4627 (MIPS-ABI + SysVR4, DC/OSx, etc). */
4628 objptr = (Lisp_Object *) &ptr->contents[COMPILED_CONSTANTS];
4629 goto loop;
4631 else if (GC_FRAMEP (obj))
4633 register struct frame *ptr = XFRAME (obj);
4634 register EMACS_INT size = ptr->size;
4636 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
4637 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
4639 CHECK_LIVE (live_vector_p);
4640 mark_object (&ptr->name);
4641 mark_object (&ptr->icon_name);
4642 mark_object (&ptr->title);
4643 mark_object (&ptr->focus_frame);
4644 mark_object (&ptr->selected_window);
4645 mark_object (&ptr->minibuffer_window);
4646 mark_object (&ptr->param_alist);
4647 mark_object (&ptr->scroll_bars);
4648 mark_object (&ptr->condemned_scroll_bars);
4649 mark_object (&ptr->menu_bar_items);
4650 mark_object (&ptr->face_alist);
4651 mark_object (&ptr->menu_bar_vector);
4652 mark_object (&ptr->buffer_predicate);
4653 mark_object (&ptr->buffer_list);
4654 mark_object (&ptr->menu_bar_window);
4655 mark_object (&ptr->tool_bar_window);
4656 mark_face_cache (ptr->face_cache);
4657 #ifdef HAVE_WINDOW_SYSTEM
4658 mark_image_cache (ptr);
4659 mark_object (&ptr->tool_bar_items);
4660 mark_object (&ptr->desired_tool_bar_string);
4661 mark_object (&ptr->current_tool_bar_string);
4662 #endif /* HAVE_WINDOW_SYSTEM */
4664 else if (GC_BOOL_VECTOR_P (obj))
4666 register struct Lisp_Vector *ptr = XVECTOR (obj);
4668 if (ptr->size & ARRAY_MARK_FLAG)
4669 break; /* Already marked */
4670 CHECK_LIVE (live_vector_p);
4671 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
4673 else if (GC_WINDOWP (obj))
4675 register struct Lisp_Vector *ptr = XVECTOR (obj);
4676 struct window *w = XWINDOW (obj);
4677 register EMACS_INT size = ptr->size;
4678 register int i;
4680 /* Stop if already marked. */
4681 if (size & ARRAY_MARK_FLAG)
4682 break;
4684 /* Mark it. */
4685 CHECK_LIVE (live_vector_p);
4686 ptr->size |= ARRAY_MARK_FLAG;
4688 /* There is no Lisp data above The member CURRENT_MATRIX in
4689 struct WINDOW. Stop marking when that slot is reached. */
4690 for (i = 0;
4691 (char *) &ptr->contents[i] < (char *) &w->current_matrix;
4692 i++)
4693 mark_object (&ptr->contents[i]);
4695 /* Mark glyphs for leaf windows. Marking window matrices is
4696 sufficient because frame matrices use the same glyph
4697 memory. */
4698 if (NILP (w->hchild)
4699 && NILP (w->vchild)
4700 && w->current_matrix)
4702 mark_glyph_matrix (w->current_matrix);
4703 mark_glyph_matrix (w->desired_matrix);
4706 else if (GC_HASH_TABLE_P (obj))
4708 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
4709 EMACS_INT size = h->size;
4711 /* Stop if already marked. */
4712 if (size & ARRAY_MARK_FLAG)
4713 break;
4715 /* Mark it. */
4716 CHECK_LIVE (live_vector_p);
4717 h->size |= ARRAY_MARK_FLAG;
4719 /* Mark contents. */
4720 /* Do not mark next_free or next_weak.
4721 Being in the next_weak chain
4722 should not keep the hash table alive.
4723 No need to mark `count' since it is an integer. */
4724 mark_object (&h->test);
4725 mark_object (&h->weak);
4726 mark_object (&h->rehash_size);
4727 mark_object (&h->rehash_threshold);
4728 mark_object (&h->hash);
4729 mark_object (&h->next);
4730 mark_object (&h->index);
4731 mark_object (&h->user_hash_function);
4732 mark_object (&h->user_cmp_function);
4734 /* If hash table is not weak, mark all keys and values.
4735 For weak tables, mark only the vector. */
4736 if (GC_NILP (h->weak))
4737 mark_object (&h->key_and_value);
4738 else
4739 XVECTOR (h->key_and_value)->size |= ARRAY_MARK_FLAG;
4742 else
4744 register struct Lisp_Vector *ptr = XVECTOR (obj);
4745 register EMACS_INT size = ptr->size;
4746 register int i;
4748 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
4749 CHECK_LIVE (live_vector_p);
4750 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
4751 if (size & PSEUDOVECTOR_FLAG)
4752 size &= PSEUDOVECTOR_SIZE_MASK;
4754 for (i = 0; i < size; i++) /* and then mark its elements */
4755 mark_object (&ptr->contents[i]);
4757 break;
4759 case Lisp_Symbol:
4761 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
4762 struct Lisp_Symbol *ptrx;
4764 if (XMARKBIT (ptr->plist)) break;
4765 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
4766 XMARK (ptr->plist);
4767 mark_object ((Lisp_Object *) &ptr->value);
4768 mark_object (&ptr->function);
4769 mark_object (&ptr->plist);
4771 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
4772 MARK_STRING (XSTRING (ptr->xname));
4773 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
4775 /* Note that we do not mark the obarray of the symbol.
4776 It is safe not to do so because nothing accesses that
4777 slot except to check whether it is nil. */
4778 ptr = ptr->next;
4779 if (ptr)
4781 /* For the benefit of the last_marked log. */
4782 objptr = (Lisp_Object *)&XSYMBOL (obj)->next;
4783 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
4784 XSETSYMBOL (obj, ptrx);
4785 /* We can't goto loop here because *objptr doesn't contain an
4786 actual Lisp_Object with valid datatype field. */
4787 goto loop2;
4790 break;
4792 case Lisp_Misc:
4793 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
4794 switch (XMISCTYPE (obj))
4796 case Lisp_Misc_Marker:
4797 XMARK (XMARKER (obj)->chain);
4798 /* DO NOT mark thru the marker's chain.
4799 The buffer's markers chain does not preserve markers from gc;
4800 instead, markers are removed from the chain when freed by gc. */
4801 break;
4803 case Lisp_Misc_Buffer_Local_Value:
4804 case Lisp_Misc_Some_Buffer_Local_Value:
4806 register struct Lisp_Buffer_Local_Value *ptr
4807 = XBUFFER_LOCAL_VALUE (obj);
4808 if (XMARKBIT (ptr->realvalue)) break;
4809 XMARK (ptr->realvalue);
4810 /* If the cdr is nil, avoid recursion for the car. */
4811 if (EQ (ptr->cdr, Qnil))
4813 objptr = &ptr->realvalue;
4814 goto loop;
4816 mark_object (&ptr->realvalue);
4817 mark_object (&ptr->buffer);
4818 mark_object (&ptr->frame);
4819 objptr = &ptr->cdr;
4820 goto loop;
4823 case Lisp_Misc_Intfwd:
4824 case Lisp_Misc_Boolfwd:
4825 case Lisp_Misc_Objfwd:
4826 case Lisp_Misc_Buffer_Objfwd:
4827 case Lisp_Misc_Kboard_Objfwd:
4828 /* Don't bother with Lisp_Buffer_Objfwd,
4829 since all markable slots in current buffer marked anyway. */
4830 /* Don't need to do Lisp_Objfwd, since the places they point
4831 are protected with staticpro. */
4832 break;
4834 case Lisp_Misc_Overlay:
4836 struct Lisp_Overlay *ptr = XOVERLAY (obj);
4837 if (!XMARKBIT (ptr->plist))
4839 XMARK (ptr->plist);
4840 mark_object (&ptr->start);
4841 mark_object (&ptr->end);
4842 objptr = &ptr->plist;
4843 goto loop;
4846 break;
4848 default:
4849 abort ();
4851 break;
4853 case Lisp_Cons:
4855 register struct Lisp_Cons *ptr = XCONS (obj);
4856 if (XMARKBIT (ptr->car)) break;
4857 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
4858 XMARK (ptr->car);
4859 /* If the cdr is nil, avoid recursion for the car. */
4860 if (EQ (ptr->cdr, Qnil))
4862 objptr = &ptr->car;
4863 cdr_count = 0;
4864 goto loop;
4866 mark_object (&ptr->car);
4867 objptr = &ptr->cdr;
4868 cdr_count++;
4869 if (cdr_count == mark_object_loop_halt)
4870 abort ();
4871 goto loop;
4874 case Lisp_Float:
4875 CHECK_ALLOCATED_AND_LIVE (live_float_p);
4876 XMARK (XFLOAT (obj)->type);
4877 break;
4879 case Lisp_Int:
4880 break;
4882 default:
4883 abort ();
4886 #undef CHECK_LIVE
4887 #undef CHECK_ALLOCATED
4888 #undef CHECK_ALLOCATED_AND_LIVE
4891 /* Mark the pointers in a buffer structure. */
4893 static void
4894 mark_buffer (buf)
4895 Lisp_Object buf;
4897 register struct buffer *buffer = XBUFFER (buf);
4898 register Lisp_Object *ptr;
4899 Lisp_Object base_buffer;
4901 /* This is the buffer's markbit */
4902 mark_object (&buffer->name);
4903 XMARK (buffer->name);
4905 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
4907 if (CONSP (buffer->undo_list))
4909 Lisp_Object tail;
4910 tail = buffer->undo_list;
4912 while (CONSP (tail))
4914 register struct Lisp_Cons *ptr = XCONS (tail);
4916 if (XMARKBIT (ptr->car))
4917 break;
4918 XMARK (ptr->car);
4919 if (GC_CONSP (ptr->car)
4920 && ! XMARKBIT (XCAR (ptr->car))
4921 && GC_MARKERP (XCAR (ptr->car)))
4923 XMARK (XCAR_AS_LVALUE (ptr->car));
4924 mark_object (&XCDR_AS_LVALUE (ptr->car));
4926 else
4927 mark_object (&ptr->car);
4929 if (CONSP (ptr->cdr))
4930 tail = ptr->cdr;
4931 else
4932 break;
4935 mark_object (&XCDR_AS_LVALUE (tail));
4937 else
4938 mark_object (&buffer->undo_list);
4940 for (ptr = &buffer->name + 1;
4941 (char *)ptr < (char *)buffer + sizeof (struct buffer);
4942 ptr++)
4943 mark_object (ptr);
4945 /* If this is an indirect buffer, mark its base buffer. */
4946 if (buffer->base_buffer && !XMARKBIT (buffer->base_buffer->name))
4948 XSETBUFFER (base_buffer, buffer->base_buffer);
4949 mark_buffer (base_buffer);
4954 /* Mark the pointers in the kboard objects. */
4956 static void
4957 mark_kboards ()
4959 KBOARD *kb;
4960 Lisp_Object *p;
4961 for (kb = all_kboards; kb; kb = kb->next_kboard)
4963 if (kb->kbd_macro_buffer)
4964 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
4965 mark_object (p);
4966 mark_object (&kb->Voverriding_terminal_local_map);
4967 mark_object (&kb->Vlast_command);
4968 mark_object (&kb->Vreal_last_command);
4969 mark_object (&kb->Vprefix_arg);
4970 mark_object (&kb->Vlast_prefix_arg);
4971 mark_object (&kb->kbd_queue);
4972 mark_object (&kb->defining_kbd_macro);
4973 mark_object (&kb->Vlast_kbd_macro);
4974 mark_object (&kb->Vsystem_key_alist);
4975 mark_object (&kb->system_key_syms);
4976 mark_object (&kb->Vdefault_minibuffer_frame);
4977 mark_object (&kb->echo_string);
4982 /* Value is non-zero if OBJ will survive the current GC because it's
4983 either marked or does not need to be marked to survive. */
4986 survives_gc_p (obj)
4987 Lisp_Object obj;
4989 int survives_p;
4991 switch (XGCTYPE (obj))
4993 case Lisp_Int:
4994 survives_p = 1;
4995 break;
4997 case Lisp_Symbol:
4998 survives_p = XMARKBIT (XSYMBOL (obj)->plist);
4999 break;
5001 case Lisp_Misc:
5002 switch (XMISCTYPE (obj))
5004 case Lisp_Misc_Marker:
5005 survives_p = XMARKBIT (obj);
5006 break;
5008 case Lisp_Misc_Buffer_Local_Value:
5009 case Lisp_Misc_Some_Buffer_Local_Value:
5010 survives_p = XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue);
5011 break;
5013 case Lisp_Misc_Intfwd:
5014 case Lisp_Misc_Boolfwd:
5015 case Lisp_Misc_Objfwd:
5016 case Lisp_Misc_Buffer_Objfwd:
5017 case Lisp_Misc_Kboard_Objfwd:
5018 survives_p = 1;
5019 break;
5021 case Lisp_Misc_Overlay:
5022 survives_p = XMARKBIT (XOVERLAY (obj)->plist);
5023 break;
5025 default:
5026 abort ();
5028 break;
5030 case Lisp_String:
5032 struct Lisp_String *s = XSTRING (obj);
5033 survives_p = STRING_MARKED_P (s);
5035 break;
5037 case Lisp_Vectorlike:
5038 if (GC_BUFFERP (obj))
5039 survives_p = XMARKBIT (XBUFFER (obj)->name);
5040 else if (GC_SUBRP (obj))
5041 survives_p = 1;
5042 else
5043 survives_p = XVECTOR (obj)->size & ARRAY_MARK_FLAG;
5044 break;
5046 case Lisp_Cons:
5047 survives_p = XMARKBIT (XCAR (obj));
5048 break;
5050 case Lisp_Float:
5051 survives_p = XMARKBIT (XFLOAT (obj)->type);
5052 break;
5054 default:
5055 abort ();
5058 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
5063 /* Sweep: find all structures not marked, and free them. */
5065 static void
5066 gc_sweep ()
5068 /* Remove or mark entries in weak hash tables.
5069 This must be done before any object is unmarked. */
5070 sweep_weak_hash_tables ();
5072 sweep_strings ();
5073 #ifdef GC_CHECK_STRING_BYTES
5074 if (!noninteractive)
5075 check_string_bytes (1);
5076 #endif
5078 /* Put all unmarked conses on free list */
5080 register struct cons_block *cblk;
5081 struct cons_block **cprev = &cons_block;
5082 register int lim = cons_block_index;
5083 register int num_free = 0, num_used = 0;
5085 cons_free_list = 0;
5087 for (cblk = cons_block; cblk; cblk = *cprev)
5089 register int i;
5090 int this_free = 0;
5091 for (i = 0; i < lim; i++)
5092 if (!XMARKBIT (cblk->conses[i].car))
5094 this_free++;
5095 *(struct Lisp_Cons **)&cblk->conses[i].cdr = cons_free_list;
5096 cons_free_list = &cblk->conses[i];
5097 #if GC_MARK_STACK
5098 cons_free_list->car = Vdead;
5099 #endif
5101 else
5103 num_used++;
5104 XUNMARK (cblk->conses[i].car);
5106 lim = CONS_BLOCK_SIZE;
5107 /* If this block contains only free conses and we have already
5108 seen more than two blocks worth of free conses then deallocate
5109 this block. */
5110 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
5112 *cprev = cblk->next;
5113 /* Unhook from the free list. */
5114 cons_free_list = *(struct Lisp_Cons **) &cblk->conses[0].cdr;
5115 lisp_free (cblk);
5116 n_cons_blocks--;
5118 else
5120 num_free += this_free;
5121 cprev = &cblk->next;
5124 total_conses = num_used;
5125 total_free_conses = num_free;
5128 /* Put all unmarked floats on free list */
5130 register struct float_block *fblk;
5131 struct float_block **fprev = &float_block;
5132 register int lim = float_block_index;
5133 register int num_free = 0, num_used = 0;
5135 float_free_list = 0;
5137 for (fblk = float_block; fblk; fblk = *fprev)
5139 register int i;
5140 int this_free = 0;
5141 for (i = 0; i < lim; i++)
5142 if (!XMARKBIT (fblk->floats[i].type))
5144 this_free++;
5145 *(struct Lisp_Float **)&fblk->floats[i].data = float_free_list;
5146 float_free_list = &fblk->floats[i];
5147 #if GC_MARK_STACK
5148 float_free_list->type = Vdead;
5149 #endif
5151 else
5153 num_used++;
5154 XUNMARK (fblk->floats[i].type);
5156 lim = FLOAT_BLOCK_SIZE;
5157 /* If this block contains only free floats and we have already
5158 seen more than two blocks worth of free floats then deallocate
5159 this block. */
5160 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
5162 *fprev = fblk->next;
5163 /* Unhook from the free list. */
5164 float_free_list = *(struct Lisp_Float **) &fblk->floats[0].data;
5165 lisp_free (fblk);
5166 n_float_blocks--;
5168 else
5170 num_free += this_free;
5171 fprev = &fblk->next;
5174 total_floats = num_used;
5175 total_free_floats = num_free;
5178 /* Put all unmarked intervals on free list */
5180 register struct interval_block *iblk;
5181 struct interval_block **iprev = &interval_block;
5182 register int lim = interval_block_index;
5183 register int num_free = 0, num_used = 0;
5185 interval_free_list = 0;
5187 for (iblk = interval_block; iblk; iblk = *iprev)
5189 register int i;
5190 int this_free = 0;
5192 for (i = 0; i < lim; i++)
5194 if (! XMARKBIT (iblk->intervals[i].plist))
5196 SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
5197 interval_free_list = &iblk->intervals[i];
5198 this_free++;
5200 else
5202 num_used++;
5203 XUNMARK (iblk->intervals[i].plist);
5206 lim = INTERVAL_BLOCK_SIZE;
5207 /* If this block contains only free intervals and we have already
5208 seen more than two blocks worth of free intervals then
5209 deallocate this block. */
5210 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
5212 *iprev = iblk->next;
5213 /* Unhook from the free list. */
5214 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
5215 lisp_free (iblk);
5216 n_interval_blocks--;
5218 else
5220 num_free += this_free;
5221 iprev = &iblk->next;
5224 total_intervals = num_used;
5225 total_free_intervals = num_free;
5228 /* Put all unmarked symbols on free list */
5230 register struct symbol_block *sblk;
5231 struct symbol_block **sprev = &symbol_block;
5232 register int lim = symbol_block_index;
5233 register int num_free = 0, num_used = 0;
5235 symbol_free_list = NULL;
5237 for (sblk = symbol_block; sblk; sblk = *sprev)
5239 int this_free = 0;
5240 struct Lisp_Symbol *sym = sblk->symbols;
5241 struct Lisp_Symbol *end = sym + lim;
5243 for (; sym < end; ++sym)
5245 /* Check if the symbol was created during loadup. In such a case
5246 it might be pointed to by pure bytecode which we don't trace,
5247 so we conservatively assume that it is live. */
5248 int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
5250 if (!XMARKBIT (sym->plist) && !pure_p)
5252 *(struct Lisp_Symbol **) &sym->value = symbol_free_list;
5253 symbol_free_list = sym;
5254 #if GC_MARK_STACK
5255 symbol_free_list->function = Vdead;
5256 #endif
5257 ++this_free;
5259 else
5261 ++num_used;
5262 if (!pure_p)
5263 UNMARK_STRING (XSTRING (sym->xname));
5264 XUNMARK (sym->plist);
5268 lim = SYMBOL_BLOCK_SIZE;
5269 /* If this block contains only free symbols and we have already
5270 seen more than two blocks worth of free symbols then deallocate
5271 this block. */
5272 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
5274 *sprev = sblk->next;
5275 /* Unhook from the free list. */
5276 symbol_free_list = *(struct Lisp_Symbol **)&sblk->symbols[0].value;
5277 lisp_free (sblk);
5278 n_symbol_blocks--;
5280 else
5282 num_free += this_free;
5283 sprev = &sblk->next;
5286 total_symbols = num_used;
5287 total_free_symbols = num_free;
5290 /* Put all unmarked misc's on free list.
5291 For a marker, first unchain it from the buffer it points into. */
5293 register struct marker_block *mblk;
5294 struct marker_block **mprev = &marker_block;
5295 register int lim = marker_block_index;
5296 register int num_free = 0, num_used = 0;
5298 marker_free_list = 0;
5300 for (mblk = marker_block; mblk; mblk = *mprev)
5302 register int i;
5303 int this_free = 0;
5304 EMACS_INT already_free = -1;
5306 for (i = 0; i < lim; i++)
5308 Lisp_Object *markword;
5309 switch (mblk->markers[i].u_marker.type)
5311 case Lisp_Misc_Marker:
5312 markword = &mblk->markers[i].u_marker.chain;
5313 break;
5314 case Lisp_Misc_Buffer_Local_Value:
5315 case Lisp_Misc_Some_Buffer_Local_Value:
5316 markword = &mblk->markers[i].u_buffer_local_value.realvalue;
5317 break;
5318 case Lisp_Misc_Overlay:
5319 markword = &mblk->markers[i].u_overlay.plist;
5320 break;
5321 case Lisp_Misc_Free:
5322 /* If the object was already free, keep it
5323 on the free list. */
5324 markword = (Lisp_Object *) &already_free;
5325 break;
5326 default:
5327 markword = 0;
5328 break;
5330 if (markword && !XMARKBIT (*markword))
5332 Lisp_Object tem;
5333 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
5335 /* tem1 avoids Sun compiler bug */
5336 struct Lisp_Marker *tem1 = &mblk->markers[i].u_marker;
5337 XSETMARKER (tem, tem1);
5338 unchain_marker (tem);
5340 /* Set the type of the freed object to Lisp_Misc_Free.
5341 We could leave the type alone, since nobody checks it,
5342 but this might catch bugs faster. */
5343 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
5344 mblk->markers[i].u_free.chain = marker_free_list;
5345 marker_free_list = &mblk->markers[i];
5346 this_free++;
5348 else
5350 num_used++;
5351 if (markword)
5352 XUNMARK (*markword);
5355 lim = MARKER_BLOCK_SIZE;
5356 /* If this block contains only free markers and we have already
5357 seen more than two blocks worth of free markers then deallocate
5358 this block. */
5359 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
5361 *mprev = mblk->next;
5362 /* Unhook from the free list. */
5363 marker_free_list = mblk->markers[0].u_free.chain;
5364 lisp_free (mblk);
5365 n_marker_blocks--;
5367 else
5369 num_free += this_free;
5370 mprev = &mblk->next;
5374 total_markers = num_used;
5375 total_free_markers = num_free;
5378 /* Free all unmarked buffers */
5380 register struct buffer *buffer = all_buffers, *prev = 0, *next;
5382 while (buffer)
5383 if (!XMARKBIT (buffer->name))
5385 if (prev)
5386 prev->next = buffer->next;
5387 else
5388 all_buffers = buffer->next;
5389 next = buffer->next;
5390 lisp_free (buffer);
5391 buffer = next;
5393 else
5395 XUNMARK (buffer->name);
5396 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
5397 prev = buffer, buffer = buffer->next;
5401 /* Free all unmarked vectors */
5403 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
5404 total_vector_size = 0;
5406 while (vector)
5407 if (!(vector->size & ARRAY_MARK_FLAG))
5409 if (prev)
5410 prev->next = vector->next;
5411 else
5412 all_vectors = vector->next;
5413 next = vector->next;
5414 lisp_free (vector);
5415 n_vectors--;
5416 vector = next;
5419 else
5421 vector->size &= ~ARRAY_MARK_FLAG;
5422 if (vector->size & PSEUDOVECTOR_FLAG)
5423 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
5424 else
5425 total_vector_size += vector->size;
5426 prev = vector, vector = vector->next;
5430 #ifdef GC_CHECK_STRING_BYTES
5431 if (!noninteractive)
5432 check_string_bytes (1);
5433 #endif
5439 /* Debugging aids. */
5441 DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
5442 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
5443 This may be helpful in debugging Emacs's memory usage.
5444 We divide the value by 1024 to make sure it fits in a Lisp integer. */)
5447 Lisp_Object end;
5449 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
5451 return end;
5454 DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
5455 doc: /* Return a list of counters that measure how much consing there has been.
5456 Each of these counters increments for a certain kind of object.
5457 The counters wrap around from the largest positive integer to zero.
5458 Garbage collection does not decrease them.
5459 The elements of the value are as follows:
5460 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
5461 All are in units of 1 = one object consed
5462 except for VECTOR-CELLS and STRING-CHARS, which count the total length of
5463 objects consed.
5464 MISCS include overlays, markers, and some internal types.
5465 Frames, windows, buffers, and subprocesses count as vectors
5466 (but the contents of a buffer's text do not count here). */)
5469 Lisp_Object consed[8];
5471 consed[0] = make_number (min (MOST_POSITIVE_FIXNUM, cons_cells_consed));
5472 consed[1] = make_number (min (MOST_POSITIVE_FIXNUM, floats_consed));
5473 consed[2] = make_number (min (MOST_POSITIVE_FIXNUM, vector_cells_consed));
5474 consed[3] = make_number (min (MOST_POSITIVE_FIXNUM, symbols_consed));
5475 consed[4] = make_number (min (MOST_POSITIVE_FIXNUM, string_chars_consed));
5476 consed[5] = make_number (min (MOST_POSITIVE_FIXNUM, misc_objects_consed));
5477 consed[6] = make_number (min (MOST_POSITIVE_FIXNUM, intervals_consed));
5478 consed[7] = make_number (min (MOST_POSITIVE_FIXNUM, strings_consed));
5480 return Flist (8, consed);
5483 int suppress_checking;
5484 void
5485 die (msg, file, line)
5486 const char *msg;
5487 const char *file;
5488 int line;
5490 fprintf (stderr, "\r\nEmacs fatal error: %s:%d: %s\r\n",
5491 file, line, msg);
5492 abort ();
5495 /* Initialization */
5497 void
5498 init_alloc_once ()
5500 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
5501 purebeg = PUREBEG;
5502 pure_size = PURESIZE;
5503 pure_bytes_used = 0;
5504 pure_bytes_used_before_overflow = 0;
5506 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
5507 mem_init ();
5508 Vdead = make_pure_string ("DEAD", 4, 4, 0);
5509 #endif
5511 all_vectors = 0;
5512 ignore_warnings = 1;
5513 #ifdef DOUG_LEA_MALLOC
5514 mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
5515 mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
5516 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* max. number of mmap'ed areas */
5517 #endif
5518 init_strings ();
5519 init_cons ();
5520 init_symbol ();
5521 init_marker ();
5522 init_float ();
5523 init_intervals ();
5525 #ifdef REL_ALLOC
5526 malloc_hysteresis = 32;
5527 #else
5528 malloc_hysteresis = 0;
5529 #endif
5531 spare_memory = (char *) malloc (SPARE_MEMORY);
5533 ignore_warnings = 0;
5534 gcprolist = 0;
5535 byte_stack_list = 0;
5536 staticidx = 0;
5537 consing_since_gc = 0;
5538 gc_cons_threshold = 100000 * sizeof (Lisp_Object);
5539 #ifdef VIRT_ADDR_VARIES
5540 malloc_sbrk_unused = 1<<22; /* A large number */
5541 malloc_sbrk_used = 100000; /* as reasonable as any number */
5542 #endif /* VIRT_ADDR_VARIES */
5545 void
5546 init_alloc ()
5548 gcprolist = 0;
5549 byte_stack_list = 0;
5550 #if GC_MARK_STACK
5551 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
5552 setjmp_tested_p = longjmps_done = 0;
5553 #endif
5554 #endif
5555 Vgc_elapsed = make_float (0.0);
5556 gcs_done = 0;
5559 void
5560 syms_of_alloc ()
5562 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
5563 doc: /* *Number of bytes of consing between garbage collections.
5564 Garbage collection can happen automatically once this many bytes have been
5565 allocated since the last garbage collection. All data types count.
5567 Garbage collection happens automatically only when `eval' is called.
5569 By binding this temporarily to a large number, you can effectively
5570 prevent garbage collection during a part of the program. */);
5572 DEFVAR_INT ("pure-bytes-used", &pure_bytes_used,
5573 doc: /* Number of bytes of sharable Lisp data allocated so far. */);
5575 DEFVAR_INT ("cons-cells-consed", &cons_cells_consed,
5576 doc: /* Number of cons cells that have been consed so far. */);
5578 DEFVAR_INT ("floats-consed", &floats_consed,
5579 doc: /* Number of floats that have been consed so far. */);
5581 DEFVAR_INT ("vector-cells-consed", &vector_cells_consed,
5582 doc: /* Number of vector cells that have been consed so far. */);
5584 DEFVAR_INT ("symbols-consed", &symbols_consed,
5585 doc: /* Number of symbols that have been consed so far. */);
5587 DEFVAR_INT ("string-chars-consed", &string_chars_consed,
5588 doc: /* Number of string characters that have been consed so far. */);
5590 DEFVAR_INT ("misc-objects-consed", &misc_objects_consed,
5591 doc: /* Number of miscellaneous objects that have been consed so far. */);
5593 DEFVAR_INT ("intervals-consed", &intervals_consed,
5594 doc: /* Number of intervals that have been consed so far. */);
5596 DEFVAR_INT ("strings-consed", &strings_consed,
5597 doc: /* Number of strings that have been consed so far. */);
5599 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
5600 doc: /* Non-nil means loading Lisp code in order to dump an executable.
5601 This means that certain objects should be allocated in shared (pure) space. */);
5603 DEFVAR_INT ("undo-limit", &undo_limit,
5604 doc: /* Keep no more undo information once it exceeds this size.
5605 This limit is applied when garbage collection happens.
5606 The size is counted as the number of bytes occupied,
5607 which includes both saved text and other data. */);
5608 undo_limit = 20000;
5610 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
5611 doc: /* Don't keep more than this much size of undo information.
5612 A command which pushes past this size is itself forgotten.
5613 This limit is applied when garbage collection happens.
5614 The size is counted as the number of bytes occupied,
5615 which includes both saved text and other data. */);
5616 undo_strong_limit = 30000;
5618 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
5619 doc: /* Non-nil means display messages at start and end of garbage collection. */);
5620 garbage_collection_messages = 0;
5622 DEFVAR_LISP ("post-gc-hook", &Vpost_gc_hook,
5623 doc: /* Hook run after garbage collection has finished. */);
5624 Vpost_gc_hook = Qnil;
5625 Qpost_gc_hook = intern ("post-gc-hook");
5626 staticpro (&Qpost_gc_hook);
5628 DEFVAR_LISP ("memory-signal-data", &Vmemory_signal_data,
5629 doc: /* Precomputed `signal' argument for memory-full error. */);
5630 /* We build this in advance because if we wait until we need it, we might
5631 not be able to allocate the memory to hold it. */
5632 Vmemory_signal_data
5633 = list2 (Qerror,
5634 build_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"));
5636 DEFVAR_LISP ("memory-full", &Vmemory_full,
5637 doc: /* Non-nil means we are handling a memory-full error. */);
5638 Vmemory_full = Qnil;
5640 staticpro (&Qgc_cons_threshold);
5641 Qgc_cons_threshold = intern ("gc-cons-threshold");
5643 staticpro (&Qchar_table_extra_slots);
5644 Qchar_table_extra_slots = intern ("char-table-extra-slots");
5646 DEFVAR_LISP ("gc-elapsed", &Vgc_elapsed,
5647 doc: /* Accumulated time elapsed in garbage collections.
5648 The time is in seconds as a floating point value.
5649 Programs may reset this to get statistics in a specific period. */);
5650 DEFVAR_INT ("gcs-done", &gcs_done,
5651 doc: /* Accumulated number of garbage collections done.
5652 Programs may reset this to get statistics in a specific period. */);
5654 defsubr (&Scons);
5655 defsubr (&Slist);
5656 defsubr (&Svector);
5657 defsubr (&Smake_byte_code);
5658 defsubr (&Smake_list);
5659 defsubr (&Smake_vector);
5660 defsubr (&Smake_char_table);
5661 defsubr (&Smake_string);
5662 defsubr (&Smake_bool_vector);
5663 defsubr (&Smake_symbol);
5664 defsubr (&Smake_marker);
5665 defsubr (&Spurecopy);
5666 defsubr (&Sgarbage_collect);
5667 defsubr (&Smemory_limit);
5668 defsubr (&Smemory_use_counts);
5670 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5671 defsubr (&Sgc_status);
5672 #endif