]> code.delx.au - gnu-emacs/blob - src/alloc.c
*** empty log message ***
[gnu-emacs] / src / alloc.c
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.
4
5 This file is part of GNU Emacs.
6
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.
11
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.
16
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. */
21
22 #include <config.h>
23 #include <stdio.h>
24 #include <limits.h> /* For CHAR_BIT. */
25
26 #ifdef ALLOC_DEBUG
27 #undef INLINE
28 #endif
29
30 /* Note that this declares bzero on OSF/1. How dumb. */
31
32 #include <signal.h>
33
34 /* GC_MALLOC_CHECK defined means perform validity checks of malloc'd
35 memory. Can do this only if using gmalloc.c. */
36
37 #if defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC
38 #undef GC_MALLOC_CHECK
39 #endif
40
41 /* This file is part of the core Lisp implementation, and thus must
42 deal with the real data structures. If the Lisp implementation is
43 replaced, this file likely will not be used. */
44
45 #undef HIDE_LISP_IMPLEMENTATION
46 #include "lisp.h"
47 #include "process.h"
48 #include "intervals.h"
49 #include "puresize.h"
50 #include "buffer.h"
51 #include "window.h"
52 #include "keyboard.h"
53 #include "frame.h"
54 #include "blockinput.h"
55 #include "character.h"
56 #include "syssignal.h"
57 #include <setjmp.h>
58
59 #ifdef HAVE_UNISTD_H
60 #include <unistd.h>
61 #else
62 extern POINTER_TYPE *sbrk ();
63 #endif
64
65 #ifdef DOUG_LEA_MALLOC
66
67 #include <malloc.h>
68 /* malloc.h #defines this as size_t, at least in glibc2. */
69 #ifndef __malloc_size_t
70 #define __malloc_size_t int
71 #endif
72
73 /* Specify maximum number of areas to mmap. It would be nice to use a
74 value that explicitly means "no limit". */
75
76 #define MMAP_MAX_AREAS 100000000
77
78 #else /* not DOUG_LEA_MALLOC */
79
80 /* The following come from gmalloc.c. */
81
82 #define __malloc_size_t size_t
83 extern __malloc_size_t _bytes_used;
84 extern __malloc_size_t __malloc_extra_blocks;
85
86 #endif /* not DOUG_LEA_MALLOC */
87
88 /* Value of _bytes_used, when spare_memory was freed. */
89
90 static __malloc_size_t bytes_used_when_full;
91
92 /* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
93 to a struct Lisp_String. */
94
95 #define MARK_STRING(S) ((S)->size |= ARRAY_MARK_FLAG)
96 #define UNMARK_STRING(S) ((S)->size &= ~ARRAY_MARK_FLAG)
97 #define STRING_MARKED_P(S) ((S)->size & ARRAY_MARK_FLAG)
98
99 #define VECTOR_MARK(V) ((V)->size |= ARRAY_MARK_FLAG)
100 #define VECTOR_UNMARK(V) ((V)->size &= ~ARRAY_MARK_FLAG)
101 #define VECTOR_MARKED_P(V) ((V)->size & ARRAY_MARK_FLAG)
102
103 /* Value is the number of bytes/chars of S, a pointer to a struct
104 Lisp_String. This must be used instead of STRING_BYTES (S) or
105 S->size during GC, because S->size contains the mark bit for
106 strings. */
107
108 #define GC_STRING_BYTES(S) (STRING_BYTES (S))
109 #define GC_STRING_CHARS(S) ((S)->size & ~ARRAY_MARK_FLAG)
110
111 /* Number of bytes of consing done since the last gc. */
112
113 int consing_since_gc;
114
115 /* Count the amount of consing of various sorts of space. */
116
117 EMACS_INT cons_cells_consed;
118 EMACS_INT floats_consed;
119 EMACS_INT vector_cells_consed;
120 EMACS_INT symbols_consed;
121 EMACS_INT string_chars_consed;
122 EMACS_INT misc_objects_consed;
123 EMACS_INT intervals_consed;
124 EMACS_INT strings_consed;
125
126 /* Number of bytes of consing since GC before another GC should be done. */
127
128 EMACS_INT gc_cons_threshold;
129
130 /* Nonzero during GC. */
131
132 int gc_in_progress;
133
134 /* Nonzero means abort if try to GC.
135 This is for code which is written on the assumption that
136 no GC will happen, so as to verify that assumption. */
137
138 int abort_on_gc;
139
140 /* Nonzero means display messages at beginning and end of GC. */
141
142 int garbage_collection_messages;
143
144 #ifndef VIRT_ADDR_VARIES
145 extern
146 #endif /* VIRT_ADDR_VARIES */
147 int malloc_sbrk_used;
148
149 #ifndef VIRT_ADDR_VARIES
150 extern
151 #endif /* VIRT_ADDR_VARIES */
152 int malloc_sbrk_unused;
153
154 /* Two limits controlling how much undo information to keep. */
155
156 EMACS_INT undo_limit;
157 EMACS_INT undo_strong_limit;
158
159 /* Number of live and free conses etc. */
160
161 static int total_conses, total_markers, total_symbols, total_vector_size;
162 static int total_free_conses, total_free_markers, total_free_symbols;
163 static int total_free_floats, total_floats;
164
165 /* Points to memory space allocated as "spare", to be freed if we run
166 out of memory. */
167
168 static char *spare_memory;
169
170 /* Amount of spare memory to keep in reserve. */
171
172 #define SPARE_MEMORY (1 << 14)
173
174 /* Number of extra blocks malloc should get when it needs more core. */
175
176 static int malloc_hysteresis;
177
178 /* Non-nil means defun should do purecopy on the function definition. */
179
180 Lisp_Object Vpurify_flag;
181
182 /* Non-nil means we are handling a memory-full error. */
183
184 Lisp_Object Vmemory_full;
185
186 #ifndef HAVE_SHM
187
188 /* Force it into data space! Initialize it to a nonzero value;
189 otherwise some compilers put it into BSS. */
190
191 EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {1,};
192 #define PUREBEG (char *) pure
193
194 #else /* HAVE_SHM */
195
196 #define pure PURE_SEG_BITS /* Use shared memory segment */
197 #define PUREBEG (char *)PURE_SEG_BITS
198
199 #endif /* HAVE_SHM */
200
201 /* Pointer to the pure area, and its size. */
202
203 static char *purebeg;
204 static size_t pure_size;
205
206 /* Number of bytes of pure storage used before pure storage overflowed.
207 If this is non-zero, this implies that an overflow occurred. */
208
209 static size_t pure_bytes_used_before_overflow;
210
211 /* Value is non-zero if P points into pure space. */
212
213 #define PURE_POINTER_P(P) \
214 (((PNTR_COMPARISON_TYPE) (P) \
215 < (PNTR_COMPARISON_TYPE) ((char *) purebeg + pure_size)) \
216 && ((PNTR_COMPARISON_TYPE) (P) \
217 >= (PNTR_COMPARISON_TYPE) purebeg))
218
219 /* Index in pure at which next pure object will be allocated.. */
220
221 EMACS_INT pure_bytes_used;
222
223 /* If nonzero, this is a warning delivered by malloc and not yet
224 displayed. */
225
226 char *pending_malloc_warning;
227
228 /* Pre-computed signal argument for use when memory is exhausted. */
229
230 Lisp_Object Vmemory_signal_data;
231
232 /* Maximum amount of C stack to save when a GC happens. */
233
234 #ifndef MAX_SAVE_STACK
235 #define MAX_SAVE_STACK 16000
236 #endif
237
238 /* Buffer in which we save a copy of the C stack at each GC. */
239
240 char *stack_copy;
241 int stack_copy_size;
242
243 /* Non-zero means ignore malloc warnings. Set during initialization.
244 Currently not used. */
245
246 int ignore_warnings;
247
248 Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots;
249
250 /* Hook run after GC has finished. */
251
252 Lisp_Object Vpost_gc_hook, Qpost_gc_hook;
253
254 Lisp_Object Vgc_elapsed; /* accumulated elapsed time in GC */
255 EMACS_INT gcs_done; /* accumulated GCs */
256
257 static void mark_buffer P_ ((Lisp_Object));
258 extern void mark_kboards P_ ((void));
259 static void gc_sweep P_ ((void));
260 static void mark_glyph_matrix P_ ((struct glyph_matrix *));
261 static void mark_face_cache P_ ((struct face_cache *));
262
263 #ifdef HAVE_WINDOW_SYSTEM
264 static void mark_image P_ ((struct image *));
265 static void mark_image_cache P_ ((struct frame *));
266 #endif /* HAVE_WINDOW_SYSTEM */
267
268 static struct Lisp_String *allocate_string P_ ((void));
269 static void compact_small_strings P_ ((void));
270 static void free_large_strings P_ ((void));
271 static void sweep_strings P_ ((void));
272
273 extern int message_enable_multibyte;
274
275 /* When scanning the C stack for live Lisp objects, Emacs keeps track
276 of what memory allocated via lisp_malloc is intended for what
277 purpose. This enumeration specifies the type of memory. */
278
279 enum mem_type
280 {
281 MEM_TYPE_NON_LISP,
282 MEM_TYPE_BUFFER,
283 MEM_TYPE_CONS,
284 MEM_TYPE_STRING,
285 MEM_TYPE_MISC,
286 MEM_TYPE_SYMBOL,
287 MEM_TYPE_FLOAT,
288 /* Keep the following vector-like types together, with
289 MEM_TYPE_WINDOW being the last, and MEM_TYPE_VECTOR the
290 first. Or change the code of live_vector_p, for instance. */
291 MEM_TYPE_VECTOR,
292 MEM_TYPE_PROCESS,
293 MEM_TYPE_HASH_TABLE,
294 MEM_TYPE_FRAME,
295 MEM_TYPE_WINDOW
296 };
297
298 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
299
300 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
301 #include <stdio.h> /* For fprintf. */
302 #endif
303
304 /* A unique object in pure space used to make some Lisp objects
305 on free lists recognizable in O(1). */
306
307 Lisp_Object Vdead;
308
309 #ifdef GC_MALLOC_CHECK
310
311 enum mem_type allocated_mem_type;
312 int dont_register_blocks;
313
314 #endif /* GC_MALLOC_CHECK */
315
316 /* A node in the red-black tree describing allocated memory containing
317 Lisp data. Each such block is recorded with its start and end
318 address when it is allocated, and removed from the tree when it
319 is freed.
320
321 A red-black tree is a balanced binary tree with the following
322 properties:
323
324 1. Every node is either red or black.
325 2. Every leaf is black.
326 3. If a node is red, then both of its children are black.
327 4. Every simple path from a node to a descendant leaf contains
328 the same number of black nodes.
329 5. The root is always black.
330
331 When nodes are inserted into the tree, or deleted from the tree,
332 the tree is "fixed" so that these properties are always true.
333
334 A red-black tree with N internal nodes has height at most 2
335 log(N+1). Searches, insertions and deletions are done in O(log N).
336 Please see a text book about data structures for a detailed
337 description of red-black trees. Any book worth its salt should
338 describe them. */
339
340 struct mem_node
341 {
342 /* Children of this node. These pointers are never NULL. When there
343 is no child, the value is MEM_NIL, which points to a dummy node. */
344 struct mem_node *left, *right;
345
346 /* The parent of this node. In the root node, this is NULL. */
347 struct mem_node *parent;
348
349 /* Start and end of allocated region. */
350 void *start, *end;
351
352 /* Node color. */
353 enum {MEM_BLACK, MEM_RED} color;
354
355 /* Memory type. */
356 enum mem_type type;
357 };
358
359 /* Base address of stack. Set in main. */
360
361 Lisp_Object *stack_base;
362
363 /* Root of the tree describing allocated Lisp memory. */
364
365 static struct mem_node *mem_root;
366
367 /* Lowest and highest known address in the heap. */
368
369 static void *min_heap_address, *max_heap_address;
370
371 /* Sentinel node of the tree. */
372
373 static struct mem_node mem_z;
374 #define MEM_NIL &mem_z
375
376 static POINTER_TYPE *lisp_malloc P_ ((size_t, enum mem_type));
377 static struct Lisp_Vector *allocate_vectorlike P_ ((EMACS_INT, enum mem_type));
378 static void lisp_free P_ ((POINTER_TYPE *));
379 static void mark_stack P_ ((void));
380 static int live_vector_p P_ ((struct mem_node *, void *));
381 static int live_buffer_p P_ ((struct mem_node *, void *));
382 static int live_string_p P_ ((struct mem_node *, void *));
383 static int live_cons_p P_ ((struct mem_node *, void *));
384 static int live_symbol_p P_ ((struct mem_node *, void *));
385 static int live_float_p P_ ((struct mem_node *, void *));
386 static int live_misc_p P_ ((struct mem_node *, void *));
387 static void mark_maybe_object P_ ((Lisp_Object));
388 static void mark_memory P_ ((void *, void *));
389 static void mem_init P_ ((void));
390 static struct mem_node *mem_insert P_ ((void *, void *, enum mem_type));
391 static void mem_insert_fixup P_ ((struct mem_node *));
392 static void mem_rotate_left P_ ((struct mem_node *));
393 static void mem_rotate_right P_ ((struct mem_node *));
394 static void mem_delete P_ ((struct mem_node *));
395 static void mem_delete_fixup P_ ((struct mem_node *));
396 static INLINE struct mem_node *mem_find P_ ((void *));
397
398 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
399 static void check_gcpros P_ ((void));
400 #endif
401
402 #endif /* GC_MARK_STACK || GC_MALLOC_CHECK */
403
404 /* Recording what needs to be marked for gc. */
405
406 struct gcpro *gcprolist;
407
408 /* Addresses of staticpro'd variables. Initialize it to a nonzero
409 value; otherwise some compilers put it into BSS. */
410
411 #define NSTATICS 1280
412 Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag};
413
414 /* Index of next unused slot in staticvec. */
415
416 int staticidx = 0;
417
418 static POINTER_TYPE *pure_alloc P_ ((size_t, int));
419
420
421 /* Value is SZ rounded up to the next multiple of ALIGNMENT.
422 ALIGNMENT must be a power of 2. */
423
424 #define ALIGN(ptr, ALIGNMENT) \
425 ((POINTER_TYPE *) ((((EMACS_UINT)(ptr)) + (ALIGNMENT) - 1) \
426 & ~((ALIGNMENT) - 1)))
427
428
429 \f
430 /************************************************************************
431 Malloc
432 ************************************************************************/
433
434 /* Function malloc calls this if it finds we are near exhausting storage. */
435
436 void
437 malloc_warning (str)
438 char *str;
439 {
440 pending_malloc_warning = str;
441 }
442
443
444 /* Display an already-pending malloc warning. */
445
446 void
447 display_malloc_warning ()
448 {
449 call3 (intern ("display-warning"),
450 intern ("alloc"),
451 build_string (pending_malloc_warning),
452 intern ("emergency"));
453 pending_malloc_warning = 0;
454 }
455
456
457 #ifdef DOUG_LEA_MALLOC
458 # define BYTES_USED (mallinfo ().arena)
459 #else
460 # define BYTES_USED _bytes_used
461 #endif
462
463
464 /* Called if malloc returns zero. */
465
466 void
467 memory_full ()
468 {
469 Vmemory_full = Qt;
470
471 #ifndef SYSTEM_MALLOC
472 bytes_used_when_full = BYTES_USED;
473 #endif
474
475 /* The first time we get here, free the spare memory. */
476 if (spare_memory)
477 {
478 free (spare_memory);
479 spare_memory = 0;
480 }
481
482 /* This used to call error, but if we've run out of memory, we could
483 get infinite recursion trying to build the string. */
484 while (1)
485 Fsignal (Qnil, Vmemory_signal_data);
486 }
487
488
489 /* Called if we can't allocate relocatable space for a buffer. */
490
491 void
492 buffer_memory_full ()
493 {
494 /* If buffers use the relocating allocator, no need to free
495 spare_memory, because we may have plenty of malloc space left
496 that we could get, and if we don't, the malloc that fails will
497 itself cause spare_memory to be freed. If buffers don't use the
498 relocating allocator, treat this like any other failing
499 malloc. */
500
501 #ifndef REL_ALLOC
502 memory_full ();
503 #endif
504
505 Vmemory_full = Qt;
506
507 /* This used to call error, but if we've run out of memory, we could
508 get infinite recursion trying to build the string. */
509 while (1)
510 Fsignal (Qnil, Vmemory_signal_data);
511 }
512
513
514 /* Like malloc but check for no memory and block interrupt input.. */
515
516 POINTER_TYPE *
517 xmalloc (size)
518 size_t size;
519 {
520 register POINTER_TYPE *val;
521
522 BLOCK_INPUT;
523 val = (POINTER_TYPE *) malloc (size);
524 UNBLOCK_INPUT;
525
526 if (!val && size)
527 memory_full ();
528 return val;
529 }
530
531
532 /* Like realloc but check for no memory and block interrupt input.. */
533
534 POINTER_TYPE *
535 xrealloc (block, size)
536 POINTER_TYPE *block;
537 size_t size;
538 {
539 register POINTER_TYPE *val;
540
541 BLOCK_INPUT;
542 /* We must call malloc explicitly when BLOCK is 0, since some
543 reallocs don't do this. */
544 if (! block)
545 val = (POINTER_TYPE *) malloc (size);
546 else
547 val = (POINTER_TYPE *) realloc (block, size);
548 UNBLOCK_INPUT;
549
550 if (!val && size) memory_full ();
551 return val;
552 }
553
554
555 /* Like free but block interrupt input.. */
556
557 void
558 xfree (block)
559 POINTER_TYPE *block;
560 {
561 BLOCK_INPUT;
562 free (block);
563 UNBLOCK_INPUT;
564 }
565
566
567 /* Like strdup, but uses xmalloc. */
568
569 char *
570 xstrdup (s)
571 const char *s;
572 {
573 size_t len = strlen (s) + 1;
574 char *p = (char *) xmalloc (len);
575 bcopy (s, p, len);
576 return p;
577 }
578
579
580 /* Like malloc but used for allocating Lisp data. NBYTES is the
581 number of bytes to allocate, TYPE describes the intended use of the
582 allcated memory block (for strings, for conses, ...). */
583
584 static void *lisp_malloc_loser;
585
586 static POINTER_TYPE *
587 lisp_malloc (nbytes, type)
588 size_t nbytes;
589 enum mem_type type;
590 {
591 register void *val;
592
593 BLOCK_INPUT;
594
595 #ifdef GC_MALLOC_CHECK
596 allocated_mem_type = type;
597 #endif
598
599 val = (void *) malloc (nbytes);
600
601 /* If the memory just allocated cannot be addressed thru a Lisp
602 object's pointer, and it needs to be,
603 that's equivalent to running out of memory. */
604 if (val && type != MEM_TYPE_NON_LISP)
605 {
606 Lisp_Object tem;
607 XSETCONS (tem, (char *) val + nbytes - 1);
608 if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
609 {
610 lisp_malloc_loser = val;
611 free (val);
612 val = 0;
613 }
614 }
615
616 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
617 if (val && type != MEM_TYPE_NON_LISP)
618 mem_insert (val, (char *) val + nbytes, type);
619 #endif
620
621 UNBLOCK_INPUT;
622 if (!val && nbytes)
623 memory_full ();
624 return val;
625 }
626
627 /* Free BLOCK. This must be called to free memory allocated with a
628 call to lisp_malloc. */
629
630 static void
631 lisp_free (block)
632 POINTER_TYPE *block;
633 {
634 BLOCK_INPUT;
635 free (block);
636 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
637 mem_delete (mem_find (block));
638 #endif
639 UNBLOCK_INPUT;
640 }
641
642 /* Allocation of aligned blocks of memory to store Lisp data. */
643 /* The entry point is lisp_align_malloc which returns blocks of at most */
644 /* BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
645
646
647 /* BLOCK_ALIGN has to be a power of 2. */
648 #define BLOCK_ALIGN (1 << 10)
649
650 /* Padding to leave at the end of a malloc'd block. This is to give
651 malloc a chance to minimize the amount of memory wasted to alignment.
652 It should be tuned to the particular malloc library used.
653 On glibc-2.3.2, malloc never tries to align, so a padding of 0 is best.
654 posix_memalign on the other hand would ideally prefer a value of 4
655 because otherwise, there's 1020 bytes wasted between each ablocks.
656 But testing shows that those 1020 will most of the time be efficiently
657 used by malloc to place other objects, so a value of 0 is still preferable
658 unless you have a lot of cons&floats and virtually nothing else. */
659 #define BLOCK_PADDING 0
660 #define BLOCK_BYTES \
661 (BLOCK_ALIGN - sizeof (struct aligned_block *) - BLOCK_PADDING)
662
663 /* Internal data structures and constants. */
664
665 #define ABLOCKS_SIZE 16
666
667 /* An aligned block of memory. */
668 struct ablock
669 {
670 union
671 {
672 char payload[BLOCK_BYTES];
673 struct ablock *next_free;
674 } x;
675 /* `abase' is the aligned base of the ablocks. */
676 /* It is overloaded to hold the virtual `busy' field that counts
677 the number of used ablock in the parent ablocks.
678 The first ablock has the `busy' field, the others have the `abase'
679 field. To tell the difference, we assume that pointers will have
680 integer values larger than 2 * ABLOCKS_SIZE. The lowest bit of `busy'
681 is used to tell whether the real base of the parent ablocks is `abase'
682 (if not, the word before the first ablock holds a pointer to the
683 real base). */
684 struct ablocks *abase;
685 /* The padding of all but the last ablock is unused. The padding of
686 the last ablock in an ablocks is not allocated. */
687 #if BLOCK_PADDING
688 char padding[BLOCK_PADDING];
689 #endif
690 };
691
692 /* A bunch of consecutive aligned blocks. */
693 struct ablocks
694 {
695 struct ablock blocks[ABLOCKS_SIZE];
696 };
697
698 /* Size of the block requested from malloc or memalign. */
699 #define ABLOCKS_BYTES (sizeof (struct ablocks) - BLOCK_PADDING)
700
701 #define ABLOCK_ABASE(block) \
702 (((unsigned long) (block)->abase) <= (1 + 2 * ABLOCKS_SIZE) \
703 ? (struct ablocks *)(block) \
704 : (block)->abase)
705
706 /* Virtual `busy' field. */
707 #define ABLOCKS_BUSY(abase) ((abase)->blocks[0].abase)
708
709 /* Pointer to the (not necessarily aligned) malloc block. */
710 #ifdef HAVE_POSIX_MEMALIGN
711 #define ABLOCKS_BASE(abase) (abase)
712 #else
713 #define ABLOCKS_BASE(abase) \
714 (1 & (int) ABLOCKS_BUSY (abase) ? abase : ((void**)abase)[-1])
715 #endif
716
717 /* The list of free ablock. */
718 static struct ablock *free_ablock;
719
720 /* Allocate an aligned block of nbytes.
721 Alignment is on a multiple of BLOCK_ALIGN and `nbytes' has to be
722 smaller or equal to BLOCK_BYTES. */
723 static POINTER_TYPE *
724 lisp_align_malloc (nbytes, type)
725 size_t nbytes;
726 enum mem_type type;
727 {
728 void *base, *val;
729 struct ablocks *abase;
730
731 eassert (nbytes <= BLOCK_BYTES);
732
733 BLOCK_INPUT;
734
735 #ifdef GC_MALLOC_CHECK
736 allocated_mem_type = type;
737 #endif
738
739 if (!free_ablock)
740 {
741 int i, aligned;
742
743 #ifdef DOUG_LEA_MALLOC
744 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
745 because mapped region contents are not preserved in
746 a dumped Emacs. */
747 mallopt (M_MMAP_MAX, 0);
748 #endif
749
750 #ifdef HAVE_POSIX_MEMALIGN
751 {
752 int err = posix_memalign (&base, BLOCK_ALIGN, ABLOCKS_BYTES);
753 abase = err ? (base = NULL) : base;
754 }
755 #else
756 base = malloc (ABLOCKS_BYTES);
757 abase = ALIGN (base, BLOCK_ALIGN);
758 #endif
759
760 aligned = (base == abase);
761 if (!aligned)
762 ((void**)abase)[-1] = base;
763
764 #ifdef DOUG_LEA_MALLOC
765 /* Back to a reasonable maximum of mmap'ed areas. */
766 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
767 #endif
768
769 /* If the memory just allocated cannot be addressed thru a Lisp
770 object's pointer, and it needs to be, that's equivalent to
771 running out of memory. */
772 if (type != MEM_TYPE_NON_LISP)
773 {
774 Lisp_Object tem;
775 char *end = (char *) base + ABLOCKS_BYTES - 1;
776 XSETCONS (tem, end);
777 if ((char *) XCONS (tem) != end)
778 {
779 lisp_malloc_loser = base;
780 free (base);
781 UNBLOCK_INPUT;
782 memory_full ();
783 }
784 }
785
786 /* Initialize the blocks and put them on the free list.
787 Is `base' was not properly aligned, we can't use the last block. */
788 for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
789 {
790 abase->blocks[i].abase = abase;
791 abase->blocks[i].x.next_free = free_ablock;
792 free_ablock = &abase->blocks[i];
793 }
794 ABLOCKS_BUSY (abase) = (struct ablocks *) aligned;
795
796 eassert (0 == ((EMACS_UINT)abase) % BLOCK_ALIGN);
797 eassert (ABLOCK_ABASE (&abase->blocks[3]) == abase); /* 3 is arbitrary */
798 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase);
799 eassert (ABLOCKS_BASE (abase) == base);
800 eassert (aligned == (int)ABLOCKS_BUSY (abase));
801 }
802
803 abase = ABLOCK_ABASE (free_ablock);
804 ABLOCKS_BUSY (abase) = (struct ablocks *) (2 + (int) ABLOCKS_BUSY (abase));
805 val = free_ablock;
806 free_ablock = free_ablock->x.next_free;
807
808 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
809 if (val && type != MEM_TYPE_NON_LISP)
810 mem_insert (val, (char *) val + nbytes, type);
811 #endif
812
813 UNBLOCK_INPUT;
814 if (!val && nbytes)
815 memory_full ();
816
817 eassert (0 == ((EMACS_UINT)val) % BLOCK_ALIGN);
818 return val;
819 }
820
821 static void
822 lisp_align_free (block)
823 POINTER_TYPE *block;
824 {
825 struct ablock *ablock = block;
826 struct ablocks *abase = ABLOCK_ABASE (ablock);
827
828 BLOCK_INPUT;
829 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
830 mem_delete (mem_find (block));
831 #endif
832 /* Put on free list. */
833 ablock->x.next_free = free_ablock;
834 free_ablock = ablock;
835 /* Update busy count. */
836 ABLOCKS_BUSY (abase) = (struct ablocks *) (-2 + (int) ABLOCKS_BUSY (abase));
837
838 if (2 > (int) ABLOCKS_BUSY (abase))
839 { /* All the blocks are free. */
840 int i = 0, aligned = (int) ABLOCKS_BUSY (abase);
841 struct ablock **tem = &free_ablock;
842 struct ablock *atop = &abase->blocks[aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1];
843
844 while (*tem)
845 {
846 if (*tem >= (struct ablock *) abase && *tem < atop)
847 {
848 i++;
849 *tem = (*tem)->x.next_free;
850 }
851 else
852 tem = &(*tem)->x.next_free;
853 }
854 eassert ((aligned & 1) == aligned);
855 eassert (i == (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1));
856 free (ABLOCKS_BASE (abase));
857 }
858 UNBLOCK_INPUT;
859 }
860
861 /* Return a new buffer structure allocated from the heap with
862 a call to lisp_malloc. */
863
864 struct buffer *
865 allocate_buffer ()
866 {
867 struct buffer *b
868 = (struct buffer *) lisp_malloc (sizeof (struct buffer),
869 MEM_TYPE_BUFFER);
870 return b;
871 }
872
873 \f
874 /* Arranging to disable input signals while we're in malloc.
875
876 This only works with GNU malloc. To help out systems which can't
877 use GNU malloc, all the calls to malloc, realloc, and free
878 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
879 pairs; unfortunately, we have no idea what C library functions
880 might call malloc, so we can't really protect them unless you're
881 using GNU malloc. Fortunately, most of the major operating systems
882 can use GNU malloc. */
883
884 #ifndef SYSTEM_MALLOC
885 #ifndef DOUG_LEA_MALLOC
886 extern void * (*__malloc_hook) P_ ((size_t));
887 extern void * (*__realloc_hook) P_ ((void *, size_t));
888 extern void (*__free_hook) P_ ((void *));
889 /* Else declared in malloc.h, perhaps with an extra arg. */
890 #endif /* DOUG_LEA_MALLOC */
891 static void * (*old_malloc_hook) ();
892 static void * (*old_realloc_hook) ();
893 static void (*old_free_hook) ();
894
895 /* This function is used as the hook for free to call. */
896
897 static void
898 emacs_blocked_free (ptr)
899 void *ptr;
900 {
901 BLOCK_INPUT;
902
903 #ifdef GC_MALLOC_CHECK
904 if (ptr)
905 {
906 struct mem_node *m;
907
908 m = mem_find (ptr);
909 if (m == MEM_NIL || m->start != ptr)
910 {
911 fprintf (stderr,
912 "Freeing `%p' which wasn't allocated with malloc\n", ptr);
913 abort ();
914 }
915 else
916 {
917 /* fprintf (stderr, "free %p...%p (%p)\n", m->start, m->end, ptr); */
918 mem_delete (m);
919 }
920 }
921 #endif /* GC_MALLOC_CHECK */
922
923 __free_hook = old_free_hook;
924 free (ptr);
925
926 /* If we released our reserve (due to running out of memory),
927 and we have a fair amount free once again,
928 try to set aside another reserve in case we run out once more. */
929 if (spare_memory == 0
930 /* Verify there is enough space that even with the malloc
931 hysteresis this call won't run out again.
932 The code here is correct as long as SPARE_MEMORY
933 is substantially larger than the block size malloc uses. */
934 && (bytes_used_when_full
935 > BYTES_USED + max (malloc_hysteresis, 4) * SPARE_MEMORY))
936 spare_memory = (char *) malloc ((size_t) SPARE_MEMORY);
937
938 __free_hook = emacs_blocked_free;
939 UNBLOCK_INPUT;
940 }
941
942
943 /* If we released our reserve (due to running out of memory),
944 and we have a fair amount free once again,
945 try to set aside another reserve in case we run out once more.
946
947 This is called when a relocatable block is freed in ralloc.c. */
948
949 void
950 refill_memory_reserve ()
951 {
952 if (spare_memory == 0)
953 spare_memory = (char *) malloc ((size_t) SPARE_MEMORY);
954 }
955
956
957 /* This function is the malloc hook that Emacs uses. */
958
959 static void *
960 emacs_blocked_malloc (size)
961 size_t size;
962 {
963 void *value;
964
965 BLOCK_INPUT;
966 __malloc_hook = old_malloc_hook;
967 #ifdef DOUG_LEA_MALLOC
968 mallopt (M_TOP_PAD, malloc_hysteresis * 4096);
969 #else
970 __malloc_extra_blocks = malloc_hysteresis;
971 #endif
972
973 value = (void *) malloc (size);
974
975 #ifdef GC_MALLOC_CHECK
976 {
977 struct mem_node *m = mem_find (value);
978 if (m != MEM_NIL)
979 {
980 fprintf (stderr, "Malloc returned %p which is already in use\n",
981 value);
982 fprintf (stderr, "Region in use is %p...%p, %u bytes, type %d\n",
983 m->start, m->end, (char *) m->end - (char *) m->start,
984 m->type);
985 abort ();
986 }
987
988 if (!dont_register_blocks)
989 {
990 mem_insert (value, (char *) value + max (1, size), allocated_mem_type);
991 allocated_mem_type = MEM_TYPE_NON_LISP;
992 }
993 }
994 #endif /* GC_MALLOC_CHECK */
995
996 __malloc_hook = emacs_blocked_malloc;
997 UNBLOCK_INPUT;
998
999 /* fprintf (stderr, "%p malloc\n", value); */
1000 return value;
1001 }
1002
1003
1004 /* This function is the realloc hook that Emacs uses. */
1005
1006 static void *
1007 emacs_blocked_realloc (ptr, size)
1008 void *ptr;
1009 size_t size;
1010 {
1011 void *value;
1012
1013 BLOCK_INPUT;
1014 __realloc_hook = old_realloc_hook;
1015
1016 #ifdef GC_MALLOC_CHECK
1017 if (ptr)
1018 {
1019 struct mem_node *m = mem_find (ptr);
1020 if (m == MEM_NIL || m->start != ptr)
1021 {
1022 fprintf (stderr,
1023 "Realloc of %p which wasn't allocated with malloc\n",
1024 ptr);
1025 abort ();
1026 }
1027
1028 mem_delete (m);
1029 }
1030
1031 /* fprintf (stderr, "%p -> realloc\n", ptr); */
1032
1033 /* Prevent malloc from registering blocks. */
1034 dont_register_blocks = 1;
1035 #endif /* GC_MALLOC_CHECK */
1036
1037 value = (void *) realloc (ptr, size);
1038
1039 #ifdef GC_MALLOC_CHECK
1040 dont_register_blocks = 0;
1041
1042 {
1043 struct mem_node *m = mem_find (value);
1044 if (m != MEM_NIL)
1045 {
1046 fprintf (stderr, "Realloc returns memory that is already in use\n");
1047 abort ();
1048 }
1049
1050 /* Can't handle zero size regions in the red-black tree. */
1051 mem_insert (value, (char *) value + max (size, 1), MEM_TYPE_NON_LISP);
1052 }
1053
1054 /* fprintf (stderr, "%p <- realloc\n", value); */
1055 #endif /* GC_MALLOC_CHECK */
1056
1057 __realloc_hook = emacs_blocked_realloc;
1058 UNBLOCK_INPUT;
1059
1060 return value;
1061 }
1062
1063
1064 /* Called from main to set up malloc to use our hooks. */
1065
1066 void
1067 uninterrupt_malloc ()
1068 {
1069 if (__free_hook != emacs_blocked_free)
1070 old_free_hook = __free_hook;
1071 __free_hook = emacs_blocked_free;
1072
1073 if (__malloc_hook != emacs_blocked_malloc)
1074 old_malloc_hook = __malloc_hook;
1075 __malloc_hook = emacs_blocked_malloc;
1076
1077 if (__realloc_hook != emacs_blocked_realloc)
1078 old_realloc_hook = __realloc_hook;
1079 __realloc_hook = emacs_blocked_realloc;
1080 }
1081
1082 #endif /* not SYSTEM_MALLOC */
1083
1084
1085 \f
1086 /***********************************************************************
1087 Interval Allocation
1088 ***********************************************************************/
1089
1090 /* Number of intervals allocated in an interval_block structure.
1091 The 1020 is 1024 minus malloc overhead. */
1092
1093 #define INTERVAL_BLOCK_SIZE \
1094 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
1095
1096 /* Intervals are allocated in chunks in form of an interval_block
1097 structure. */
1098
1099 struct interval_block
1100 {
1101 struct interval_block *next;
1102 struct interval intervals[INTERVAL_BLOCK_SIZE];
1103 };
1104
1105 /* Current interval block. Its `next' pointer points to older
1106 blocks. */
1107
1108 struct interval_block *interval_block;
1109
1110 /* Index in interval_block above of the next unused interval
1111 structure. */
1112
1113 static int interval_block_index;
1114
1115 /* Number of free and live intervals. */
1116
1117 static int total_free_intervals, total_intervals;
1118
1119 /* List of free intervals. */
1120
1121 INTERVAL interval_free_list;
1122
1123 /* Total number of interval blocks now in use. */
1124
1125 int n_interval_blocks;
1126
1127
1128 /* Initialize interval allocation. */
1129
1130 static void
1131 init_intervals ()
1132 {
1133 interval_block
1134 = (struct interval_block *) lisp_malloc (sizeof *interval_block,
1135 MEM_TYPE_NON_LISP);
1136 interval_block->next = 0;
1137 bzero ((char *) interval_block->intervals, sizeof interval_block->intervals);
1138 interval_block_index = 0;
1139 interval_free_list = 0;
1140 n_interval_blocks = 1;
1141 }
1142
1143
1144 /* Return a new interval. */
1145
1146 INTERVAL
1147 make_interval ()
1148 {
1149 INTERVAL val;
1150
1151 if (interval_free_list)
1152 {
1153 val = interval_free_list;
1154 interval_free_list = INTERVAL_PARENT (interval_free_list);
1155 }
1156 else
1157 {
1158 if (interval_block_index == INTERVAL_BLOCK_SIZE)
1159 {
1160 register struct interval_block *newi;
1161
1162 newi = (struct interval_block *) lisp_malloc (sizeof *newi,
1163 MEM_TYPE_NON_LISP);
1164
1165 newi->next = interval_block;
1166 interval_block = newi;
1167 interval_block_index = 0;
1168 n_interval_blocks++;
1169 }
1170 val = &interval_block->intervals[interval_block_index++];
1171 }
1172 consing_since_gc += sizeof (struct interval);
1173 intervals_consed++;
1174 RESET_INTERVAL (val);
1175 val->gcmarkbit = 0;
1176 return val;
1177 }
1178
1179
1180 /* Mark Lisp objects in interval I. */
1181
1182 static void
1183 mark_interval (i, dummy)
1184 register INTERVAL i;
1185 Lisp_Object dummy;
1186 {
1187 eassert (!i->gcmarkbit); /* Intervals are never shared. */
1188 i->gcmarkbit = 1;
1189 mark_object (i->plist);
1190 }
1191
1192
1193 /* Mark the interval tree rooted in TREE. Don't call this directly;
1194 use the macro MARK_INTERVAL_TREE instead. */
1195
1196 static void
1197 mark_interval_tree (tree)
1198 register INTERVAL tree;
1199 {
1200 /* No need to test if this tree has been marked already; this
1201 function is always called through the MARK_INTERVAL_TREE macro,
1202 which takes care of that. */
1203
1204 traverse_intervals_noorder (tree, mark_interval, Qnil);
1205 }
1206
1207
1208 /* Mark the interval tree rooted in I. */
1209
1210 #define MARK_INTERVAL_TREE(i) \
1211 do { \
1212 if (!NULL_INTERVAL_P (i) && !i->gcmarkbit) \
1213 mark_interval_tree (i); \
1214 } while (0)
1215
1216
1217 #define UNMARK_BALANCE_INTERVALS(i) \
1218 do { \
1219 if (! NULL_INTERVAL_P (i)) \
1220 (i) = balance_intervals (i); \
1221 } while (0)
1222
1223 \f
1224 /* Number support. If NO_UNION_TYPE isn't in effect, we
1225 can't create number objects in macros. */
1226 #ifndef make_number
1227 Lisp_Object
1228 make_number (n)
1229 int n;
1230 {
1231 Lisp_Object obj;
1232 obj.s.val = n;
1233 obj.s.type = Lisp_Int;
1234 return obj;
1235 }
1236 #endif
1237 \f
1238 /***********************************************************************
1239 String Allocation
1240 ***********************************************************************/
1241
1242 /* Lisp_Strings are allocated in string_block structures. When a new
1243 string_block is allocated, all the Lisp_Strings it contains are
1244 added to a free-list string_free_list. When a new Lisp_String is
1245 needed, it is taken from that list. During the sweep phase of GC,
1246 string_blocks that are entirely free are freed, except two which
1247 we keep.
1248
1249 String data is allocated from sblock structures. Strings larger
1250 than LARGE_STRING_BYTES, get their own sblock, data for smaller
1251 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
1252
1253 Sblocks consist internally of sdata structures, one for each
1254 Lisp_String. The sdata structure points to the Lisp_String it
1255 belongs to. The Lisp_String points back to the `u.data' member of
1256 its sdata structure.
1257
1258 When a Lisp_String is freed during GC, it is put back on
1259 string_free_list, and its `data' member and its sdata's `string'
1260 pointer is set to null. The size of the string is recorded in the
1261 `u.nbytes' member of the sdata. So, sdata structures that are no
1262 longer used, can be easily recognized, and it's easy to compact the
1263 sblocks of small strings which we do in compact_small_strings. */
1264
1265 /* Size in bytes of an sblock structure used for small strings. This
1266 is 8192 minus malloc overhead. */
1267
1268 #define SBLOCK_SIZE 8188
1269
1270 /* Strings larger than this are considered large strings. String data
1271 for large strings is allocated from individual sblocks. */
1272
1273 #define LARGE_STRING_BYTES 1024
1274
1275 /* Structure describing string memory sub-allocated from an sblock.
1276 This is where the contents of Lisp strings are stored. */
1277
1278 struct sdata
1279 {
1280 /* Back-pointer to the string this sdata belongs to. If null, this
1281 structure is free, and the NBYTES member of the union below
1282 contains the string's byte size (the same value that STRING_BYTES
1283 would return if STRING were non-null). If non-null, STRING_BYTES
1284 (STRING) is the size of the data, and DATA contains the string's
1285 contents. */
1286 struct Lisp_String *string;
1287
1288 #ifdef GC_CHECK_STRING_BYTES
1289
1290 EMACS_INT nbytes;
1291 unsigned char data[1];
1292
1293 #define SDATA_NBYTES(S) (S)->nbytes
1294 #define SDATA_DATA(S) (S)->data
1295
1296 #else /* not GC_CHECK_STRING_BYTES */
1297
1298 union
1299 {
1300 /* When STRING in non-null. */
1301 unsigned char data[1];
1302
1303 /* When STRING is null. */
1304 EMACS_INT nbytes;
1305 } u;
1306
1307
1308 #define SDATA_NBYTES(S) (S)->u.nbytes
1309 #define SDATA_DATA(S) (S)->u.data
1310
1311 #endif /* not GC_CHECK_STRING_BYTES */
1312 };
1313
1314
1315 /* Structure describing a block of memory which is sub-allocated to
1316 obtain string data memory for strings. Blocks for small strings
1317 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
1318 as large as needed. */
1319
1320 struct sblock
1321 {
1322 /* Next in list. */
1323 struct sblock *next;
1324
1325 /* Pointer to the next free sdata block. This points past the end
1326 of the sblock if there isn't any space left in this block. */
1327 struct sdata *next_free;
1328
1329 /* Start of data. */
1330 struct sdata first_data;
1331 };
1332
1333 /* Number of Lisp strings in a string_block structure. The 1020 is
1334 1024 minus malloc overhead. */
1335
1336 #define STRING_BLOCK_SIZE \
1337 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
1338
1339 /* Structure describing a block from which Lisp_String structures
1340 are allocated. */
1341
1342 struct string_block
1343 {
1344 struct string_block *next;
1345 struct Lisp_String strings[STRING_BLOCK_SIZE];
1346 };
1347
1348 /* Head and tail of the list of sblock structures holding Lisp string
1349 data. We always allocate from current_sblock. The NEXT pointers
1350 in the sblock structures go from oldest_sblock to current_sblock. */
1351
1352 static struct sblock *oldest_sblock, *current_sblock;
1353
1354 /* List of sblocks for large strings. */
1355
1356 static struct sblock *large_sblocks;
1357
1358 /* List of string_block structures, and how many there are. */
1359
1360 static struct string_block *string_blocks;
1361 static int n_string_blocks;
1362
1363 /* Free-list of Lisp_Strings. */
1364
1365 static struct Lisp_String *string_free_list;
1366
1367 /* Number of live and free Lisp_Strings. */
1368
1369 static int total_strings, total_free_strings;
1370
1371 /* Number of bytes used by live strings. */
1372
1373 static int total_string_size;
1374
1375 /* Given a pointer to a Lisp_String S which is on the free-list
1376 string_free_list, return a pointer to its successor in the
1377 free-list. */
1378
1379 #define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
1380
1381 /* Return a pointer to the sdata structure belonging to Lisp string S.
1382 S must be live, i.e. S->data must not be null. S->data is actually
1383 a pointer to the `u.data' member of its sdata structure; the
1384 structure starts at a constant offset in front of that. */
1385
1386 #ifdef GC_CHECK_STRING_BYTES
1387
1388 #define SDATA_OF_STRING(S) \
1389 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *) \
1390 - sizeof (EMACS_INT)))
1391
1392 #else /* not GC_CHECK_STRING_BYTES */
1393
1394 #define SDATA_OF_STRING(S) \
1395 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *)))
1396
1397 #endif /* not GC_CHECK_STRING_BYTES */
1398
1399 /* Value is the size of an sdata structure large enough to hold NBYTES
1400 bytes of string data. The value returned includes a terminating
1401 NUL byte, the size of the sdata structure, and padding. */
1402
1403 #ifdef GC_CHECK_STRING_BYTES
1404
1405 #define SDATA_SIZE(NBYTES) \
1406 ((sizeof (struct Lisp_String *) \
1407 + (NBYTES) + 1 \
1408 + sizeof (EMACS_INT) \
1409 + sizeof (EMACS_INT) - 1) \
1410 & ~(sizeof (EMACS_INT) - 1))
1411
1412 #else /* not GC_CHECK_STRING_BYTES */
1413
1414 #define SDATA_SIZE(NBYTES) \
1415 ((sizeof (struct Lisp_String *) \
1416 + (NBYTES) + 1 \
1417 + sizeof (EMACS_INT) - 1) \
1418 & ~(sizeof (EMACS_INT) - 1))
1419
1420 #endif /* not GC_CHECK_STRING_BYTES */
1421
1422 /* Initialize string allocation. Called from init_alloc_once. */
1423
1424 void
1425 init_strings ()
1426 {
1427 total_strings = total_free_strings = total_string_size = 0;
1428 oldest_sblock = current_sblock = large_sblocks = NULL;
1429 string_blocks = NULL;
1430 n_string_blocks = 0;
1431 string_free_list = NULL;
1432 }
1433
1434
1435 #ifdef GC_CHECK_STRING_BYTES
1436
1437 static int check_string_bytes_count;
1438
1439 void check_string_bytes P_ ((int));
1440 void check_sblock P_ ((struct sblock *));
1441
1442 #define CHECK_STRING_BYTES(S) STRING_BYTES (S)
1443
1444
1445 /* Like GC_STRING_BYTES, but with debugging check. */
1446
1447 int
1448 string_bytes (s)
1449 struct Lisp_String *s;
1450 {
1451 int nbytes = (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte);
1452 if (!PURE_POINTER_P (s)
1453 && s->data
1454 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1455 abort ();
1456 return nbytes;
1457 }
1458
1459 /* Check validity of Lisp strings' string_bytes member in B. */
1460
1461 void
1462 check_sblock (b)
1463 struct sblock *b;
1464 {
1465 struct sdata *from, *end, *from_end;
1466
1467 end = b->next_free;
1468
1469 for (from = &b->first_data; from < end; from = from_end)
1470 {
1471 /* Compute the next FROM here because copying below may
1472 overwrite data we need to compute it. */
1473 int nbytes;
1474
1475 /* Check that the string size recorded in the string is the
1476 same as the one recorded in the sdata structure. */
1477 if (from->string)
1478 CHECK_STRING_BYTES (from->string);
1479
1480 if (from->string)
1481 nbytes = GC_STRING_BYTES (from->string);
1482 else
1483 nbytes = SDATA_NBYTES (from);
1484
1485 nbytes = SDATA_SIZE (nbytes);
1486 from_end = (struct sdata *) ((char *) from + nbytes);
1487 }
1488 }
1489
1490
1491 /* Check validity of Lisp strings' string_bytes member. ALL_P
1492 non-zero means check all strings, otherwise check only most
1493 recently allocated strings. Used for hunting a bug. */
1494
1495 void
1496 check_string_bytes (all_p)
1497 int all_p;
1498 {
1499 if (all_p)
1500 {
1501 struct sblock *b;
1502
1503 for (b = large_sblocks; b; b = b->next)
1504 {
1505 struct Lisp_String *s = b->first_data.string;
1506 if (s)
1507 CHECK_STRING_BYTES (s);
1508 }
1509
1510 for (b = oldest_sblock; b; b = b->next)
1511 check_sblock (b);
1512 }
1513 else
1514 check_sblock (current_sblock);
1515 }
1516
1517 #endif /* GC_CHECK_STRING_BYTES */
1518
1519
1520 /* Return a new Lisp_String. */
1521
1522 static struct Lisp_String *
1523 allocate_string ()
1524 {
1525 struct Lisp_String *s;
1526
1527 /* If the free-list is empty, allocate a new string_block, and
1528 add all the Lisp_Strings in it to the free-list. */
1529 if (string_free_list == NULL)
1530 {
1531 struct string_block *b;
1532 int i;
1533
1534 b = (struct string_block *) lisp_malloc (sizeof *b, MEM_TYPE_STRING);
1535 bzero (b, sizeof *b);
1536 b->next = string_blocks;
1537 string_blocks = b;
1538 ++n_string_blocks;
1539
1540 for (i = STRING_BLOCK_SIZE - 1; i >= 0; --i)
1541 {
1542 s = b->strings + i;
1543 NEXT_FREE_LISP_STRING (s) = string_free_list;
1544 string_free_list = s;
1545 }
1546
1547 total_free_strings += STRING_BLOCK_SIZE;
1548 }
1549
1550 /* Pop a Lisp_String off the free-list. */
1551 s = string_free_list;
1552 string_free_list = NEXT_FREE_LISP_STRING (s);
1553
1554 /* Probably not strictly necessary, but play it safe. */
1555 bzero (s, sizeof *s);
1556
1557 --total_free_strings;
1558 ++total_strings;
1559 ++strings_consed;
1560 consing_since_gc += sizeof *s;
1561
1562 #ifdef GC_CHECK_STRING_BYTES
1563 if (!noninteractive
1564 #ifdef MAC_OS8
1565 && current_sblock
1566 #endif
1567 )
1568 {
1569 if (++check_string_bytes_count == 200)
1570 {
1571 check_string_bytes_count = 0;
1572 check_string_bytes (1);
1573 }
1574 else
1575 check_string_bytes (0);
1576 }
1577 #endif /* GC_CHECK_STRING_BYTES */
1578
1579 return s;
1580 }
1581
1582
1583 /* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
1584 plus a NUL byte at the end. Allocate an sdata structure for S, and
1585 set S->data to its `u.data' member. Store a NUL byte at the end of
1586 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
1587 S->data if it was initially non-null. */
1588
1589 void
1590 allocate_string_data (s, nchars, nbytes)
1591 struct Lisp_String *s;
1592 int nchars, nbytes;
1593 {
1594 struct sdata *data, *old_data;
1595 struct sblock *b;
1596 int needed, old_nbytes;
1597
1598 /* Determine the number of bytes needed to store NBYTES bytes
1599 of string data. */
1600 needed = SDATA_SIZE (nbytes);
1601
1602 if (nbytes > LARGE_STRING_BYTES)
1603 {
1604 size_t size = sizeof *b - sizeof (struct sdata) + needed;
1605
1606 #ifdef DOUG_LEA_MALLOC
1607 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
1608 because mapped region contents are not preserved in
1609 a dumped Emacs.
1610
1611 In case you think of allowing it in a dumped Emacs at the
1612 cost of not being able to re-dump, there's another reason:
1613 mmap'ed data typically have an address towards the top of the
1614 address space, which won't fit into an EMACS_INT (at least on
1615 32-bit systems with the current tagging scheme). --fx */
1616 mallopt (M_MMAP_MAX, 0);
1617 #endif
1618
1619 b = (struct sblock *) lisp_malloc (size, MEM_TYPE_NON_LISP);
1620
1621 #ifdef DOUG_LEA_MALLOC
1622 /* Back to a reasonable maximum of mmap'ed areas. */
1623 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1624 #endif
1625
1626 b->next_free = &b->first_data;
1627 b->first_data.string = NULL;
1628 b->next = large_sblocks;
1629 large_sblocks = b;
1630 }
1631 else if (current_sblock == NULL
1632 || (((char *) current_sblock + SBLOCK_SIZE
1633 - (char *) current_sblock->next_free)
1634 < needed))
1635 {
1636 /* Not enough room in the current sblock. */
1637 b = (struct sblock *) lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP);
1638 b->next_free = &b->first_data;
1639 b->first_data.string = NULL;
1640 b->next = NULL;
1641
1642 if (current_sblock)
1643 current_sblock->next = b;
1644 else
1645 oldest_sblock = b;
1646 current_sblock = b;
1647 }
1648 else
1649 b = current_sblock;
1650
1651 old_data = s->data ? SDATA_OF_STRING (s) : NULL;
1652 old_nbytes = GC_STRING_BYTES (s);
1653
1654 data = b->next_free;
1655 data->string = s;
1656 s->data = SDATA_DATA (data);
1657 #ifdef GC_CHECK_STRING_BYTES
1658 SDATA_NBYTES (data) = nbytes;
1659 #endif
1660 s->size = nchars;
1661 s->size_byte = nbytes;
1662 s->data[nbytes] = '\0';
1663 b->next_free = (struct sdata *) ((char *) data + needed);
1664
1665 /* If S had already data assigned, mark that as free by setting its
1666 string back-pointer to null, and recording the size of the data
1667 in it. */
1668 if (old_data)
1669 {
1670 SDATA_NBYTES (old_data) = old_nbytes;
1671 old_data->string = NULL;
1672 }
1673
1674 consing_since_gc += needed;
1675 }
1676
1677
1678 /* Sweep and compact strings. */
1679
1680 static void
1681 sweep_strings ()
1682 {
1683 struct string_block *b, *next;
1684 struct string_block *live_blocks = NULL;
1685
1686 string_free_list = NULL;
1687 total_strings = total_free_strings = 0;
1688 total_string_size = 0;
1689
1690 /* Scan strings_blocks, free Lisp_Strings that aren't marked. */
1691 for (b = string_blocks; b; b = next)
1692 {
1693 int i, nfree = 0;
1694 struct Lisp_String *free_list_before = string_free_list;
1695
1696 next = b->next;
1697
1698 for (i = 0; i < STRING_BLOCK_SIZE; ++i)
1699 {
1700 struct Lisp_String *s = b->strings + i;
1701
1702 if (s->data)
1703 {
1704 /* String was not on free-list before. */
1705 if (STRING_MARKED_P (s))
1706 {
1707 /* String is live; unmark it and its intervals. */
1708 UNMARK_STRING (s);
1709
1710 if (!NULL_INTERVAL_P (s->intervals))
1711 UNMARK_BALANCE_INTERVALS (s->intervals);
1712
1713 ++total_strings;
1714 total_string_size += STRING_BYTES (s);
1715 }
1716 else
1717 {
1718 /* String is dead. Put it on the free-list. */
1719 struct sdata *data = SDATA_OF_STRING (s);
1720
1721 /* Save the size of S in its sdata so that we know
1722 how large that is. Reset the sdata's string
1723 back-pointer so that we know it's free. */
1724 #ifdef GC_CHECK_STRING_BYTES
1725 if (GC_STRING_BYTES (s) != SDATA_NBYTES (data))
1726 abort ();
1727 #else
1728 data->u.nbytes = GC_STRING_BYTES (s);
1729 #endif
1730 data->string = NULL;
1731
1732 /* Reset the strings's `data' member so that we
1733 know it's free. */
1734 s->data = NULL;
1735
1736 /* Put the string on the free-list. */
1737 NEXT_FREE_LISP_STRING (s) = string_free_list;
1738 string_free_list = s;
1739 ++nfree;
1740 }
1741 }
1742 else
1743 {
1744 /* S was on the free-list before. Put it there again. */
1745 NEXT_FREE_LISP_STRING (s) = string_free_list;
1746 string_free_list = s;
1747 ++nfree;
1748 }
1749 }
1750
1751 /* Free blocks that contain free Lisp_Strings only, except
1752 the first two of them. */
1753 if (nfree == STRING_BLOCK_SIZE
1754 && total_free_strings > STRING_BLOCK_SIZE)
1755 {
1756 lisp_free (b);
1757 --n_string_blocks;
1758 string_free_list = free_list_before;
1759 }
1760 else
1761 {
1762 total_free_strings += nfree;
1763 b->next = live_blocks;
1764 live_blocks = b;
1765 }
1766 }
1767
1768 string_blocks = live_blocks;
1769 free_large_strings ();
1770 compact_small_strings ();
1771 }
1772
1773
1774 /* Free dead large strings. */
1775
1776 static void
1777 free_large_strings ()
1778 {
1779 struct sblock *b, *next;
1780 struct sblock *live_blocks = NULL;
1781
1782 for (b = large_sblocks; b; b = next)
1783 {
1784 next = b->next;
1785
1786 if (b->first_data.string == NULL)
1787 lisp_free (b);
1788 else
1789 {
1790 b->next = live_blocks;
1791 live_blocks = b;
1792 }
1793 }
1794
1795 large_sblocks = live_blocks;
1796 }
1797
1798
1799 /* Compact data of small strings. Free sblocks that don't contain
1800 data of live strings after compaction. */
1801
1802 static void
1803 compact_small_strings ()
1804 {
1805 struct sblock *b, *tb, *next;
1806 struct sdata *from, *to, *end, *tb_end;
1807 struct sdata *to_end, *from_end;
1808
1809 /* TB is the sblock we copy to, TO is the sdata within TB we copy
1810 to, and TB_END is the end of TB. */
1811 tb = oldest_sblock;
1812 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
1813 to = &tb->first_data;
1814
1815 /* Step through the blocks from the oldest to the youngest. We
1816 expect that old blocks will stabilize over time, so that less
1817 copying will happen this way. */
1818 for (b = oldest_sblock; b; b = b->next)
1819 {
1820 end = b->next_free;
1821 xassert ((char *) end <= (char *) b + SBLOCK_SIZE);
1822
1823 for (from = &b->first_data; from < end; from = from_end)
1824 {
1825 /* Compute the next FROM here because copying below may
1826 overwrite data we need to compute it. */
1827 int nbytes;
1828
1829 #ifdef GC_CHECK_STRING_BYTES
1830 /* Check that the string size recorded in the string is the
1831 same as the one recorded in the sdata structure. */
1832 if (from->string
1833 && GC_STRING_BYTES (from->string) != SDATA_NBYTES (from))
1834 abort ();
1835 #endif /* GC_CHECK_STRING_BYTES */
1836
1837 if (from->string)
1838 nbytes = GC_STRING_BYTES (from->string);
1839 else
1840 nbytes = SDATA_NBYTES (from);
1841
1842 nbytes = SDATA_SIZE (nbytes);
1843 from_end = (struct sdata *) ((char *) from + nbytes);
1844
1845 /* FROM->string non-null means it's alive. Copy its data. */
1846 if (from->string)
1847 {
1848 /* If TB is full, proceed with the next sblock. */
1849 to_end = (struct sdata *) ((char *) to + nbytes);
1850 if (to_end > tb_end)
1851 {
1852 tb->next_free = to;
1853 tb = tb->next;
1854 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
1855 to = &tb->first_data;
1856 to_end = (struct sdata *) ((char *) to + nbytes);
1857 }
1858
1859 /* Copy, and update the string's `data' pointer. */
1860 if (from != to)
1861 {
1862 xassert (tb != b || to <= from);
1863 safe_bcopy ((char *) from, (char *) to, nbytes);
1864 to->string->data = SDATA_DATA (to);
1865 }
1866
1867 /* Advance past the sdata we copied to. */
1868 to = to_end;
1869 }
1870 }
1871 }
1872
1873 /* The rest of the sblocks following TB don't contain live data, so
1874 we can free them. */
1875 for (b = tb->next; b; b = next)
1876 {
1877 next = b->next;
1878 lisp_free (b);
1879 }
1880
1881 tb->next_free = to;
1882 tb->next = NULL;
1883 current_sblock = tb;
1884 }
1885
1886
1887 DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
1888 doc: /* Return a newly created string of length LENGTH, with each element being INIT.
1889 Both LENGTH and INIT must be numbers. */)
1890 (length, init)
1891 Lisp_Object length, init;
1892 {
1893 register Lisp_Object val;
1894 register unsigned char *p, *end;
1895 int c, nbytes;
1896
1897 CHECK_NATNUM (length);
1898 CHECK_NUMBER (init);
1899
1900 c = XINT (init);
1901 if (ASCII_CHAR_P (c))
1902 {
1903 nbytes = XINT (length);
1904 val = make_uninit_string (nbytes);
1905 p = SDATA (val);
1906 end = p + SCHARS (val);
1907 while (p != end)
1908 *p++ = c;
1909 }
1910 else
1911 {
1912 unsigned char str[MAX_MULTIBYTE_LENGTH];
1913 int len = CHAR_STRING (c, str);
1914
1915 nbytes = len * XINT (length);
1916 val = make_uninit_multibyte_string (XINT (length), nbytes);
1917 p = SDATA (val);
1918 end = p + nbytes;
1919 while (p != end)
1920 {
1921 bcopy (str, p, len);
1922 p += len;
1923 }
1924 }
1925
1926 *p = 0;
1927 return val;
1928 }
1929
1930
1931 DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
1932 doc: /* Return a new bool-vector of length LENGTH, using INIT for as each element.
1933 LENGTH must be a number. INIT matters only in whether it is t or nil. */)
1934 (length, init)
1935 Lisp_Object length, init;
1936 {
1937 register Lisp_Object val;
1938 struct Lisp_Bool_Vector *p;
1939 int real_init, i;
1940 int length_in_chars, length_in_elts, bits_per_value;
1941
1942 CHECK_NATNUM (length);
1943
1944 bits_per_value = sizeof (EMACS_INT) * BITS_PER_CHAR;
1945
1946 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
1947 length_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1) / BITS_PER_CHAR);
1948
1949 /* We must allocate one more elements than LENGTH_IN_ELTS for the
1950 slot `size' of the struct Lisp_Bool_Vector. */
1951 val = Fmake_vector (make_number (length_in_elts + 1), Qnil);
1952 p = XBOOL_VECTOR (val);
1953
1954 /* Get rid of any bits that would cause confusion. */
1955 p->vector_size = 0;
1956 XSETBOOL_VECTOR (val, p);
1957 p->size = XFASTINT (length);
1958
1959 real_init = (NILP (init) ? 0 : -1);
1960 for (i = 0; i < length_in_chars ; i++)
1961 p->data[i] = real_init;
1962
1963 /* Clear the extraneous bits in the last byte. */
1964 if (XINT (length) != length_in_chars * BITS_PER_CHAR)
1965 XBOOL_VECTOR (val)->data[length_in_chars - 1]
1966 &= (1 << (XINT (length) % BITS_PER_CHAR)) - 1;
1967
1968 return val;
1969 }
1970
1971
1972 /* Make a string from NBYTES bytes at CONTENTS, and compute the number
1973 of characters from the contents. This string may be unibyte or
1974 multibyte, depending on the contents. */
1975
1976 Lisp_Object
1977 make_string (contents, nbytes)
1978 const char *contents;
1979 int nbytes;
1980 {
1981 register Lisp_Object val;
1982 int nchars, multibyte_nbytes;
1983
1984 parse_str_as_multibyte (contents, nbytes, &nchars, &multibyte_nbytes);
1985 if (nbytes == nchars || nbytes != multibyte_nbytes)
1986 /* CONTENTS contains no multibyte sequences or contains an invalid
1987 multibyte sequence. We must make unibyte string. */
1988 val = make_unibyte_string (contents, nbytes);
1989 else
1990 val = make_multibyte_string (contents, nchars, nbytes);
1991 return val;
1992 }
1993
1994
1995 /* Make an unibyte string from LENGTH bytes at CONTENTS. */
1996
1997 Lisp_Object
1998 make_unibyte_string (contents, length)
1999 const char *contents;
2000 int length;
2001 {
2002 register Lisp_Object val;
2003 val = make_uninit_string (length);
2004 bcopy (contents, SDATA (val), length);
2005 STRING_SET_UNIBYTE (val);
2006 return val;
2007 }
2008
2009
2010 /* Make a multibyte string from NCHARS characters occupying NBYTES
2011 bytes at CONTENTS. */
2012
2013 Lisp_Object
2014 make_multibyte_string (contents, nchars, nbytes)
2015 const char *contents;
2016 int nchars, nbytes;
2017 {
2018 register Lisp_Object val;
2019 val = make_uninit_multibyte_string (nchars, nbytes);
2020 bcopy (contents, SDATA (val), nbytes);
2021 return val;
2022 }
2023
2024
2025 /* Make a string from NCHARS characters occupying NBYTES bytes at
2026 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
2027
2028 Lisp_Object
2029 make_string_from_bytes (contents, nchars, nbytes)
2030 const char *contents;
2031 int nchars, nbytes;
2032 {
2033 register Lisp_Object val;
2034 val = make_uninit_multibyte_string (nchars, nbytes);
2035 bcopy (contents, SDATA (val), nbytes);
2036 if (SBYTES (val) == SCHARS (val))
2037 STRING_SET_UNIBYTE (val);
2038 return val;
2039 }
2040
2041
2042 /* Make a string from NCHARS characters occupying NBYTES bytes at
2043 CONTENTS. The argument MULTIBYTE controls whether to label the
2044 string as multibyte. If NCHARS is negative, it counts the number of
2045 characters by itself. */
2046
2047 Lisp_Object
2048 make_specified_string (contents, nchars, nbytes, multibyte)
2049 const char *contents;
2050 int nchars, nbytes;
2051 int multibyte;
2052 {
2053 register Lisp_Object val;
2054
2055 if (nchars < 0)
2056 {
2057 if (multibyte)
2058 nchars = multibyte_chars_in_text (contents, nbytes);
2059 else
2060 nchars = nbytes;
2061 }
2062 val = make_uninit_multibyte_string (nchars, nbytes);
2063 bcopy (contents, SDATA (val), nbytes);
2064 if (!multibyte)
2065 STRING_SET_UNIBYTE (val);
2066 return val;
2067 }
2068
2069
2070 /* Make a string from the data at STR, treating it as multibyte if the
2071 data warrants. */
2072
2073 Lisp_Object
2074 build_string (str)
2075 const char *str;
2076 {
2077 return make_string (str, strlen (str));
2078 }
2079
2080
2081 /* Return an unibyte Lisp_String set up to hold LENGTH characters
2082 occupying LENGTH bytes. */
2083
2084 Lisp_Object
2085 make_uninit_string (length)
2086 int length;
2087 {
2088 Lisp_Object val;
2089 val = make_uninit_multibyte_string (length, length);
2090 STRING_SET_UNIBYTE (val);
2091 return val;
2092 }
2093
2094
2095 /* Return a multibyte Lisp_String set up to hold NCHARS characters
2096 which occupy NBYTES bytes. */
2097
2098 Lisp_Object
2099 make_uninit_multibyte_string (nchars, nbytes)
2100 int nchars, nbytes;
2101 {
2102 Lisp_Object string;
2103 struct Lisp_String *s;
2104
2105 if (nchars < 0)
2106 abort ();
2107
2108 s = allocate_string ();
2109 allocate_string_data (s, nchars, nbytes);
2110 XSETSTRING (string, s);
2111 string_chars_consed += nbytes;
2112 return string;
2113 }
2114
2115
2116 \f
2117 /***********************************************************************
2118 Float Allocation
2119 ***********************************************************************/
2120
2121 /* We store float cells inside of float_blocks, allocating a new
2122 float_block with malloc whenever necessary. Float cells reclaimed
2123 by GC are put on a free list to be reallocated before allocating
2124 any new float cells from the latest float_block. */
2125
2126 #define FLOAT_BLOCK_SIZE \
2127 (((BLOCK_BYTES - sizeof (struct float_block *)) * CHAR_BIT) \
2128 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2129
2130 #define GETMARKBIT(block,n) \
2131 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2132 >> ((n) % (sizeof(int) * CHAR_BIT))) \
2133 & 1)
2134
2135 #define SETMARKBIT(block,n) \
2136 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2137 |= 1 << ((n) % (sizeof(int) * CHAR_BIT))
2138
2139 #define UNSETMARKBIT(block,n) \
2140 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2141 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT)))
2142
2143 #define FLOAT_BLOCK(fptr) \
2144 ((struct float_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1)))
2145
2146 #define FLOAT_INDEX(fptr) \
2147 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float))
2148
2149 struct float_block
2150 {
2151 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */
2152 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
2153 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
2154 struct float_block *next;
2155 };
2156
2157 #define FLOAT_MARKED_P(fptr) \
2158 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2159
2160 #define FLOAT_MARK(fptr) \
2161 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2162
2163 #define FLOAT_UNMARK(fptr) \
2164 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2165
2166 /* Current float_block. */
2167
2168 struct float_block *float_block;
2169
2170 /* Index of first unused Lisp_Float in the current float_block. */
2171
2172 int float_block_index;
2173
2174 /* Total number of float blocks now in use. */
2175
2176 int n_float_blocks;
2177
2178 /* Free-list of Lisp_Floats. */
2179
2180 struct Lisp_Float *float_free_list;
2181
2182
2183 /* Initialize float allocation. */
2184
2185 void
2186 init_float ()
2187 {
2188 float_block = NULL;
2189 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */
2190 float_free_list = 0;
2191 n_float_blocks = 0;
2192 }
2193
2194
2195 /* Explicitly free a float cell by putting it on the free-list. */
2196
2197 void
2198 free_float (ptr)
2199 struct Lisp_Float *ptr;
2200 {
2201 *(struct Lisp_Float **)&ptr->data = float_free_list;
2202 float_free_list = ptr;
2203 }
2204
2205
2206 /* Return a new float object with value FLOAT_VALUE. */
2207
2208 Lisp_Object
2209 make_float (float_value)
2210 double float_value;
2211 {
2212 register Lisp_Object val;
2213
2214 if (float_free_list)
2215 {
2216 /* We use the data field for chaining the free list
2217 so that we won't use the same field that has the mark bit. */
2218 XSETFLOAT (val, float_free_list);
2219 float_free_list = *(struct Lisp_Float **)&float_free_list->data;
2220 }
2221 else
2222 {
2223 if (float_block_index == FLOAT_BLOCK_SIZE)
2224 {
2225 register struct float_block *new;
2226
2227 new = (struct float_block *) lisp_align_malloc (sizeof *new,
2228 MEM_TYPE_FLOAT);
2229 new->next = float_block;
2230 float_block = new;
2231 float_block_index = 0;
2232 n_float_blocks++;
2233 }
2234 XSETFLOAT (val, &float_block->floats[float_block_index++]);
2235 }
2236
2237 XFLOAT_DATA (val) = float_value;
2238 FLOAT_UNMARK (XFLOAT (val));
2239 consing_since_gc += sizeof (struct Lisp_Float);
2240 floats_consed++;
2241 return val;
2242 }
2243
2244
2245 \f
2246 /***********************************************************************
2247 Cons Allocation
2248 ***********************************************************************/
2249
2250 /* We store cons cells inside of cons_blocks, allocating a new
2251 cons_block with malloc whenever necessary. Cons cells reclaimed by
2252 GC are put on a free list to be reallocated before allocating
2253 any new cons cells from the latest cons_block. */
2254
2255 #define CONS_BLOCK_SIZE \
2256 (((BLOCK_BYTES - sizeof (struct cons_block *)) * CHAR_BIT) \
2257 / (sizeof (struct Lisp_Cons) * CHAR_BIT + 1))
2258
2259 #define CONS_BLOCK(fptr) \
2260 ((struct cons_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1)))
2261
2262 #define CONS_INDEX(fptr) \
2263 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons))
2264
2265 struct cons_block
2266 {
2267 /* Place `conses' at the beginning, to ease up CONS_INDEX's job. */
2268 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
2269 int gcmarkbits[1 + CONS_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
2270 struct cons_block *next;
2271 };
2272
2273 #define CONS_MARKED_P(fptr) \
2274 GETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2275
2276 #define CONS_MARK(fptr) \
2277 SETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2278
2279 #define CONS_UNMARK(fptr) \
2280 UNSETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2281
2282 /* Current cons_block. */
2283
2284 struct cons_block *cons_block;
2285
2286 /* Index of first unused Lisp_Cons in the current block. */
2287
2288 int cons_block_index;
2289
2290 /* Free-list of Lisp_Cons structures. */
2291
2292 struct Lisp_Cons *cons_free_list;
2293
2294 /* Total number of cons blocks now in use. */
2295
2296 int n_cons_blocks;
2297
2298
2299 /* Initialize cons allocation. */
2300
2301 void
2302 init_cons ()
2303 {
2304 cons_block = NULL;
2305 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */
2306 cons_free_list = 0;
2307 n_cons_blocks = 0;
2308 }
2309
2310
2311 /* Explicitly free a cons cell by putting it on the free-list. */
2312
2313 void
2314 free_cons (ptr)
2315 struct Lisp_Cons *ptr;
2316 {
2317 *(struct Lisp_Cons **)&ptr->cdr = cons_free_list;
2318 #if GC_MARK_STACK
2319 ptr->car = Vdead;
2320 #endif
2321 cons_free_list = ptr;
2322 }
2323
2324
2325 DEFUN ("cons", Fcons, Scons, 2, 2, 0,
2326 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
2327 (car, cdr)
2328 Lisp_Object car, cdr;
2329 {
2330 register Lisp_Object val;
2331
2332 if (cons_free_list)
2333 {
2334 /* We use the cdr for chaining the free list
2335 so that we won't use the same field that has the mark bit. */
2336 XSETCONS (val, cons_free_list);
2337 cons_free_list = *(struct Lisp_Cons **)&cons_free_list->cdr;
2338 }
2339 else
2340 {
2341 if (cons_block_index == CONS_BLOCK_SIZE)
2342 {
2343 register struct cons_block *new;
2344 new = (struct cons_block *) lisp_align_malloc (sizeof *new,
2345 MEM_TYPE_CONS);
2346 new->next = cons_block;
2347 cons_block = new;
2348 cons_block_index = 0;
2349 n_cons_blocks++;
2350 }
2351 XSETCONS (val, &cons_block->conses[cons_block_index++]);
2352 }
2353
2354 XSETCAR (val, car);
2355 XSETCDR (val, cdr);
2356 CONS_UNMARK (XCONS (val));
2357 consing_since_gc += sizeof (struct Lisp_Cons);
2358 cons_cells_consed++;
2359 return val;
2360 }
2361
2362
2363 /* Make a list of 2, 3, 4 or 5 specified objects. */
2364
2365 Lisp_Object
2366 list2 (arg1, arg2)
2367 Lisp_Object arg1, arg2;
2368 {
2369 return Fcons (arg1, Fcons (arg2, Qnil));
2370 }
2371
2372
2373 Lisp_Object
2374 list3 (arg1, arg2, arg3)
2375 Lisp_Object arg1, arg2, arg3;
2376 {
2377 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
2378 }
2379
2380
2381 Lisp_Object
2382 list4 (arg1, arg2, arg3, arg4)
2383 Lisp_Object arg1, arg2, arg3, arg4;
2384 {
2385 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
2386 }
2387
2388
2389 Lisp_Object
2390 list5 (arg1, arg2, arg3, arg4, arg5)
2391 Lisp_Object arg1, arg2, arg3, arg4, arg5;
2392 {
2393 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
2394 Fcons (arg5, Qnil)))));
2395 }
2396
2397
2398 DEFUN ("list", Flist, Slist, 0, MANY, 0,
2399 doc: /* Return a newly created list with specified arguments as elements.
2400 Any number of arguments, even zero arguments, are allowed.
2401 usage: (list &rest OBJECTS) */)
2402 (nargs, args)
2403 int nargs;
2404 register Lisp_Object *args;
2405 {
2406 register Lisp_Object val;
2407 val = Qnil;
2408
2409 while (nargs > 0)
2410 {
2411 nargs--;
2412 val = Fcons (args[nargs], val);
2413 }
2414 return val;
2415 }
2416
2417
2418 DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
2419 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
2420 (length, init)
2421 register Lisp_Object length, init;
2422 {
2423 register Lisp_Object val;
2424 register int size;
2425
2426 CHECK_NATNUM (length);
2427 size = XFASTINT (length);
2428
2429 val = Qnil;
2430 while (size > 0)
2431 {
2432 val = Fcons (init, val);
2433 --size;
2434
2435 if (size > 0)
2436 {
2437 val = Fcons (init, val);
2438 --size;
2439
2440 if (size > 0)
2441 {
2442 val = Fcons (init, val);
2443 --size;
2444
2445 if (size > 0)
2446 {
2447 val = Fcons (init, val);
2448 --size;
2449
2450 if (size > 0)
2451 {
2452 val = Fcons (init, val);
2453 --size;
2454 }
2455 }
2456 }
2457 }
2458
2459 QUIT;
2460 }
2461
2462 return val;
2463 }
2464
2465
2466 \f
2467 /***********************************************************************
2468 Vector Allocation
2469 ***********************************************************************/
2470
2471 /* Singly-linked list of all vectors. */
2472
2473 struct Lisp_Vector *all_vectors;
2474
2475 /* Total number of vector-like objects now in use. */
2476
2477 int n_vectors;
2478
2479
2480 /* Value is a pointer to a newly allocated Lisp_Vector structure
2481 with room for LEN Lisp_Objects. */
2482
2483 static struct Lisp_Vector *
2484 allocate_vectorlike (len, type)
2485 EMACS_INT len;
2486 enum mem_type type;
2487 {
2488 struct Lisp_Vector *p;
2489 size_t nbytes;
2490
2491 #ifdef DOUG_LEA_MALLOC
2492 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
2493 because mapped region contents are not preserved in
2494 a dumped Emacs. */
2495 mallopt (M_MMAP_MAX, 0);
2496 #endif
2497
2498 nbytes = sizeof *p + (len - 1) * sizeof p->contents[0];
2499 p = (struct Lisp_Vector *) lisp_malloc (nbytes, type);
2500
2501 #ifdef DOUG_LEA_MALLOC
2502 /* Back to a reasonable maximum of mmap'ed areas. */
2503 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
2504 #endif
2505
2506 consing_since_gc += nbytes;
2507 vector_cells_consed += len;
2508
2509 p->next = all_vectors;
2510 all_vectors = p;
2511 ++n_vectors;
2512 return p;
2513 }
2514
2515
2516 /* Allocate a vector with NSLOTS slots. */
2517
2518 struct Lisp_Vector *
2519 allocate_vector (nslots)
2520 EMACS_INT nslots;
2521 {
2522 struct Lisp_Vector *v = allocate_vectorlike (nslots, MEM_TYPE_VECTOR);
2523 v->size = nslots;
2524 return v;
2525 }
2526
2527
2528 /* Allocate other vector-like structures. */
2529
2530 struct Lisp_Hash_Table *
2531 allocate_hash_table ()
2532 {
2533 EMACS_INT len = VECSIZE (struct Lisp_Hash_Table);
2534 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_HASH_TABLE);
2535 EMACS_INT i;
2536
2537 v->size = len;
2538 for (i = 0; i < len; ++i)
2539 v->contents[i] = Qnil;
2540
2541 return (struct Lisp_Hash_Table *) v;
2542 }
2543
2544
2545 struct window *
2546 allocate_window ()
2547 {
2548 EMACS_INT len = VECSIZE (struct window);
2549 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_WINDOW);
2550 EMACS_INT i;
2551
2552 for (i = 0; i < len; ++i)
2553 v->contents[i] = Qnil;
2554 v->size = len;
2555
2556 return (struct window *) v;
2557 }
2558
2559
2560 struct frame *
2561 allocate_frame ()
2562 {
2563 EMACS_INT len = VECSIZE (struct frame);
2564 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_FRAME);
2565 EMACS_INT i;
2566
2567 for (i = 0; i < len; ++i)
2568 v->contents[i] = make_number (0);
2569 v->size = len;
2570 return (struct frame *) v;
2571 }
2572
2573
2574 struct Lisp_Process *
2575 allocate_process ()
2576 {
2577 EMACS_INT len = VECSIZE (struct Lisp_Process);
2578 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_PROCESS);
2579 EMACS_INT i;
2580
2581 for (i = 0; i < len; ++i)
2582 v->contents[i] = Qnil;
2583 v->size = len;
2584
2585 return (struct Lisp_Process *) v;
2586 }
2587
2588
2589 struct Lisp_Vector *
2590 allocate_other_vector (len)
2591 EMACS_INT len;
2592 {
2593 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_VECTOR);
2594 EMACS_INT i;
2595
2596 for (i = 0; i < len; ++i)
2597 v->contents[i] = Qnil;
2598 v->size = len;
2599
2600 return v;
2601 }
2602
2603
2604 DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
2605 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
2606 See also the function `vector'. */)
2607 (length, init)
2608 register Lisp_Object length, init;
2609 {
2610 Lisp_Object vector;
2611 register EMACS_INT sizei;
2612 register int index;
2613 register struct Lisp_Vector *p;
2614
2615 CHECK_NATNUM (length);
2616 sizei = XFASTINT (length);
2617
2618 p = allocate_vector (sizei);
2619 for (index = 0; index < sizei; index++)
2620 p->contents[index] = init;
2621
2622 XSETVECTOR (vector, p);
2623 return vector;
2624 }
2625
2626
2627 DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
2628 doc: /* Return a newly created vector with specified arguments as elements.
2629 Any number of arguments, even zero arguments, are allowed.
2630 usage: (vector &rest OBJECTS) */)
2631 (nargs, args)
2632 register int nargs;
2633 Lisp_Object *args;
2634 {
2635 register Lisp_Object len, val;
2636 register int index;
2637 register struct Lisp_Vector *p;
2638
2639 XSETFASTINT (len, nargs);
2640 val = Fmake_vector (len, Qnil);
2641 p = XVECTOR (val);
2642 for (index = 0; index < nargs; index++)
2643 p->contents[index] = args[index];
2644 return val;
2645 }
2646
2647
2648 DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
2649 doc: /* Create a byte-code object with specified arguments as elements.
2650 The arguments should be the arglist, bytecode-string, constant vector,
2651 stack size, (optional) doc string, and (optional) interactive spec.
2652 The first four arguments are required; at most six have any
2653 significance.
2654 usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
2655 (nargs, args)
2656 register int nargs;
2657 Lisp_Object *args;
2658 {
2659 register Lisp_Object len, val;
2660 register int index;
2661 register struct Lisp_Vector *p;
2662
2663 XSETFASTINT (len, nargs);
2664 if (!NILP (Vpurify_flag))
2665 val = make_pure_vector ((EMACS_INT) nargs);
2666 else
2667 val = Fmake_vector (len, Qnil);
2668
2669 if (STRINGP (args[1]) && STRING_MULTIBYTE (args[1]))
2670 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
2671 earlier because they produced a raw 8-bit string for byte-code
2672 and now such a byte-code string is loaded as multibyte while
2673 raw 8-bit characters converted to multibyte form. Thus, now we
2674 must convert them back to the original unibyte form. */
2675 args[1] = Fstring_as_unibyte (args[1]);
2676
2677 p = XVECTOR (val);
2678 for (index = 0; index < nargs; index++)
2679 {
2680 if (!NILP (Vpurify_flag))
2681 args[index] = Fpurecopy (args[index]);
2682 p->contents[index] = args[index];
2683 }
2684 XSETCOMPILED (val, p);
2685 return val;
2686 }
2687
2688
2689 \f
2690 /***********************************************************************
2691 Symbol Allocation
2692 ***********************************************************************/
2693
2694 /* Each symbol_block is just under 1020 bytes long, since malloc
2695 really allocates in units of powers of two and uses 4 bytes for its
2696 own overhead. */
2697
2698 #define SYMBOL_BLOCK_SIZE \
2699 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
2700
2701 struct symbol_block
2702 {
2703 struct symbol_block *next;
2704 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
2705 };
2706
2707 /* Current symbol block and index of first unused Lisp_Symbol
2708 structure in it. */
2709
2710 struct symbol_block *symbol_block;
2711 int symbol_block_index;
2712
2713 /* List of free symbols. */
2714
2715 struct Lisp_Symbol *symbol_free_list;
2716
2717 /* Total number of symbol blocks now in use. */
2718
2719 int n_symbol_blocks;
2720
2721
2722 /* Initialize symbol allocation. */
2723
2724 void
2725 init_symbol ()
2726 {
2727 symbol_block = (struct symbol_block *) lisp_malloc (sizeof *symbol_block,
2728 MEM_TYPE_SYMBOL);
2729 symbol_block->next = 0;
2730 bzero ((char *) symbol_block->symbols, sizeof symbol_block->symbols);
2731 symbol_block_index = 0;
2732 symbol_free_list = 0;
2733 n_symbol_blocks = 1;
2734 }
2735
2736
2737 DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
2738 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
2739 Its value and function definition are void, and its property list is nil. */)
2740 (name)
2741 Lisp_Object name;
2742 {
2743 register Lisp_Object val;
2744 register struct Lisp_Symbol *p;
2745
2746 CHECK_STRING (name);
2747
2748 if (symbol_free_list)
2749 {
2750 XSETSYMBOL (val, symbol_free_list);
2751 symbol_free_list = *(struct Lisp_Symbol **)&symbol_free_list->value;
2752 }
2753 else
2754 {
2755 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
2756 {
2757 struct symbol_block *new;
2758 new = (struct symbol_block *) lisp_malloc (sizeof *new,
2759 MEM_TYPE_SYMBOL);
2760 new->next = symbol_block;
2761 symbol_block = new;
2762 symbol_block_index = 0;
2763 n_symbol_blocks++;
2764 }
2765 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index++]);
2766 }
2767
2768 p = XSYMBOL (val);
2769 p->xname = name;
2770 p->plist = Qnil;
2771 p->value = Qunbound;
2772 p->function = Qunbound;
2773 p->next = NULL;
2774 p->gcmarkbit = 0;
2775 p->interned = SYMBOL_UNINTERNED;
2776 p->constant = 0;
2777 p->indirect_variable = 0;
2778 consing_since_gc += sizeof (struct Lisp_Symbol);
2779 symbols_consed++;
2780 return val;
2781 }
2782
2783
2784 \f
2785 /***********************************************************************
2786 Marker (Misc) Allocation
2787 ***********************************************************************/
2788
2789 /* Allocation of markers and other objects that share that structure.
2790 Works like allocation of conses. */
2791
2792 #define MARKER_BLOCK_SIZE \
2793 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
2794
2795 struct marker_block
2796 {
2797 struct marker_block *next;
2798 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
2799 };
2800
2801 struct marker_block *marker_block;
2802 int marker_block_index;
2803
2804 union Lisp_Misc *marker_free_list;
2805
2806 /* Total number of marker blocks now in use. */
2807
2808 int n_marker_blocks;
2809
2810 void
2811 init_marker ()
2812 {
2813 marker_block = (struct marker_block *) lisp_malloc (sizeof *marker_block,
2814 MEM_TYPE_MISC);
2815 marker_block->next = 0;
2816 bzero ((char *) marker_block->markers, sizeof marker_block->markers);
2817 marker_block_index = 0;
2818 marker_free_list = 0;
2819 n_marker_blocks = 1;
2820 }
2821
2822 /* Return a newly allocated Lisp_Misc object, with no substructure. */
2823
2824 Lisp_Object
2825 allocate_misc ()
2826 {
2827 Lisp_Object val;
2828
2829 if (marker_free_list)
2830 {
2831 XSETMISC (val, marker_free_list);
2832 marker_free_list = marker_free_list->u_free.chain;
2833 }
2834 else
2835 {
2836 if (marker_block_index == MARKER_BLOCK_SIZE)
2837 {
2838 struct marker_block *new;
2839 new = (struct marker_block *) lisp_malloc (sizeof *new,
2840 MEM_TYPE_MISC);
2841 new->next = marker_block;
2842 marker_block = new;
2843 marker_block_index = 0;
2844 n_marker_blocks++;
2845 }
2846 XSETMISC (val, &marker_block->markers[marker_block_index++]);
2847 }
2848
2849 consing_since_gc += sizeof (union Lisp_Misc);
2850 misc_objects_consed++;
2851 XMARKER (val)->gcmarkbit = 0;
2852 return val;
2853 }
2854
2855 /* Return a Lisp_Misc_Save_Value object containing POINTER and
2856 INTEGER. This is used to package C values to call record_unwind_protect.
2857 The unwind function can get the C values back using XSAVE_VALUE. */
2858
2859 Lisp_Object
2860 make_save_value (pointer, integer)
2861 void *pointer;
2862 int integer;
2863 {
2864 register Lisp_Object val;
2865 register struct Lisp_Save_Value *p;
2866
2867 val = allocate_misc ();
2868 XMISCTYPE (val) = Lisp_Misc_Save_Value;
2869 p = XSAVE_VALUE (val);
2870 p->pointer = pointer;
2871 p->integer = integer;
2872 return val;
2873 }
2874
2875 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
2876 doc: /* Return a newly allocated marker which does not point at any place. */)
2877 ()
2878 {
2879 register Lisp_Object val;
2880 register struct Lisp_Marker *p;
2881
2882 val = allocate_misc ();
2883 XMISCTYPE (val) = Lisp_Misc_Marker;
2884 p = XMARKER (val);
2885 p->buffer = 0;
2886 p->bytepos = 0;
2887 p->charpos = 0;
2888 p->next = NULL;
2889 p->insertion_type = 0;
2890 return val;
2891 }
2892
2893 /* Put MARKER back on the free list after using it temporarily. */
2894
2895 void
2896 free_marker (marker)
2897 Lisp_Object marker;
2898 {
2899 unchain_marker (XMARKER (marker));
2900
2901 XMISC (marker)->u_marker.type = Lisp_Misc_Free;
2902 XMISC (marker)->u_free.chain = marker_free_list;
2903 marker_free_list = XMISC (marker);
2904
2905 total_free_markers++;
2906 }
2907
2908 \f
2909 /* Return a newly created vector or string with specified arguments as
2910 elements. If all the arguments are characters that can fit
2911 in a string of events, make a string; otherwise, make a vector.
2912
2913 Any number of arguments, even zero arguments, are allowed. */
2914
2915 Lisp_Object
2916 make_event_array (nargs, args)
2917 register int nargs;
2918 Lisp_Object *args;
2919 {
2920 int i;
2921
2922 for (i = 0; i < nargs; i++)
2923 /* The things that fit in a string
2924 are characters that are in 0...127,
2925 after discarding the meta bit and all the bits above it. */
2926 if (!INTEGERP (args[i])
2927 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200)
2928 return Fvector (nargs, args);
2929
2930 /* Since the loop exited, we know that all the things in it are
2931 characters, so we can make a string. */
2932 {
2933 Lisp_Object result;
2934
2935 result = Fmake_string (make_number (nargs), make_number (0));
2936 for (i = 0; i < nargs; i++)
2937 {
2938 SSET (result, i, XINT (args[i]));
2939 /* Move the meta bit to the right place for a string char. */
2940 if (XINT (args[i]) & CHAR_META)
2941 SSET (result, i, SREF (result, i) | 0x80);
2942 }
2943
2944 return result;
2945 }
2946 }
2947
2948
2949 \f
2950 /************************************************************************
2951 C Stack Marking
2952 ************************************************************************/
2953
2954 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
2955
2956 /* Conservative C stack marking requires a method to identify possibly
2957 live Lisp objects given a pointer value. We do this by keeping
2958 track of blocks of Lisp data that are allocated in a red-black tree
2959 (see also the comment of mem_node which is the type of nodes in
2960 that tree). Function lisp_malloc adds information for an allocated
2961 block to the red-black tree with calls to mem_insert, and function
2962 lisp_free removes it with mem_delete. Functions live_string_p etc
2963 call mem_find to lookup information about a given pointer in the
2964 tree, and use that to determine if the pointer points to a Lisp
2965 object or not. */
2966
2967 /* Initialize this part of alloc.c. */
2968
2969 static void
2970 mem_init ()
2971 {
2972 mem_z.left = mem_z.right = MEM_NIL;
2973 mem_z.parent = NULL;
2974 mem_z.color = MEM_BLACK;
2975 mem_z.start = mem_z.end = NULL;
2976 mem_root = MEM_NIL;
2977 }
2978
2979
2980 /* Value is a pointer to the mem_node containing START. Value is
2981 MEM_NIL if there is no node in the tree containing START. */
2982
2983 static INLINE struct mem_node *
2984 mem_find (start)
2985 void *start;
2986 {
2987 struct mem_node *p;
2988
2989 if (start < min_heap_address || start > max_heap_address)
2990 return MEM_NIL;
2991
2992 /* Make the search always successful to speed up the loop below. */
2993 mem_z.start = start;
2994 mem_z.end = (char *) start + 1;
2995
2996 p = mem_root;
2997 while (start < p->start || start >= p->end)
2998 p = start < p->start ? p->left : p->right;
2999 return p;
3000 }
3001
3002
3003 /* Insert a new node into the tree for a block of memory with start
3004 address START, end address END, and type TYPE. Value is a
3005 pointer to the node that was inserted. */
3006
3007 static struct mem_node *
3008 mem_insert (start, end, type)
3009 void *start, *end;
3010 enum mem_type type;
3011 {
3012 struct mem_node *c, *parent, *x;
3013
3014 if (start < min_heap_address)
3015 min_heap_address = start;
3016 if (end > max_heap_address)
3017 max_heap_address = end;
3018
3019 /* See where in the tree a node for START belongs. In this
3020 particular application, it shouldn't happen that a node is already
3021 present. For debugging purposes, let's check that. */
3022 c = mem_root;
3023 parent = NULL;
3024
3025 #if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
3026
3027 while (c != MEM_NIL)
3028 {
3029 if (start >= c->start && start < c->end)
3030 abort ();
3031 parent = c;
3032 c = start < c->start ? c->left : c->right;
3033 }
3034
3035 #else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
3036
3037 while (c != MEM_NIL)
3038 {
3039 parent = c;
3040 c = start < c->start ? c->left : c->right;
3041 }
3042
3043 #endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
3044
3045 /* Create a new node. */
3046 #ifdef GC_MALLOC_CHECK
3047 x = (struct mem_node *) _malloc_internal (sizeof *x);
3048 if (x == NULL)
3049 abort ();
3050 #else
3051 x = (struct mem_node *) xmalloc (sizeof *x);
3052 #endif
3053 x->start = start;
3054 x->end = end;
3055 x->type = type;
3056 x->parent = parent;
3057 x->left = x->right = MEM_NIL;
3058 x->color = MEM_RED;
3059
3060 /* Insert it as child of PARENT or install it as root. */
3061 if (parent)
3062 {
3063 if (start < parent->start)
3064 parent->left = x;
3065 else
3066 parent->right = x;
3067 }
3068 else
3069 mem_root = x;
3070
3071 /* Re-establish red-black tree properties. */
3072 mem_insert_fixup (x);
3073
3074 return x;
3075 }
3076
3077
3078 /* Re-establish the red-black properties of the tree, and thereby
3079 balance the tree, after node X has been inserted; X is always red. */
3080
3081 static void
3082 mem_insert_fixup (x)
3083 struct mem_node *x;
3084 {
3085 while (x != mem_root && x->parent->color == MEM_RED)
3086 {
3087 /* X is red and its parent is red. This is a violation of
3088 red-black tree property #3. */
3089
3090 if (x->parent == x->parent->parent->left)
3091 {
3092 /* We're on the left side of our grandparent, and Y is our
3093 "uncle". */
3094 struct mem_node *y = x->parent->parent->right;
3095
3096 if (y->color == MEM_RED)
3097 {
3098 /* Uncle and parent are red but should be black because
3099 X is red. Change the colors accordingly and proceed
3100 with the grandparent. */
3101 x->parent->color = MEM_BLACK;
3102 y->color = MEM_BLACK;
3103 x->parent->parent->color = MEM_RED;
3104 x = x->parent->parent;
3105 }
3106 else
3107 {
3108 /* Parent and uncle have different colors; parent is
3109 red, uncle is black. */
3110 if (x == x->parent->right)
3111 {
3112 x = x->parent;
3113 mem_rotate_left (x);
3114 }
3115
3116 x->parent->color = MEM_BLACK;
3117 x->parent->parent->color = MEM_RED;
3118 mem_rotate_right (x->parent->parent);
3119 }
3120 }
3121 else
3122 {
3123 /* This is the symmetrical case of above. */
3124 struct mem_node *y = x->parent->parent->left;
3125
3126 if (y->color == MEM_RED)
3127 {
3128 x->parent->color = MEM_BLACK;
3129 y->color = MEM_BLACK;
3130 x->parent->parent->color = MEM_RED;
3131 x = x->parent->parent;
3132 }
3133 else
3134 {
3135 if (x == x->parent->left)
3136 {
3137 x = x->parent;
3138 mem_rotate_right (x);
3139 }
3140
3141 x->parent->color = MEM_BLACK;
3142 x->parent->parent->color = MEM_RED;
3143 mem_rotate_left (x->parent->parent);
3144 }
3145 }
3146 }
3147
3148 /* The root may have been changed to red due to the algorithm. Set
3149 it to black so that property #5 is satisfied. */
3150 mem_root->color = MEM_BLACK;
3151 }
3152
3153
3154 /* (x) (y)
3155 / \ / \
3156 a (y) ===> (x) c
3157 / \ / \
3158 b c a b */
3159
3160 static void
3161 mem_rotate_left (x)
3162 struct mem_node *x;
3163 {
3164 struct mem_node *y;
3165
3166 /* Turn y's left sub-tree into x's right sub-tree. */
3167 y = x->right;
3168 x->right = y->left;
3169 if (y->left != MEM_NIL)
3170 y->left->parent = x;
3171
3172 /* Y's parent was x's parent. */
3173 if (y != MEM_NIL)
3174 y->parent = x->parent;
3175
3176 /* Get the parent to point to y instead of x. */
3177 if (x->parent)
3178 {
3179 if (x == x->parent->left)
3180 x->parent->left = y;
3181 else
3182 x->parent->right = y;
3183 }
3184 else
3185 mem_root = y;
3186
3187 /* Put x on y's left. */
3188 y->left = x;
3189 if (x != MEM_NIL)
3190 x->parent = y;
3191 }
3192
3193
3194 /* (x) (Y)
3195 / \ / \
3196 (y) c ===> a (x)
3197 / \ / \
3198 a b b c */
3199
3200 static void
3201 mem_rotate_right (x)
3202 struct mem_node *x;
3203 {
3204 struct mem_node *y = x->left;
3205
3206 x->left = y->right;
3207 if (y->right != MEM_NIL)
3208 y->right->parent = x;
3209
3210 if (y != MEM_NIL)
3211 y->parent = x->parent;
3212 if (x->parent)
3213 {
3214 if (x == x->parent->right)
3215 x->parent->right = y;
3216 else
3217 x->parent->left = y;
3218 }
3219 else
3220 mem_root = y;
3221
3222 y->right = x;
3223 if (x != MEM_NIL)
3224 x->parent = y;
3225 }
3226
3227
3228 /* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
3229
3230 static void
3231 mem_delete (z)
3232 struct mem_node *z;
3233 {
3234 struct mem_node *x, *y;
3235
3236 if (!z || z == MEM_NIL)
3237 return;
3238
3239 if (z->left == MEM_NIL || z->right == MEM_NIL)
3240 y = z;
3241 else
3242 {
3243 y = z->right;
3244 while (y->left != MEM_NIL)
3245 y = y->left;
3246 }
3247
3248 if (y->left != MEM_NIL)
3249 x = y->left;
3250 else
3251 x = y->right;
3252
3253 x->parent = y->parent;
3254 if (y->parent)
3255 {
3256 if (y == y->parent->left)
3257 y->parent->left = x;
3258 else
3259 y->parent->right = x;
3260 }
3261 else
3262 mem_root = x;
3263
3264 if (y != z)
3265 {
3266 z->start = y->start;
3267 z->end = y->end;
3268 z->type = y->type;
3269 }
3270
3271 if (y->color == MEM_BLACK)
3272 mem_delete_fixup (x);
3273
3274 #ifdef GC_MALLOC_CHECK
3275 _free_internal (y);
3276 #else
3277 xfree (y);
3278 #endif
3279 }
3280
3281
3282 /* Re-establish the red-black properties of the tree, after a
3283 deletion. */
3284
3285 static void
3286 mem_delete_fixup (x)
3287 struct mem_node *x;
3288 {
3289 while (x != mem_root && x->color == MEM_BLACK)
3290 {
3291 if (x == x->parent->left)
3292 {
3293 struct mem_node *w = x->parent->right;
3294
3295 if (w->color == MEM_RED)
3296 {
3297 w->color = MEM_BLACK;
3298 x->parent->color = MEM_RED;
3299 mem_rotate_left (x->parent);
3300 w = x->parent->right;
3301 }
3302
3303 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
3304 {
3305 w->color = MEM_RED;
3306 x = x->parent;
3307 }
3308 else
3309 {
3310 if (w->right->color == MEM_BLACK)
3311 {
3312 w->left->color = MEM_BLACK;
3313 w->color = MEM_RED;
3314 mem_rotate_right (w);
3315 w = x->parent->right;
3316 }
3317 w->color = x->parent->color;
3318 x->parent->color = MEM_BLACK;
3319 w->right->color = MEM_BLACK;
3320 mem_rotate_left (x->parent);
3321 x = mem_root;
3322 }
3323 }
3324 else
3325 {
3326 struct mem_node *w = x->parent->left;
3327
3328 if (w->color == MEM_RED)
3329 {
3330 w->color = MEM_BLACK;
3331 x->parent->color = MEM_RED;
3332 mem_rotate_right (x->parent);
3333 w = x->parent->left;
3334 }
3335
3336 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
3337 {
3338 w->color = MEM_RED;
3339 x = x->parent;
3340 }
3341 else
3342 {
3343 if (w->left->color == MEM_BLACK)
3344 {
3345 w->right->color = MEM_BLACK;
3346 w->color = MEM_RED;
3347 mem_rotate_left (w);
3348 w = x->parent->left;
3349 }
3350
3351 w->color = x->parent->color;
3352 x->parent->color = MEM_BLACK;
3353 w->left->color = MEM_BLACK;
3354 mem_rotate_right (x->parent);
3355 x = mem_root;
3356 }
3357 }
3358 }
3359
3360 x->color = MEM_BLACK;
3361 }
3362
3363
3364 /* Value is non-zero if P is a pointer to a live Lisp string on
3365 the heap. M is a pointer to the mem_block for P. */
3366
3367 static INLINE int
3368 live_string_p (m, p)
3369 struct mem_node *m;
3370 void *p;
3371 {
3372 if (m->type == MEM_TYPE_STRING)
3373 {
3374 struct string_block *b = (struct string_block *) m->start;
3375 int offset = (char *) p - (char *) &b->strings[0];
3376
3377 /* P must point to the start of a Lisp_String structure, and it
3378 must not be on the free-list. */
3379 return (offset >= 0
3380 && offset % sizeof b->strings[0] == 0
3381 && ((struct Lisp_String *) p)->data != NULL);
3382 }
3383 else
3384 return 0;
3385 }
3386
3387
3388 /* Value is non-zero if P is a pointer to a live Lisp cons on
3389 the heap. M is a pointer to the mem_block for P. */
3390
3391 static INLINE int
3392 live_cons_p (m, p)
3393 struct mem_node *m;
3394 void *p;
3395 {
3396 if (m->type == MEM_TYPE_CONS)
3397 {
3398 struct cons_block *b = (struct cons_block *) m->start;
3399 int offset = (char *) p - (char *) &b->conses[0];
3400
3401 /* P must point to the start of a Lisp_Cons, not be
3402 one of the unused cells in the current cons block,
3403 and not be on the free-list. */
3404 return (offset >= 0
3405 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
3406 && offset % sizeof b->conses[0] == 0
3407 && (b != cons_block
3408 || offset / sizeof b->conses[0] < cons_block_index)
3409 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
3410 }
3411 else
3412 return 0;
3413 }
3414
3415
3416 /* Value is non-zero if P is a pointer to a live Lisp symbol on
3417 the heap. M is a pointer to the mem_block for P. */
3418
3419 static INLINE int
3420 live_symbol_p (m, p)
3421 struct mem_node *m;
3422 void *p;
3423 {
3424 if (m->type == MEM_TYPE_SYMBOL)
3425 {
3426 struct symbol_block *b = (struct symbol_block *) m->start;
3427 int offset = (char *) p - (char *) &b->symbols[0];
3428
3429 /* P must point to the start of a Lisp_Symbol, not be
3430 one of the unused cells in the current symbol block,
3431 and not be on the free-list. */
3432 return (offset >= 0
3433 && offset % sizeof b->symbols[0] == 0
3434 && (b != symbol_block
3435 || offset / sizeof b->symbols[0] < symbol_block_index)
3436 && !EQ (((struct Lisp_Symbol *) p)->function, Vdead));
3437 }
3438 else
3439 return 0;
3440 }
3441
3442
3443 /* Value is non-zero if P is a pointer to a live Lisp float on
3444 the heap. M is a pointer to the mem_block for P. */
3445
3446 static INLINE int
3447 live_float_p (m, p)
3448 struct mem_node *m;
3449 void *p;
3450 {
3451 if (m->type == MEM_TYPE_FLOAT)
3452 {
3453 struct float_block *b = (struct float_block *) m->start;
3454 int offset = (char *) p - (char *) &b->floats[0];
3455
3456 /* P must point to the start of a Lisp_Float and not be
3457 one of the unused cells in the current float block. */
3458 return (offset >= 0
3459 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
3460 && offset % sizeof b->floats[0] == 0
3461 && (b != float_block
3462 || offset / sizeof b->floats[0] < float_block_index));
3463 }
3464 else
3465 return 0;
3466 }
3467
3468
3469 /* Value is non-zero if P is a pointer to a live Lisp Misc on
3470 the heap. M is a pointer to the mem_block for P. */
3471
3472 static INLINE int
3473 live_misc_p (m, p)
3474 struct mem_node *m;
3475 void *p;
3476 {
3477 if (m->type == MEM_TYPE_MISC)
3478 {
3479 struct marker_block *b = (struct marker_block *) m->start;
3480 int offset = (char *) p - (char *) &b->markers[0];
3481
3482 /* P must point to the start of a Lisp_Misc, not be
3483 one of the unused cells in the current misc block,
3484 and not be on the free-list. */
3485 return (offset >= 0
3486 && offset % sizeof b->markers[0] == 0
3487 && (b != marker_block
3488 || offset / sizeof b->markers[0] < marker_block_index)
3489 && ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free);
3490 }
3491 else
3492 return 0;
3493 }
3494
3495
3496 /* Value is non-zero if P is a pointer to a live vector-like object.
3497 M is a pointer to the mem_block for P. */
3498
3499 static INLINE int
3500 live_vector_p (m, p)
3501 struct mem_node *m;
3502 void *p;
3503 {
3504 return (p == m->start
3505 && m->type >= MEM_TYPE_VECTOR
3506 && m->type <= MEM_TYPE_WINDOW);
3507 }
3508
3509
3510 /* Value is non-zero if P is a pointer to a live buffer. M is a
3511 pointer to the mem_block for P. */
3512
3513 static INLINE int
3514 live_buffer_p (m, p)
3515 struct mem_node *m;
3516 void *p;
3517 {
3518 /* P must point to the start of the block, and the buffer
3519 must not have been killed. */
3520 return (m->type == MEM_TYPE_BUFFER
3521 && p == m->start
3522 && !NILP (((struct buffer *) p)->name));
3523 }
3524
3525 #endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
3526
3527 #if GC_MARK_STACK
3528
3529 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3530
3531 /* Array of objects that are kept alive because the C stack contains
3532 a pattern that looks like a reference to them . */
3533
3534 #define MAX_ZOMBIES 10
3535 static Lisp_Object zombies[MAX_ZOMBIES];
3536
3537 /* Number of zombie objects. */
3538
3539 static int nzombies;
3540
3541 /* Number of garbage collections. */
3542
3543 static int ngcs;
3544
3545 /* Average percentage of zombies per collection. */
3546
3547 static double avg_zombies;
3548
3549 /* Max. number of live and zombie objects. */
3550
3551 static int max_live, max_zombies;
3552
3553 /* Average number of live objects per GC. */
3554
3555 static double avg_live;
3556
3557 DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
3558 doc: /* Show information about live and zombie objects. */)
3559 ()
3560 {
3561 Lisp_Object args[8], zombie_list = Qnil;
3562 int i;
3563 for (i = 0; i < nzombies; i++)
3564 zombie_list = Fcons (zombies[i], zombie_list);
3565 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
3566 args[1] = make_number (ngcs);
3567 args[2] = make_float (avg_live);
3568 args[3] = make_float (avg_zombies);
3569 args[4] = make_float (avg_zombies / avg_live / 100);
3570 args[5] = make_number (max_live);
3571 args[6] = make_number (max_zombies);
3572 args[7] = zombie_list;
3573 return Fmessage (8, args);
3574 }
3575
3576 #endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
3577
3578
3579 /* Mark OBJ if we can prove it's a Lisp_Object. */
3580
3581 static INLINE void
3582 mark_maybe_object (obj)
3583 Lisp_Object obj;
3584 {
3585 void *po = (void *) XPNTR (obj);
3586 struct mem_node *m = mem_find (po);
3587
3588 if (m != MEM_NIL)
3589 {
3590 int mark_p = 0;
3591
3592 switch (XGCTYPE (obj))
3593 {
3594 case Lisp_String:
3595 mark_p = (live_string_p (m, po)
3596 && !STRING_MARKED_P ((struct Lisp_String *) po));
3597 break;
3598
3599 case Lisp_Cons:
3600 mark_p = (live_cons_p (m, po) && !CONS_MARKED_P (XCONS (obj)));
3601 break;
3602
3603 case Lisp_Symbol:
3604 mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
3605 break;
3606
3607 case Lisp_Float:
3608 mark_p = (live_float_p (m, po) && !FLOAT_MARKED_P (XFLOAT (obj)));
3609 break;
3610
3611 case Lisp_Vectorlike:
3612 /* Note: can't check GC_BUFFERP before we know it's a
3613 buffer because checking that dereferences the pointer
3614 PO which might point anywhere. */
3615 if (live_vector_p (m, po))
3616 mark_p = !GC_SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj));
3617 else if (live_buffer_p (m, po))
3618 mark_p = GC_BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
3619 break;
3620
3621 case Lisp_Misc:
3622 mark_p = (live_misc_p (m, po) && !XMARKER (obj)->gcmarkbit);
3623 break;
3624
3625 case Lisp_Int:
3626 case Lisp_Type_Limit:
3627 break;
3628 }
3629
3630 if (mark_p)
3631 {
3632 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3633 if (nzombies < MAX_ZOMBIES)
3634 zombies[nzombies] = obj;
3635 ++nzombies;
3636 #endif
3637 mark_object (obj);
3638 }
3639 }
3640 }
3641
3642
3643 /* If P points to Lisp data, mark that as live if it isn't already
3644 marked. */
3645
3646 static INLINE void
3647 mark_maybe_pointer (p)
3648 void *p;
3649 {
3650 struct mem_node *m;
3651
3652 /* Quickly rule out some values which can't point to Lisp data. We
3653 assume that Lisp data is aligned on even addresses. */
3654 if ((EMACS_INT) p & 1)
3655 return;
3656
3657 m = mem_find (p);
3658 if (m != MEM_NIL)
3659 {
3660 Lisp_Object obj = Qnil;
3661
3662 switch (m->type)
3663 {
3664 case MEM_TYPE_NON_LISP:
3665 /* Nothing to do; not a pointer to Lisp memory. */
3666 break;
3667
3668 case MEM_TYPE_BUFFER:
3669 if (live_buffer_p (m, p) && !VECTOR_MARKED_P((struct buffer *)p))
3670 XSETVECTOR (obj, p);
3671 break;
3672
3673 case MEM_TYPE_CONS:
3674 if (live_cons_p (m, p) && !CONS_MARKED_P ((struct Lisp_Cons *) p))
3675 XSETCONS (obj, p);
3676 break;
3677
3678 case MEM_TYPE_STRING:
3679 if (live_string_p (m, p)
3680 && !STRING_MARKED_P ((struct Lisp_String *) p))
3681 XSETSTRING (obj, p);
3682 break;
3683
3684 case MEM_TYPE_MISC:
3685 if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
3686 XSETMISC (obj, p);
3687 break;
3688
3689 case MEM_TYPE_SYMBOL:
3690 if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
3691 XSETSYMBOL (obj, p);
3692 break;
3693
3694 case MEM_TYPE_FLOAT:
3695 if (live_float_p (m, p) && !FLOAT_MARKED_P (p))
3696 XSETFLOAT (obj, p);
3697 break;
3698
3699 case MEM_TYPE_VECTOR:
3700 case MEM_TYPE_PROCESS:
3701 case MEM_TYPE_HASH_TABLE:
3702 case MEM_TYPE_FRAME:
3703 case MEM_TYPE_WINDOW:
3704 if (live_vector_p (m, p))
3705 {
3706 Lisp_Object tem;
3707 XSETVECTOR (tem, p);
3708 if (!GC_SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem)))
3709 obj = tem;
3710 }
3711 break;
3712
3713 default:
3714 abort ();
3715 }
3716
3717 if (!GC_NILP (obj))
3718 mark_object (obj);
3719 }
3720 }
3721
3722
3723 /* Mark Lisp objects referenced from the address range START..END. */
3724
3725 static void
3726 mark_memory (start, end)
3727 void *start, *end;
3728 {
3729 Lisp_Object *p;
3730 void **pp;
3731
3732 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3733 nzombies = 0;
3734 #endif
3735
3736 /* Make START the pointer to the start of the memory region,
3737 if it isn't already. */
3738 if (end < start)
3739 {
3740 void *tem = start;
3741 start = end;
3742 end = tem;
3743 }
3744
3745 /* Mark Lisp_Objects. */
3746 for (p = (Lisp_Object *) start; (void *) p < end; ++p)
3747 mark_maybe_object (*p);
3748
3749 /* Mark Lisp data pointed to. This is necessary because, in some
3750 situations, the C compiler optimizes Lisp objects away, so that
3751 only a pointer to them remains. Example:
3752
3753 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
3754 ()
3755 {
3756 Lisp_Object obj = build_string ("test");
3757 struct Lisp_String *s = XSTRING (obj);
3758 Fgarbage_collect ();
3759 fprintf (stderr, "test `%s'\n", s->data);
3760 return Qnil;
3761 }
3762
3763 Here, `obj' isn't really used, and the compiler optimizes it
3764 away. The only reference to the life string is through the
3765 pointer `s'. */
3766
3767 for (pp = (void **) start; (void *) pp < end; ++pp)
3768 mark_maybe_pointer (*pp);
3769 }
3770
3771 /* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in
3772 the GCC system configuration. In gcc 3.2, the only systems for
3773 which this is so are i386-sco5 non-ELF, i386-sysv3 (maybe included
3774 by others?) and ns32k-pc532-min. */
3775
3776 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
3777
3778 static int setjmp_tested_p, longjmps_done;
3779
3780 #define SETJMP_WILL_LIKELY_WORK "\
3781 \n\
3782 Emacs garbage collector has been changed to use conservative stack\n\
3783 marking. Emacs has determined that the method it uses to do the\n\
3784 marking will likely work on your system, but this isn't sure.\n\
3785 \n\
3786 If you are a system-programmer, or can get the help of a local wizard\n\
3787 who is, please take a look at the function mark_stack in alloc.c, and\n\
3788 verify that the methods used are appropriate for your system.\n\
3789 \n\
3790 Please mail the result to <emacs-devel@gnu.org>.\n\
3791 "
3792
3793 #define SETJMP_WILL_NOT_WORK "\
3794 \n\
3795 Emacs garbage collector has been changed to use conservative stack\n\
3796 marking. Emacs has determined that the default method it uses to do the\n\
3797 marking will not work on your system. We will need a system-dependent\n\
3798 solution for your system.\n\
3799 \n\
3800 Please take a look at the function mark_stack in alloc.c, and\n\
3801 try to find a way to make it work on your system.\n\
3802 \n\
3803 Note that you may get false negatives, depending on the compiler.\n\
3804 In particular, you need to use -O with GCC for this test.\n\
3805 \n\
3806 Please mail the result to <emacs-devel@gnu.org>.\n\
3807 "
3808
3809
3810 /* Perform a quick check if it looks like setjmp saves registers in a
3811 jmp_buf. Print a message to stderr saying so. When this test
3812 succeeds, this is _not_ a proof that setjmp is sufficient for
3813 conservative stack marking. Only the sources or a disassembly
3814 can prove that. */
3815
3816 static void
3817 test_setjmp ()
3818 {
3819 char buf[10];
3820 register int x;
3821 jmp_buf jbuf;
3822 int result = 0;
3823
3824 /* Arrange for X to be put in a register. */
3825 sprintf (buf, "1");
3826 x = strlen (buf);
3827 x = 2 * x - 1;
3828
3829 setjmp (jbuf);
3830 if (longjmps_done == 1)
3831 {
3832 /* Came here after the longjmp at the end of the function.
3833
3834 If x == 1, the longjmp has restored the register to its
3835 value before the setjmp, and we can hope that setjmp
3836 saves all such registers in the jmp_buf, although that
3837 isn't sure.
3838
3839 For other values of X, either something really strange is
3840 taking place, or the setjmp just didn't save the register. */
3841
3842 if (x == 1)
3843 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
3844 else
3845 {
3846 fprintf (stderr, SETJMP_WILL_NOT_WORK);
3847 exit (1);
3848 }
3849 }
3850
3851 ++longjmps_done;
3852 x = 2;
3853 if (longjmps_done == 1)
3854 longjmp (jbuf, 1);
3855 }
3856
3857 #endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
3858
3859
3860 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
3861
3862 /* Abort if anything GCPRO'd doesn't survive the GC. */
3863
3864 static void
3865 check_gcpros ()
3866 {
3867 struct gcpro *p;
3868 int i;
3869
3870 for (p = gcprolist; p; p = p->next)
3871 for (i = 0; i < p->nvars; ++i)
3872 if (!survives_gc_p (p->var[i]))
3873 /* FIXME: It's not necessarily a bug. It might just be that the
3874 GCPRO is unnecessary or should release the object sooner. */
3875 abort ();
3876 }
3877
3878 #elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3879
3880 static void
3881 dump_zombies ()
3882 {
3883 int i;
3884
3885 fprintf (stderr, "\nZombies kept alive = %d:\n", nzombies);
3886 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
3887 {
3888 fprintf (stderr, " %d = ", i);
3889 debug_print (zombies[i]);
3890 }
3891 }
3892
3893 #endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
3894
3895
3896 /* Mark live Lisp objects on the C stack.
3897
3898 There are several system-dependent problems to consider when
3899 porting this to new architectures:
3900
3901 Processor Registers
3902
3903 We have to mark Lisp objects in CPU registers that can hold local
3904 variables or are used to pass parameters.
3905
3906 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
3907 something that either saves relevant registers on the stack, or
3908 calls mark_maybe_object passing it each register's contents.
3909
3910 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
3911 implementation assumes that calling setjmp saves registers we need
3912 to see in a jmp_buf which itself lies on the stack. This doesn't
3913 have to be true! It must be verified for each system, possibly
3914 by taking a look at the source code of setjmp.
3915
3916 Stack Layout
3917
3918 Architectures differ in the way their processor stack is organized.
3919 For example, the stack might look like this
3920
3921 +----------------+
3922 | Lisp_Object | size = 4
3923 +----------------+
3924 | something else | size = 2
3925 +----------------+
3926 | Lisp_Object | size = 4
3927 +----------------+
3928 | ... |
3929
3930 In such a case, not every Lisp_Object will be aligned equally. To
3931 find all Lisp_Object on the stack it won't be sufficient to walk
3932 the stack in steps of 4 bytes. Instead, two passes will be
3933 necessary, one starting at the start of the stack, and a second
3934 pass starting at the start of the stack + 2. Likewise, if the
3935 minimal alignment of Lisp_Objects on the stack is 1, four passes
3936 would be necessary, each one starting with one byte more offset
3937 from the stack start.
3938
3939 The current code assumes by default that Lisp_Objects are aligned
3940 equally on the stack. */
3941
3942 static void
3943 mark_stack ()
3944 {
3945 int i;
3946 jmp_buf j;
3947 volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
3948 void *end;
3949
3950 /* This trick flushes the register windows so that all the state of
3951 the process is contained in the stack. */
3952 /* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
3953 needed on ia64 too. See mach_dep.c, where it also says inline
3954 assembler doesn't work with relevant proprietary compilers. */
3955 #ifdef sparc
3956 asm ("ta 3");
3957 #endif
3958
3959 /* Save registers that we need to see on the stack. We need to see
3960 registers used to hold register variables and registers used to
3961 pass parameters. */
3962 #ifdef GC_SAVE_REGISTERS_ON_STACK
3963 GC_SAVE_REGISTERS_ON_STACK (end);
3964 #else /* not GC_SAVE_REGISTERS_ON_STACK */
3965
3966 #ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
3967 setjmp will definitely work, test it
3968 and print a message with the result
3969 of the test. */
3970 if (!setjmp_tested_p)
3971 {
3972 setjmp_tested_p = 1;
3973 test_setjmp ();
3974 }
3975 #endif /* GC_SETJMP_WORKS */
3976
3977 setjmp (j);
3978 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
3979 #endif /* not GC_SAVE_REGISTERS_ON_STACK */
3980
3981 /* This assumes that the stack is a contiguous region in memory. If
3982 that's not the case, something has to be done here to iterate
3983 over the stack segments. */
3984 #ifndef GC_LISP_OBJECT_ALIGNMENT
3985 #ifdef __GNUC__
3986 #define GC_LISP_OBJECT_ALIGNMENT __alignof__ (Lisp_Object)
3987 #else
3988 #define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object)
3989 #endif
3990 #endif
3991 for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT)
3992 mark_memory ((char *) stack_base + i, end);
3993
3994 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
3995 check_gcpros ();
3996 #endif
3997 }
3998
3999
4000 #endif /* GC_MARK_STACK != 0 */
4001
4002
4003 \f
4004 /***********************************************************************
4005 Pure Storage Management
4006 ***********************************************************************/
4007
4008 /* Allocate room for SIZE bytes from pure Lisp storage and return a
4009 pointer to it. TYPE is the Lisp type for which the memory is
4010 allocated. TYPE < 0 means it's not used for a Lisp object.
4011
4012 If store_pure_type_info is set and TYPE is >= 0, the type of
4013 the allocated object is recorded in pure_types. */
4014
4015 static POINTER_TYPE *
4016 pure_alloc (size, type)
4017 size_t size;
4018 int type;
4019 {
4020 POINTER_TYPE *result;
4021 size_t alignment = sizeof (EMACS_INT);
4022
4023 /* Give Lisp_Floats an extra alignment. */
4024 if (type == Lisp_Float)
4025 {
4026 #if defined __GNUC__ && __GNUC__ >= 2
4027 alignment = __alignof (struct Lisp_Float);
4028 #else
4029 alignment = sizeof (struct Lisp_Float);
4030 #endif
4031 }
4032
4033 again:
4034 result = ALIGN (purebeg + pure_bytes_used, alignment);
4035 pure_bytes_used = ((char *)result - (char *)purebeg) + size;
4036
4037 if (pure_bytes_used <= pure_size)
4038 return result;
4039
4040 /* Don't allocate a large amount here,
4041 because it might get mmap'd and then its address
4042 might not be usable. */
4043 purebeg = (char *) xmalloc (10000);
4044 pure_size = 10000;
4045 pure_bytes_used_before_overflow += pure_bytes_used - size;
4046 pure_bytes_used = 0;
4047 goto again;
4048 }
4049
4050
4051 /* Print a warning if PURESIZE is too small. */
4052
4053 void
4054 check_pure_size ()
4055 {
4056 if (pure_bytes_used_before_overflow)
4057 message ("Pure Lisp storage overflow (approx. %d bytes needed)",
4058 (int) (pure_bytes_used + pure_bytes_used_before_overflow));
4059 }
4060
4061
4062 /* Return a string allocated in pure space. DATA is a buffer holding
4063 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
4064 non-zero means make the result string multibyte.
4065
4066 Must get an error if pure storage is full, since if it cannot hold
4067 a large string it may be able to hold conses that point to that
4068 string; then the string is not protected from gc. */
4069
4070 Lisp_Object
4071 make_pure_string (data, nchars, nbytes, multibyte)
4072 char *data;
4073 int nchars, nbytes;
4074 int multibyte;
4075 {
4076 Lisp_Object string;
4077 struct Lisp_String *s;
4078
4079 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
4080 s->data = (unsigned char *) pure_alloc (nbytes + 1, -1);
4081 s->size = nchars;
4082 s->size_byte = multibyte ? nbytes : -1;
4083 bcopy (data, s->data, nbytes);
4084 s->data[nbytes] = '\0';
4085 s->intervals = NULL_INTERVAL;
4086 XSETSTRING (string, s);
4087 return string;
4088 }
4089
4090
4091 /* Return a cons allocated from pure space. Give it pure copies
4092 of CAR as car and CDR as cdr. */
4093
4094 Lisp_Object
4095 pure_cons (car, cdr)
4096 Lisp_Object car, cdr;
4097 {
4098 register Lisp_Object new;
4099 struct Lisp_Cons *p;
4100
4101 p = (struct Lisp_Cons *) pure_alloc (sizeof *p, Lisp_Cons);
4102 XSETCONS (new, p);
4103 XSETCAR (new, Fpurecopy (car));
4104 XSETCDR (new, Fpurecopy (cdr));
4105 return new;
4106 }
4107
4108
4109 /* Value is a float object with value NUM allocated from pure space. */
4110
4111 Lisp_Object
4112 make_pure_float (num)
4113 double num;
4114 {
4115 register Lisp_Object new;
4116 struct Lisp_Float *p;
4117
4118 p = (struct Lisp_Float *) pure_alloc (sizeof *p, Lisp_Float);
4119 XSETFLOAT (new, p);
4120 XFLOAT_DATA (new) = num;
4121 return new;
4122 }
4123
4124
4125 /* Return a vector with room for LEN Lisp_Objects allocated from
4126 pure space. */
4127
4128 Lisp_Object
4129 make_pure_vector (len)
4130 EMACS_INT len;
4131 {
4132 Lisp_Object new;
4133 struct Lisp_Vector *p;
4134 size_t size = sizeof *p + (len - 1) * sizeof (Lisp_Object);
4135
4136 p = (struct Lisp_Vector *) pure_alloc (size, Lisp_Vectorlike);
4137 XSETVECTOR (new, p);
4138 XVECTOR (new)->size = len;
4139 return new;
4140 }
4141
4142
4143 DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
4144 doc: /* Make a copy of OBJECT in pure storage.
4145 Recursively copies contents of vectors and cons cells.
4146 Does not copy symbols. Copies strings without text properties. */)
4147 (obj)
4148 register Lisp_Object obj;
4149 {
4150 if (NILP (Vpurify_flag))
4151 return obj;
4152
4153 if (PURE_POINTER_P (XPNTR (obj)))
4154 return obj;
4155
4156 if (CONSP (obj))
4157 return pure_cons (XCAR (obj), XCDR (obj));
4158 else if (FLOATP (obj))
4159 return make_pure_float (XFLOAT_DATA (obj));
4160 else if (STRINGP (obj))
4161 return make_pure_string (SDATA (obj), SCHARS (obj),
4162 SBYTES (obj),
4163 STRING_MULTIBYTE (obj));
4164 else if (COMPILEDP (obj) || VECTORP (obj))
4165 {
4166 register struct Lisp_Vector *vec;
4167 register int i, size;
4168
4169 size = XVECTOR (obj)->size;
4170 if (size & PSEUDOVECTOR_FLAG)
4171 size &= PSEUDOVECTOR_SIZE_MASK;
4172 vec = XVECTOR (make_pure_vector ((EMACS_INT) size));
4173 for (i = 0; i < size; i++)
4174 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]);
4175 if (COMPILEDP (obj))
4176 XSETCOMPILED (obj, vec);
4177 else
4178 XSETVECTOR (obj, vec);
4179 return obj;
4180 }
4181 else if (MARKERP (obj))
4182 error ("Attempt to copy a marker to pure storage");
4183
4184 return obj;
4185 }
4186
4187
4188 \f
4189 /***********************************************************************
4190 Protection from GC
4191 ***********************************************************************/
4192
4193 /* Put an entry in staticvec, pointing at the variable with address
4194 VARADDRESS. */
4195
4196 void
4197 staticpro (varaddress)
4198 Lisp_Object *varaddress;
4199 {
4200 staticvec[staticidx++] = varaddress;
4201 if (staticidx >= NSTATICS)
4202 abort ();
4203 }
4204
4205 struct catchtag
4206 {
4207 Lisp_Object tag;
4208 Lisp_Object val;
4209 struct catchtag *next;
4210 };
4211
4212 struct backtrace
4213 {
4214 struct backtrace *next;
4215 Lisp_Object *function;
4216 Lisp_Object *args; /* Points to vector of args. */
4217 int nargs; /* Length of vector. */
4218 /* If nargs is UNEVALLED, args points to slot holding list of
4219 unevalled args. */
4220 char evalargs;
4221 };
4222
4223
4224 \f
4225 /***********************************************************************
4226 Protection from GC
4227 ***********************************************************************/
4228
4229 /* Temporarily prevent garbage collection. */
4230
4231 int
4232 inhibit_garbage_collection ()
4233 {
4234 int count = SPECPDL_INDEX ();
4235 int nbits = min (VALBITS, BITS_PER_INT);
4236
4237 specbind (Qgc_cons_threshold, make_number (((EMACS_INT) 1 << (nbits - 1)) - 1));
4238 return count;
4239 }
4240
4241
4242 DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
4243 doc: /* Reclaim storage for Lisp objects no longer needed.
4244 Garbage collection happens automatically if you cons more than
4245 `gc-cons-threshold' bytes of Lisp data since previous garbage collection.
4246 `garbage-collect' normally returns a list with info on amount of space in use:
4247 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)
4248 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS
4249 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS)
4250 (USED-STRINGS . FREE-STRINGS))
4251 However, if there was overflow in pure space, `garbage-collect'
4252 returns nil, because real GC can't be done. */)
4253 ()
4254 {
4255 register struct specbinding *bind;
4256 struct catchtag *catch;
4257 struct handler *handler;
4258 register struct backtrace *backlist;
4259 char stack_top_variable;
4260 register int i;
4261 int message_p;
4262 Lisp_Object total[8];
4263 int count = SPECPDL_INDEX ();
4264 EMACS_TIME t1, t2, t3;
4265
4266 if (abort_on_gc)
4267 abort ();
4268
4269 EMACS_GET_TIME (t1);
4270
4271 /* Can't GC if pure storage overflowed because we can't determine
4272 if something is a pure object or not. */
4273 if (pure_bytes_used_before_overflow)
4274 return Qnil;
4275
4276 /* In case user calls debug_print during GC,
4277 don't let that cause a recursive GC. */
4278 consing_since_gc = 0;
4279
4280 /* Save what's currently displayed in the echo area. */
4281 message_p = push_message ();
4282 record_unwind_protect (pop_message_unwind, Qnil);
4283
4284 /* Save a copy of the contents of the stack, for debugging. */
4285 #if MAX_SAVE_STACK > 0
4286 if (NILP (Vpurify_flag))
4287 {
4288 i = &stack_top_variable - stack_bottom;
4289 if (i < 0) i = -i;
4290 if (i < MAX_SAVE_STACK)
4291 {
4292 if (stack_copy == 0)
4293 stack_copy = (char *) xmalloc (stack_copy_size = i);
4294 else if (stack_copy_size < i)
4295 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i));
4296 if (stack_copy)
4297 {
4298 if ((EMACS_INT) (&stack_top_variable - stack_bottom) > 0)
4299 bcopy (stack_bottom, stack_copy, i);
4300 else
4301 bcopy (&stack_top_variable, stack_copy, i);
4302 }
4303 }
4304 }
4305 #endif /* MAX_SAVE_STACK > 0 */
4306
4307 if (garbage_collection_messages)
4308 message1_nolog ("Garbage collecting...");
4309
4310 BLOCK_INPUT;
4311
4312 shrink_regexp_cache ();
4313
4314 /* Don't keep undo information around forever. */
4315 {
4316 register struct buffer *nextb = all_buffers;
4317
4318 while (nextb)
4319 {
4320 /* If a buffer's undo list is Qt, that means that undo is
4321 turned off in that buffer. Calling truncate_undo_list on
4322 Qt tends to return NULL, which effectively turns undo back on.
4323 So don't call truncate_undo_list if undo_list is Qt. */
4324 if (! EQ (nextb->undo_list, Qt))
4325 nextb->undo_list
4326 = truncate_undo_list (nextb->undo_list, undo_limit,
4327 undo_strong_limit);
4328
4329 /* Shrink buffer gaps, but skip indirect and dead buffers. */
4330 if (nextb->base_buffer == 0 && !NILP (nextb->name))
4331 {
4332 /* If a buffer's gap size is more than 10% of the buffer
4333 size, or larger than 2000 bytes, then shrink it
4334 accordingly. Keep a minimum size of 20 bytes. */
4335 int size = min (2000, max (20, (nextb->text->z_byte / 10)));
4336
4337 if (nextb->text->gap_size > size)
4338 {
4339 struct buffer *save_current = current_buffer;
4340 current_buffer = nextb;
4341 make_gap (-(nextb->text->gap_size - size));
4342 current_buffer = save_current;
4343 }
4344 }
4345
4346 nextb = nextb->next;
4347 }
4348 }
4349
4350 gc_in_progress = 1;
4351
4352 /* clear_marks (); */
4353
4354 /* Mark all the special slots that serve as the roots of accessibility.
4355
4356 Usually the special slots to mark are contained in particular structures.
4357 Then we know no slot is marked twice because the structures don't overlap.
4358 In some cases, the structures point to the slots to be marked.
4359 For these, we use MARKBIT to avoid double marking of the slot. */
4360
4361 for (i = 0; i < staticidx; i++)
4362 mark_object (*staticvec[i]);
4363
4364 #if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
4365 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
4366 mark_stack ();
4367 #else
4368 {
4369 register struct gcpro *tail;
4370 for (tail = gcprolist; tail; tail = tail->next)
4371 for (i = 0; i < tail->nvars; i++)
4372 if (!XMARKBIT (tail->var[i]))
4373 {
4374 mark_object (tail->var[i]);
4375 XMARK (tail->var[i]);
4376 }
4377 }
4378 #endif
4379
4380 mark_byte_stack ();
4381 for (bind = specpdl; bind != specpdl_ptr; bind++)
4382 {
4383 mark_object (bind->symbol);
4384 mark_object (bind->old_value);
4385 }
4386 for (catch = catchlist; catch; catch = catch->next)
4387 {
4388 mark_object (catch->tag);
4389 mark_object (catch->val);
4390 }
4391 for (handler = handlerlist; handler; handler = handler->next)
4392 {
4393 mark_object (handler->handler);
4394 mark_object (handler->var);
4395 }
4396 for (backlist = backtrace_list; backlist; backlist = backlist->next)
4397 {
4398 if (!XMARKBIT (*backlist->function))
4399 {
4400 mark_object (*backlist->function);
4401 XMARK (*backlist->function);
4402 }
4403 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
4404 i = 0;
4405 else
4406 i = backlist->nargs - 1;
4407 for (; i >= 0; i--)
4408 if (!XMARKBIT (backlist->args[i]))
4409 {
4410 mark_object (backlist->args[i]);
4411 XMARK (backlist->args[i]);
4412 }
4413 }
4414 mark_kboards ();
4415
4416 /* Look thru every buffer's undo list
4417 for elements that update markers that were not marked,
4418 and delete them. */
4419 {
4420 register struct buffer *nextb = all_buffers;
4421
4422 while (nextb)
4423 {
4424 /* If a buffer's undo list is Qt, that means that undo is
4425 turned off in that buffer. Calling truncate_undo_list on
4426 Qt tends to return NULL, which effectively turns undo back on.
4427 So don't call truncate_undo_list if undo_list is Qt. */
4428 if (! EQ (nextb->undo_list, Qt))
4429 {
4430 Lisp_Object tail, prev;
4431 tail = nextb->undo_list;
4432 prev = Qnil;
4433 while (CONSP (tail))
4434 {
4435 if (GC_CONSP (XCAR (tail))
4436 && GC_MARKERP (XCAR (XCAR (tail)))
4437 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
4438 {
4439 if (NILP (prev))
4440 nextb->undo_list = tail = XCDR (tail);
4441 else
4442 {
4443 tail = XCDR (tail);
4444 XSETCDR (prev, tail);
4445 }
4446 }
4447 else
4448 {
4449 prev = tail;
4450 tail = XCDR (tail);
4451 }
4452 }
4453 }
4454
4455 nextb = nextb->next;
4456 }
4457 }
4458
4459 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4460 mark_stack ();
4461 #endif
4462
4463 #ifdef USE_GTK
4464 {
4465 extern void xg_mark_data ();
4466 xg_mark_data ();
4467 }
4468 #endif
4469
4470 gc_sweep ();
4471
4472 /* Clear the mark bits that we set in certain root slots. */
4473
4474 #if (GC_MARK_STACK == GC_USE_GCPROS_AS_BEFORE \
4475 || GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES)
4476 {
4477 register struct gcpro *tail;
4478
4479 for (tail = gcprolist; tail; tail = tail->next)
4480 for (i = 0; i < tail->nvars; i++)
4481 XUNMARK (tail->var[i]);
4482 }
4483 #endif
4484
4485 unmark_byte_stack ();
4486 for (backlist = backtrace_list; backlist; backlist = backlist->next)
4487 {
4488 XUNMARK (*backlist->function);
4489 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
4490 i = 0;
4491 else
4492 i = backlist->nargs - 1;
4493 for (; i >= 0; i--)
4494 XUNMARK (backlist->args[i]);
4495 }
4496 VECTOR_UNMARK (&buffer_defaults);
4497 VECTOR_UNMARK (&buffer_local_symbols);
4498
4499 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
4500 dump_zombies ();
4501 #endif
4502
4503 UNBLOCK_INPUT;
4504
4505 /* clear_marks (); */
4506 gc_in_progress = 0;
4507
4508 consing_since_gc = 0;
4509 if (gc_cons_threshold < 10000)
4510 gc_cons_threshold = 10000;
4511
4512 if (garbage_collection_messages)
4513 {
4514 if (message_p || minibuf_level > 0)
4515 restore_message ();
4516 else
4517 message1_nolog ("Garbage collecting...done");
4518 }
4519
4520 unbind_to (count, Qnil);
4521
4522 total[0] = Fcons (make_number (total_conses),
4523 make_number (total_free_conses));
4524 total[1] = Fcons (make_number (total_symbols),
4525 make_number (total_free_symbols));
4526 total[2] = Fcons (make_number (total_markers),
4527 make_number (total_free_markers));
4528 total[3] = make_number (total_string_size);
4529 total[4] = make_number (total_vector_size);
4530 total[5] = Fcons (make_number (total_floats),
4531 make_number (total_free_floats));
4532 total[6] = Fcons (make_number (total_intervals),
4533 make_number (total_free_intervals));
4534 total[7] = Fcons (make_number (total_strings),
4535 make_number (total_free_strings));
4536
4537 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4538 {
4539 /* Compute average percentage of zombies. */
4540 double nlive = 0;
4541
4542 for (i = 0; i < 7; ++i)
4543 if (CONSP (total[i]))
4544 nlive += XFASTINT (XCAR (total[i]));
4545
4546 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
4547 max_live = max (nlive, max_live);
4548 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
4549 max_zombies = max (nzombies, max_zombies);
4550 ++ngcs;
4551 }
4552 #endif
4553
4554 if (!NILP (Vpost_gc_hook))
4555 {
4556 int count = inhibit_garbage_collection ();
4557 safe_run_hooks (Qpost_gc_hook);
4558 unbind_to (count, Qnil);
4559 }
4560
4561 /* Accumulate statistics. */
4562 EMACS_GET_TIME (t2);
4563 EMACS_SUB_TIME (t3, t2, t1);
4564 if (FLOATP (Vgc_elapsed))
4565 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed) +
4566 EMACS_SECS (t3) +
4567 EMACS_USECS (t3) * 1.0e-6);
4568 gcs_done++;
4569
4570 return Flist (sizeof total / sizeof *total, total);
4571 }
4572
4573
4574 /* Mark Lisp objects in glyph matrix MATRIX. Currently the
4575 only interesting objects referenced from glyphs are strings. */
4576
4577 static void
4578 mark_glyph_matrix (matrix)
4579 struct glyph_matrix *matrix;
4580 {
4581 struct glyph_row *row = matrix->rows;
4582 struct glyph_row *end = row + matrix->nrows;
4583
4584 for (; row < end; ++row)
4585 if (row->enabled_p)
4586 {
4587 int area;
4588 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
4589 {
4590 struct glyph *glyph = row->glyphs[area];
4591 struct glyph *end_glyph = glyph + row->used[area];
4592
4593 for (; glyph < end_glyph; ++glyph)
4594 if (GC_STRINGP (glyph->object)
4595 && !STRING_MARKED_P (XSTRING (glyph->object)))
4596 mark_object (glyph->object);
4597 }
4598 }
4599 }
4600
4601
4602 /* Mark Lisp faces in the face cache C. */
4603
4604 static void
4605 mark_face_cache (c)
4606 struct face_cache *c;
4607 {
4608 if (c)
4609 {
4610 int i, j;
4611 for (i = 0; i < c->used; ++i)
4612 {
4613 struct face *face = FACE_FROM_ID (c->f, i);
4614
4615 if (face)
4616 {
4617 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
4618 mark_object (face->lface[j]);
4619 }
4620 }
4621 }
4622 }
4623
4624
4625 #ifdef HAVE_WINDOW_SYSTEM
4626
4627 /* Mark Lisp objects in image IMG. */
4628
4629 static void
4630 mark_image (img)
4631 struct image *img;
4632 {
4633 mark_object (img->spec);
4634
4635 if (!NILP (img->data.lisp_val))
4636 mark_object (img->data.lisp_val);
4637 }
4638
4639
4640 /* Mark Lisp objects in image cache of frame F. It's done this way so
4641 that we don't have to include xterm.h here. */
4642
4643 static void
4644 mark_image_cache (f)
4645 struct frame *f;
4646 {
4647 forall_images_in_image_cache (f, mark_image);
4648 }
4649
4650 #endif /* HAVE_X_WINDOWS */
4651
4652
4653 \f
4654 /* Mark reference to a Lisp_Object.
4655 If the object referred to has not been seen yet, recursively mark
4656 all the references contained in it. */
4657
4658 #define LAST_MARKED_SIZE 500
4659 Lisp_Object last_marked[LAST_MARKED_SIZE];
4660 int last_marked_index;
4661
4662 /* For debugging--call abort when we cdr down this many
4663 links of a list, in mark_object. In debugging,
4664 the call to abort will hit a breakpoint.
4665 Normally this is zero and the check never goes off. */
4666 int mark_object_loop_halt;
4667
4668 void
4669 mark_object (arg)
4670 Lisp_Object arg;
4671 {
4672 register Lisp_Object obj = arg;
4673 #ifdef GC_CHECK_MARKED_OBJECTS
4674 void *po;
4675 struct mem_node *m;
4676 #endif
4677 int cdr_count = 0;
4678
4679 loop:
4680 XUNMARK (obj);
4681
4682 if (PURE_POINTER_P (XPNTR (obj)))
4683 return;
4684
4685 last_marked[last_marked_index++] = obj;
4686 if (last_marked_index == LAST_MARKED_SIZE)
4687 last_marked_index = 0;
4688
4689 /* Perform some sanity checks on the objects marked here. Abort if
4690 we encounter an object we know is bogus. This increases GC time
4691 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
4692 #ifdef GC_CHECK_MARKED_OBJECTS
4693
4694 po = (void *) XPNTR (obj);
4695
4696 /* Check that the object pointed to by PO is known to be a Lisp
4697 structure allocated from the heap. */
4698 #define CHECK_ALLOCATED() \
4699 do { \
4700 m = mem_find (po); \
4701 if (m == MEM_NIL) \
4702 abort (); \
4703 } while (0)
4704
4705 /* Check that the object pointed to by PO is live, using predicate
4706 function LIVEP. */
4707 #define CHECK_LIVE(LIVEP) \
4708 do { \
4709 if (!LIVEP (m, po)) \
4710 abort (); \
4711 } while (0)
4712
4713 /* Check both of the above conditions. */
4714 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
4715 do { \
4716 CHECK_ALLOCATED (); \
4717 CHECK_LIVE (LIVEP); \
4718 } while (0) \
4719
4720 #else /* not GC_CHECK_MARKED_OBJECTS */
4721
4722 #define CHECK_ALLOCATED() (void) 0
4723 #define CHECK_LIVE(LIVEP) (void) 0
4724 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
4725
4726 #endif /* not GC_CHECK_MARKED_OBJECTS */
4727
4728 switch (SWITCH_ENUM_CAST (XGCTYPE (obj)))
4729 {
4730 case Lisp_String:
4731 {
4732 register struct Lisp_String *ptr = XSTRING (obj);
4733 CHECK_ALLOCATED_AND_LIVE (live_string_p);
4734 MARK_INTERVAL_TREE (ptr->intervals);
4735 MARK_STRING (ptr);
4736 #ifdef GC_CHECK_STRING_BYTES
4737 /* Check that the string size recorded in the string is the
4738 same as the one recorded in the sdata structure. */
4739 CHECK_STRING_BYTES (ptr);
4740 #endif /* GC_CHECK_STRING_BYTES */
4741 }
4742 break;
4743
4744 case Lisp_Vectorlike:
4745 #ifdef GC_CHECK_MARKED_OBJECTS
4746 m = mem_find (po);
4747 if (m == MEM_NIL && !GC_SUBRP (obj)
4748 && po != &buffer_defaults
4749 && po != &buffer_local_symbols)
4750 abort ();
4751 #endif /* GC_CHECK_MARKED_OBJECTS */
4752
4753 if (GC_BUFFERP (obj))
4754 {
4755 if (!VECTOR_MARKED_P (XBUFFER (obj)))
4756 {
4757 #ifdef GC_CHECK_MARKED_OBJECTS
4758 if (po != &buffer_defaults && po != &buffer_local_symbols)
4759 {
4760 struct buffer *b;
4761 for (b = all_buffers; b && b != po; b = b->next)
4762 ;
4763 if (b == NULL)
4764 abort ();
4765 }
4766 #endif /* GC_CHECK_MARKED_OBJECTS */
4767 mark_buffer (obj);
4768 }
4769 }
4770 else if (GC_SUBRP (obj))
4771 break;
4772 else if (GC_COMPILEDP (obj))
4773 /* We could treat this just like a vector, but it is better to
4774 save the COMPILED_CONSTANTS element for last and avoid
4775 recursion there. */
4776 {
4777 register struct Lisp_Vector *ptr = XVECTOR (obj);
4778 register EMACS_INT size = ptr->size;
4779 register int i;
4780
4781 if (VECTOR_MARKED_P (ptr))
4782 break; /* Already marked */
4783
4784 CHECK_LIVE (live_vector_p);
4785 VECTOR_MARK (ptr); /* Else mark it */
4786 size &= PSEUDOVECTOR_SIZE_MASK;
4787 for (i = 0; i < size; i++) /* and then mark its elements */
4788 {
4789 if (i != COMPILED_CONSTANTS)
4790 mark_object (ptr->contents[i]);
4791 }
4792 obj = ptr->contents[COMPILED_CONSTANTS];
4793 goto loop;
4794 }
4795 else if (GC_FRAMEP (obj))
4796 {
4797 register struct frame *ptr = XFRAME (obj);
4798
4799 if (VECTOR_MARKED_P (ptr)) break; /* Already marked */
4800 VECTOR_MARK (ptr); /* Else mark it */
4801
4802 CHECK_LIVE (live_vector_p);
4803 mark_object (ptr->name);
4804 mark_object (ptr->icon_name);
4805 mark_object (ptr->title);
4806 mark_object (ptr->focus_frame);
4807 mark_object (ptr->selected_window);
4808 mark_object (ptr->minibuffer_window);
4809 mark_object (ptr->param_alist);
4810 mark_object (ptr->scroll_bars);
4811 mark_object (ptr->condemned_scroll_bars);
4812 mark_object (ptr->menu_bar_items);
4813 mark_object (ptr->face_alist);
4814 mark_object (ptr->menu_bar_vector);
4815 mark_object (ptr->buffer_predicate);
4816 mark_object (ptr->buffer_list);
4817 mark_object (ptr->menu_bar_window);
4818 mark_object (ptr->tool_bar_window);
4819 mark_face_cache (ptr->face_cache);
4820 #ifdef HAVE_WINDOW_SYSTEM
4821 mark_image_cache (ptr);
4822 mark_object (ptr->tool_bar_items);
4823 mark_object (ptr->desired_tool_bar_string);
4824 mark_object (ptr->current_tool_bar_string);
4825 #endif /* HAVE_WINDOW_SYSTEM */
4826 }
4827 else if (GC_BOOL_VECTOR_P (obj))
4828 {
4829 register struct Lisp_Vector *ptr = XVECTOR (obj);
4830
4831 if (VECTOR_MARKED_P (ptr))
4832 break; /* Already marked */
4833 CHECK_LIVE (live_vector_p);
4834 VECTOR_MARK (ptr); /* Else mark it */
4835 }
4836 else if (GC_WINDOWP (obj))
4837 {
4838 register struct Lisp_Vector *ptr = XVECTOR (obj);
4839 struct window *w = XWINDOW (obj);
4840 register int i;
4841
4842 /* Stop if already marked. */
4843 if (VECTOR_MARKED_P (ptr))
4844 break;
4845
4846 /* Mark it. */
4847 CHECK_LIVE (live_vector_p);
4848 VECTOR_MARK (ptr);
4849
4850 /* There is no Lisp data above The member CURRENT_MATRIX in
4851 struct WINDOW. Stop marking when that slot is reached. */
4852 for (i = 0;
4853 (char *) &ptr->contents[i] < (char *) &w->current_matrix;
4854 i++)
4855 mark_object (ptr->contents[i]);
4856
4857 /* Mark glyphs for leaf windows. Marking window matrices is
4858 sufficient because frame matrices use the same glyph
4859 memory. */
4860 if (NILP (w->hchild)
4861 && NILP (w->vchild)
4862 && w->current_matrix)
4863 {
4864 mark_glyph_matrix (w->current_matrix);
4865 mark_glyph_matrix (w->desired_matrix);
4866 }
4867 }
4868 else if (GC_HASH_TABLE_P (obj))
4869 {
4870 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
4871
4872 /* Stop if already marked. */
4873 if (VECTOR_MARKED_P (h))
4874 break;
4875
4876 /* Mark it. */
4877 CHECK_LIVE (live_vector_p);
4878 VECTOR_MARK (h);
4879
4880 /* Mark contents. */
4881 /* Do not mark next_free or next_weak.
4882 Being in the next_weak chain
4883 should not keep the hash table alive.
4884 No need to mark `count' since it is an integer. */
4885 mark_object (h->test);
4886 mark_object (h->weak);
4887 mark_object (h->rehash_size);
4888 mark_object (h->rehash_threshold);
4889 mark_object (h->hash);
4890 mark_object (h->next);
4891 mark_object (h->index);
4892 mark_object (h->user_hash_function);
4893 mark_object (h->user_cmp_function);
4894
4895 /* If hash table is not weak, mark all keys and values.
4896 For weak tables, mark only the vector. */
4897 if (GC_NILP (h->weak))
4898 mark_object (h->key_and_value);
4899 else
4900 VECTOR_MARK (XVECTOR (h->key_and_value));
4901 }
4902 else
4903 {
4904 register struct Lisp_Vector *ptr = XVECTOR (obj);
4905 register EMACS_INT size = ptr->size;
4906 register int i;
4907
4908 if (VECTOR_MARKED_P (ptr)) break; /* Already marked */
4909 CHECK_LIVE (live_vector_p);
4910 VECTOR_MARK (ptr); /* Else mark it */
4911 if (size & PSEUDOVECTOR_FLAG)
4912 size &= PSEUDOVECTOR_SIZE_MASK;
4913
4914 for (i = 0; i < size; i++) /* and then mark its elements */
4915 mark_object (ptr->contents[i]);
4916 }
4917 break;
4918
4919 case Lisp_Symbol:
4920 {
4921 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
4922 struct Lisp_Symbol *ptrx;
4923
4924 if (ptr->gcmarkbit) break;
4925 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
4926 ptr->gcmarkbit = 1;
4927 mark_object (ptr->value);
4928 mark_object (ptr->function);
4929 mark_object (ptr->plist);
4930
4931 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
4932 MARK_STRING (XSTRING (ptr->xname));
4933 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
4934
4935 /* Note that we do not mark the obarray of the symbol.
4936 It is safe not to do so because nothing accesses that
4937 slot except to check whether it is nil. */
4938 ptr = ptr->next;
4939 if (ptr)
4940 {
4941 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
4942 XSETSYMBOL (obj, ptrx);
4943 goto loop;
4944 }
4945 }
4946 break;
4947
4948 case Lisp_Misc:
4949 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
4950 if (XMARKER (obj)->gcmarkbit)
4951 break;
4952 XMARKER (obj)->gcmarkbit = 1;
4953 switch (XMISCTYPE (obj))
4954 {
4955 case Lisp_Misc_Buffer_Local_Value:
4956 case Lisp_Misc_Some_Buffer_Local_Value:
4957 {
4958 register struct Lisp_Buffer_Local_Value *ptr
4959 = XBUFFER_LOCAL_VALUE (obj);
4960 /* If the cdr is nil, avoid recursion for the car. */
4961 if (EQ (ptr->cdr, Qnil))
4962 {
4963 obj = ptr->realvalue;
4964 goto loop;
4965 }
4966 mark_object (ptr->realvalue);
4967 mark_object (ptr->buffer);
4968 mark_object (ptr->frame);
4969 obj = ptr->cdr;
4970 goto loop;
4971 }
4972
4973 case Lisp_Misc_Marker:
4974 /* DO NOT mark thru the marker's chain.
4975 The buffer's markers chain does not preserve markers from gc;
4976 instead, markers are removed from the chain when freed by gc. */
4977 case Lisp_Misc_Intfwd:
4978 case Lisp_Misc_Boolfwd:
4979 case Lisp_Misc_Objfwd:
4980 case Lisp_Misc_Buffer_Objfwd:
4981 case Lisp_Misc_Kboard_Objfwd:
4982 /* Don't bother with Lisp_Buffer_Objfwd,
4983 since all markable slots in current buffer marked anyway. */
4984 /* Don't need to do Lisp_Objfwd, since the places they point
4985 are protected with staticpro. */
4986 case Lisp_Misc_Save_Value:
4987 break;
4988
4989 case Lisp_Misc_Overlay:
4990 {
4991 struct Lisp_Overlay *ptr = XOVERLAY (obj);
4992 mark_object (ptr->start);
4993 mark_object (ptr->end);
4994 mark_object (ptr->plist);
4995 if (ptr->next)
4996 {
4997 XSETMISC (obj, ptr->next);
4998 goto loop;
4999 }
5000 }
5001 break;
5002
5003 default:
5004 abort ();
5005 }
5006 break;
5007
5008 case Lisp_Cons:
5009 {
5010 register struct Lisp_Cons *ptr = XCONS (obj);
5011 if (CONS_MARKED_P (ptr)) break;
5012 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
5013 CONS_MARK (ptr);
5014 /* If the cdr is nil, avoid recursion for the car. */
5015 if (EQ (ptr->cdr, Qnil))
5016 {
5017 obj = ptr->car;
5018 cdr_count = 0;
5019 goto loop;
5020 }
5021 mark_object (ptr->car);
5022 obj = ptr->cdr;
5023 cdr_count++;
5024 if (cdr_count == mark_object_loop_halt)
5025 abort ();
5026 goto loop;
5027 }
5028
5029 case Lisp_Float:
5030 CHECK_ALLOCATED_AND_LIVE (live_float_p);
5031 FLOAT_MARK (XFLOAT (obj));
5032 break;
5033
5034 case Lisp_Int:
5035 break;
5036
5037 default:
5038 abort ();
5039 }
5040
5041 #undef CHECK_LIVE
5042 #undef CHECK_ALLOCATED
5043 #undef CHECK_ALLOCATED_AND_LIVE
5044 }
5045
5046 /* Mark the pointers in a buffer structure. */
5047
5048 static void
5049 mark_buffer (buf)
5050 Lisp_Object buf;
5051 {
5052 register struct buffer *buffer = XBUFFER (buf);
5053 register Lisp_Object *ptr, tmp;
5054 Lisp_Object base_buffer;
5055
5056 VECTOR_MARK (buffer);
5057
5058 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
5059
5060 if (CONSP (buffer->undo_list))
5061 {
5062 Lisp_Object tail;
5063 tail = buffer->undo_list;
5064
5065 /* We mark the undo list specially because
5066 its pointers to markers should be weak. */
5067
5068 while (CONSP (tail))
5069 {
5070 register struct Lisp_Cons *ptr = XCONS (tail);
5071
5072 if (CONS_MARKED_P (ptr))
5073 break;
5074 CONS_MARK (ptr);
5075 if (GC_CONSP (ptr->car)
5076 && !CONS_MARKED_P (XCONS (ptr->car))
5077 && GC_MARKERP (XCAR (ptr->car)))
5078 {
5079 CONS_MARK (XCONS (ptr->car));
5080 mark_object (XCDR (ptr->car));
5081 }
5082 else
5083 mark_object (ptr->car);
5084
5085 if (CONSP (ptr->cdr))
5086 tail = ptr->cdr;
5087 else
5088 break;
5089 }
5090
5091 mark_object (XCDR (tail));
5092 }
5093 else
5094 mark_object (buffer->undo_list);
5095
5096 if (buffer->overlays_before)
5097 {
5098 XSETMISC (tmp, buffer->overlays_before);
5099 mark_object (tmp);
5100 }
5101 if (buffer->overlays_after)
5102 {
5103 XSETMISC (tmp, buffer->overlays_after);
5104 mark_object (tmp);
5105 }
5106
5107 for (ptr = &buffer->name;
5108 (char *)ptr < (char *)buffer + sizeof (struct buffer);
5109 ptr++)
5110 mark_object (*ptr);
5111
5112 /* If this is an indirect buffer, mark its base buffer. */
5113 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
5114 {
5115 XSETBUFFER (base_buffer, buffer->base_buffer);
5116 mark_buffer (base_buffer);
5117 }
5118 }
5119
5120
5121 /* Value is non-zero if OBJ will survive the current GC because it's
5122 either marked or does not need to be marked to survive. */
5123
5124 int
5125 survives_gc_p (obj)
5126 Lisp_Object obj;
5127 {
5128 int survives_p;
5129
5130 switch (XGCTYPE (obj))
5131 {
5132 case Lisp_Int:
5133 survives_p = 1;
5134 break;
5135
5136 case Lisp_Symbol:
5137 survives_p = XSYMBOL (obj)->gcmarkbit;
5138 break;
5139
5140 case Lisp_Misc:
5141 survives_p = XMARKER (obj)->gcmarkbit;
5142 break;
5143
5144 case Lisp_String:
5145 survives_p = STRING_MARKED_P (XSTRING (obj));
5146 break;
5147
5148 case Lisp_Vectorlike:
5149 survives_p = GC_SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
5150 break;
5151
5152 case Lisp_Cons:
5153 survives_p = CONS_MARKED_P (XCONS (obj));
5154 break;
5155
5156 case Lisp_Float:
5157 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
5158 break;
5159
5160 default:
5161 abort ();
5162 }
5163
5164 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
5165 }
5166
5167
5168 \f
5169 /* Sweep: find all structures not marked, and free them. */
5170
5171 static void
5172 gc_sweep ()
5173 {
5174 /* Remove or mark entries in weak hash tables.
5175 This must be done before any object is unmarked. */
5176 sweep_weak_hash_tables ();
5177
5178 sweep_strings ();
5179 #ifdef GC_CHECK_STRING_BYTES
5180 if (!noninteractive)
5181 check_string_bytes (1);
5182 #endif
5183
5184 /* Put all unmarked conses on free list */
5185 {
5186 register struct cons_block *cblk;
5187 struct cons_block **cprev = &cons_block;
5188 register int lim = cons_block_index;
5189 register int num_free = 0, num_used = 0;
5190
5191 cons_free_list = 0;
5192
5193 for (cblk = cons_block; cblk; cblk = *cprev)
5194 {
5195 register int i;
5196 int this_free = 0;
5197 for (i = 0; i < lim; i++)
5198 if (!CONS_MARKED_P (&cblk->conses[i]))
5199 {
5200 this_free++;
5201 *(struct Lisp_Cons **)&cblk->conses[i].cdr = cons_free_list;
5202 cons_free_list = &cblk->conses[i];
5203 #if GC_MARK_STACK
5204 cons_free_list->car = Vdead;
5205 #endif
5206 }
5207 else
5208 {
5209 num_used++;
5210 CONS_UNMARK (&cblk->conses[i]);
5211 }
5212 lim = CONS_BLOCK_SIZE;
5213 /* If this block contains only free conses and we have already
5214 seen more than two blocks worth of free conses then deallocate
5215 this block. */
5216 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
5217 {
5218 *cprev = cblk->next;
5219 /* Unhook from the free list. */
5220 cons_free_list = *(struct Lisp_Cons **) &cblk->conses[0].cdr;
5221 lisp_align_free (cblk);
5222 n_cons_blocks--;
5223 }
5224 else
5225 {
5226 num_free += this_free;
5227 cprev = &cblk->next;
5228 }
5229 }
5230 total_conses = num_used;
5231 total_free_conses = num_free;
5232 }
5233
5234 /* Put all unmarked floats on free list */
5235 {
5236 register struct float_block *fblk;
5237 struct float_block **fprev = &float_block;
5238 register int lim = float_block_index;
5239 register int num_free = 0, num_used = 0;
5240
5241 float_free_list = 0;
5242
5243 for (fblk = float_block; fblk; fblk = *fprev)
5244 {
5245 register int i;
5246 int this_free = 0;
5247 for (i = 0; i < lim; i++)
5248 if (!FLOAT_MARKED_P (&fblk->floats[i]))
5249 {
5250 this_free++;
5251 *(struct Lisp_Float **)&fblk->floats[i].data = float_free_list;
5252 float_free_list = &fblk->floats[i];
5253 }
5254 else
5255 {
5256 num_used++;
5257 FLOAT_UNMARK (&fblk->floats[i]);
5258 }
5259 lim = FLOAT_BLOCK_SIZE;
5260 /* If this block contains only free floats and we have already
5261 seen more than two blocks worth of free floats then deallocate
5262 this block. */
5263 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
5264 {
5265 *fprev = fblk->next;
5266 /* Unhook from the free list. */
5267 float_free_list = *(struct Lisp_Float **) &fblk->floats[0].data;
5268 lisp_align_free (fblk);
5269 n_float_blocks--;
5270 }
5271 else
5272 {
5273 num_free += this_free;
5274 fprev = &fblk->next;
5275 }
5276 }
5277 total_floats = num_used;
5278 total_free_floats = num_free;
5279 }
5280
5281 /* Put all unmarked intervals on free list */
5282 {
5283 register struct interval_block *iblk;
5284 struct interval_block **iprev = &interval_block;
5285 register int lim = interval_block_index;
5286 register int num_free = 0, num_used = 0;
5287
5288 interval_free_list = 0;
5289
5290 for (iblk = interval_block; iblk; iblk = *iprev)
5291 {
5292 register int i;
5293 int this_free = 0;
5294
5295 for (i = 0; i < lim; i++)
5296 {
5297 if (!iblk->intervals[i].gcmarkbit)
5298 {
5299 SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
5300 interval_free_list = &iblk->intervals[i];
5301 this_free++;
5302 }
5303 else
5304 {
5305 num_used++;
5306 iblk->intervals[i].gcmarkbit = 0;
5307 }
5308 }
5309 lim = INTERVAL_BLOCK_SIZE;
5310 /* If this block contains only free intervals and we have already
5311 seen more than two blocks worth of free intervals then
5312 deallocate this block. */
5313 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
5314 {
5315 *iprev = iblk->next;
5316 /* Unhook from the free list. */
5317 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
5318 lisp_free (iblk);
5319 n_interval_blocks--;
5320 }
5321 else
5322 {
5323 num_free += this_free;
5324 iprev = &iblk->next;
5325 }
5326 }
5327 total_intervals = num_used;
5328 total_free_intervals = num_free;
5329 }
5330
5331 /* Put all unmarked symbols on free list */
5332 {
5333 register struct symbol_block *sblk;
5334 struct symbol_block **sprev = &symbol_block;
5335 register int lim = symbol_block_index;
5336 register int num_free = 0, num_used = 0;
5337
5338 symbol_free_list = NULL;
5339
5340 for (sblk = symbol_block; sblk; sblk = *sprev)
5341 {
5342 int this_free = 0;
5343 struct Lisp_Symbol *sym = sblk->symbols;
5344 struct Lisp_Symbol *end = sym + lim;
5345
5346 for (; sym < end; ++sym)
5347 {
5348 /* Check if the symbol was created during loadup. In such a case
5349 it might be pointed to by pure bytecode which we don't trace,
5350 so we conservatively assume that it is live. */
5351 int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
5352
5353 if (!sym->gcmarkbit && !pure_p)
5354 {
5355 *(struct Lisp_Symbol **) &sym->value = symbol_free_list;
5356 symbol_free_list = sym;
5357 #if GC_MARK_STACK
5358 symbol_free_list->function = Vdead;
5359 #endif
5360 ++this_free;
5361 }
5362 else
5363 {
5364 ++num_used;
5365 if (!pure_p)
5366 UNMARK_STRING (XSTRING (sym->xname));
5367 sym->gcmarkbit = 0;
5368 }
5369 }
5370
5371 lim = SYMBOL_BLOCK_SIZE;
5372 /* If this block contains only free symbols and we have already
5373 seen more than two blocks worth of free symbols then deallocate
5374 this block. */
5375 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
5376 {
5377 *sprev = sblk->next;
5378 /* Unhook from the free list. */
5379 symbol_free_list = *(struct Lisp_Symbol **)&sblk->symbols[0].value;
5380 lisp_free (sblk);
5381 n_symbol_blocks--;
5382 }
5383 else
5384 {
5385 num_free += this_free;
5386 sprev = &sblk->next;
5387 }
5388 }
5389 total_symbols = num_used;
5390 total_free_symbols = num_free;
5391 }
5392
5393 /* Put all unmarked misc's on free list.
5394 For a marker, first unchain it from the buffer it points into. */
5395 {
5396 register struct marker_block *mblk;
5397 struct marker_block **mprev = &marker_block;
5398 register int lim = marker_block_index;
5399 register int num_free = 0, num_used = 0;
5400
5401 marker_free_list = 0;
5402
5403 for (mblk = marker_block; mblk; mblk = *mprev)
5404 {
5405 register int i;
5406 int this_free = 0;
5407
5408 for (i = 0; i < lim; i++)
5409 {
5410 if (!mblk->markers[i].u_marker.gcmarkbit)
5411 {
5412 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
5413 unchain_marker (&mblk->markers[i].u_marker);
5414 /* Set the type of the freed object to Lisp_Misc_Free.
5415 We could leave the type alone, since nobody checks it,
5416 but this might catch bugs faster. */
5417 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
5418 mblk->markers[i].u_free.chain = marker_free_list;
5419 marker_free_list = &mblk->markers[i];
5420 this_free++;
5421 }
5422 else
5423 {
5424 num_used++;
5425 mblk->markers[i].u_marker.gcmarkbit = 0;
5426 }
5427 }
5428 lim = MARKER_BLOCK_SIZE;
5429 /* If this block contains only free markers and we have already
5430 seen more than two blocks worth of free markers then deallocate
5431 this block. */
5432 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
5433 {
5434 *mprev = mblk->next;
5435 /* Unhook from the free list. */
5436 marker_free_list = mblk->markers[0].u_free.chain;
5437 lisp_free (mblk);
5438 n_marker_blocks--;
5439 }
5440 else
5441 {
5442 num_free += this_free;
5443 mprev = &mblk->next;
5444 }
5445 }
5446
5447 total_markers = num_used;
5448 total_free_markers = num_free;
5449 }
5450
5451 /* Free all unmarked buffers */
5452 {
5453 register struct buffer *buffer = all_buffers, *prev = 0, *next;
5454
5455 while (buffer)
5456 if (!VECTOR_MARKED_P (buffer))
5457 {
5458 if (prev)
5459 prev->next = buffer->next;
5460 else
5461 all_buffers = buffer->next;
5462 next = buffer->next;
5463 lisp_free (buffer);
5464 buffer = next;
5465 }
5466 else
5467 {
5468 VECTOR_UNMARK (buffer);
5469 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
5470 prev = buffer, buffer = buffer->next;
5471 }
5472 }
5473
5474 /* Free all unmarked vectors */
5475 {
5476 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
5477 total_vector_size = 0;
5478
5479 while (vector)
5480 if (!VECTOR_MARKED_P (vector))
5481 {
5482 if (prev)
5483 prev->next = vector->next;
5484 else
5485 all_vectors = vector->next;
5486 next = vector->next;
5487 lisp_free (vector);
5488 n_vectors--;
5489 vector = next;
5490
5491 }
5492 else
5493 {
5494 VECTOR_UNMARK (vector);
5495 if (vector->size & PSEUDOVECTOR_FLAG)
5496 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
5497 else
5498 total_vector_size += vector->size;
5499 prev = vector, vector = vector->next;
5500 }
5501 }
5502
5503 #ifdef GC_CHECK_STRING_BYTES
5504 if (!noninteractive)
5505 check_string_bytes (1);
5506 #endif
5507 }
5508
5509
5510
5511 \f
5512 /* Debugging aids. */
5513
5514 DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
5515 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
5516 This may be helpful in debugging Emacs's memory usage.
5517 We divide the value by 1024 to make sure it fits in a Lisp integer. */)
5518 ()
5519 {
5520 Lisp_Object end;
5521
5522 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
5523
5524 return end;
5525 }
5526
5527 DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
5528 doc: /* Return a list of counters that measure how much consing there has been.
5529 Each of these counters increments for a certain kind of object.
5530 The counters wrap around from the largest positive integer to zero.
5531 Garbage collection does not decrease them.
5532 The elements of the value are as follows:
5533 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
5534 All are in units of 1 = one object consed
5535 except for VECTOR-CELLS and STRING-CHARS, which count the total length of
5536 objects consed.
5537 MISCS include overlays, markers, and some internal types.
5538 Frames, windows, buffers, and subprocesses count as vectors
5539 (but the contents of a buffer's text do not count here). */)
5540 ()
5541 {
5542 Lisp_Object consed[8];
5543
5544 consed[0] = make_number (min (MOST_POSITIVE_FIXNUM, cons_cells_consed));
5545 consed[1] = make_number (min (MOST_POSITIVE_FIXNUM, floats_consed));
5546 consed[2] = make_number (min (MOST_POSITIVE_FIXNUM, vector_cells_consed));
5547 consed[3] = make_number (min (MOST_POSITIVE_FIXNUM, symbols_consed));
5548 consed[4] = make_number (min (MOST_POSITIVE_FIXNUM, string_chars_consed));
5549 consed[5] = make_number (min (MOST_POSITIVE_FIXNUM, misc_objects_consed));
5550 consed[6] = make_number (min (MOST_POSITIVE_FIXNUM, intervals_consed));
5551 consed[7] = make_number (min (MOST_POSITIVE_FIXNUM, strings_consed));
5552
5553 return Flist (8, consed);
5554 }
5555
5556 int suppress_checking;
5557 void
5558 die (msg, file, line)
5559 const char *msg;
5560 const char *file;
5561 int line;
5562 {
5563 fprintf (stderr, "\r\nEmacs fatal error: %s:%d: %s\r\n",
5564 file, line, msg);
5565 abort ();
5566 }
5567 \f
5568 /* Initialization */
5569
5570 void
5571 init_alloc_once ()
5572 {
5573 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
5574 purebeg = PUREBEG;
5575 pure_size = PURESIZE;
5576 pure_bytes_used = 0;
5577 pure_bytes_used_before_overflow = 0;
5578
5579 /* Initialize the list of free aligned blocks. */
5580 free_ablock = NULL;
5581
5582 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
5583 mem_init ();
5584 Vdead = make_pure_string ("DEAD", 4, 4, 0);
5585 #endif
5586
5587 all_vectors = 0;
5588 ignore_warnings = 1;
5589 #ifdef DOUG_LEA_MALLOC
5590 mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
5591 mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
5592 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* max. number of mmap'ed areas */
5593 #endif
5594 init_strings ();
5595 init_cons ();
5596 init_symbol ();
5597 init_marker ();
5598 init_float ();
5599 init_intervals ();
5600
5601 #ifdef REL_ALLOC
5602 malloc_hysteresis = 32;
5603 #else
5604 malloc_hysteresis = 0;
5605 #endif
5606
5607 spare_memory = (char *) malloc (SPARE_MEMORY);
5608
5609 ignore_warnings = 0;
5610 gcprolist = 0;
5611 byte_stack_list = 0;
5612 staticidx = 0;
5613 consing_since_gc = 0;
5614 gc_cons_threshold = 100000 * sizeof (Lisp_Object);
5615 #ifdef VIRT_ADDR_VARIES
5616 malloc_sbrk_unused = 1<<22; /* A large number */
5617 malloc_sbrk_used = 100000; /* as reasonable as any number */
5618 #endif /* VIRT_ADDR_VARIES */
5619 }
5620
5621 void
5622 init_alloc ()
5623 {
5624 gcprolist = 0;
5625 byte_stack_list = 0;
5626 #if GC_MARK_STACK
5627 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
5628 setjmp_tested_p = longjmps_done = 0;
5629 #endif
5630 #endif
5631 Vgc_elapsed = make_float (0.0);
5632 gcs_done = 0;
5633 }
5634
5635 void
5636 syms_of_alloc ()
5637 {
5638 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
5639 doc: /* *Number of bytes of consing between garbage collections.
5640 Garbage collection can happen automatically once this many bytes have been
5641 allocated since the last garbage collection. All data types count.
5642
5643 Garbage collection happens automatically only when `eval' is called.
5644
5645 By binding this temporarily to a large number, you can effectively
5646 prevent garbage collection during a part of the program. */);
5647
5648 DEFVAR_INT ("pure-bytes-used", &pure_bytes_used,
5649 doc: /* Number of bytes of sharable Lisp data allocated so far. */);
5650
5651 DEFVAR_INT ("cons-cells-consed", &cons_cells_consed,
5652 doc: /* Number of cons cells that have been consed so far. */);
5653
5654 DEFVAR_INT ("floats-consed", &floats_consed,
5655 doc: /* Number of floats that have been consed so far. */);
5656
5657 DEFVAR_INT ("vector-cells-consed", &vector_cells_consed,
5658 doc: /* Number of vector cells that have been consed so far. */);
5659
5660 DEFVAR_INT ("symbols-consed", &symbols_consed,
5661 doc: /* Number of symbols that have been consed so far. */);
5662
5663 DEFVAR_INT ("string-chars-consed", &string_chars_consed,
5664 doc: /* Number of string characters that have been consed so far. */);
5665
5666 DEFVAR_INT ("misc-objects-consed", &misc_objects_consed,
5667 doc: /* Number of miscellaneous objects that have been consed so far. */);
5668
5669 DEFVAR_INT ("intervals-consed", &intervals_consed,
5670 doc: /* Number of intervals that have been consed so far. */);
5671
5672 DEFVAR_INT ("strings-consed", &strings_consed,
5673 doc: /* Number of strings that have been consed so far. */);
5674
5675 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
5676 doc: /* Non-nil means loading Lisp code in order to dump an executable.
5677 This means that certain objects should be allocated in shared (pure) space. */);
5678
5679 DEFVAR_INT ("undo-limit", &undo_limit,
5680 doc: /* Keep no more undo information once it exceeds this size.
5681 This limit is applied when garbage collection happens.
5682 The size is counted as the number of bytes occupied,
5683 which includes both saved text and other data. */);
5684 undo_limit = 20000;
5685
5686 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
5687 doc: /* Don't keep more than this much size of undo information.
5688 A command which pushes past this size is itself forgotten.
5689 This limit is applied when garbage collection happens.
5690 The size is counted as the number of bytes occupied,
5691 which includes both saved text and other data. */);
5692 undo_strong_limit = 30000;
5693
5694 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
5695 doc: /* Non-nil means display messages at start and end of garbage collection. */);
5696 garbage_collection_messages = 0;
5697
5698 DEFVAR_LISP ("post-gc-hook", &Vpost_gc_hook,
5699 doc: /* Hook run after garbage collection has finished. */);
5700 Vpost_gc_hook = Qnil;
5701 Qpost_gc_hook = intern ("post-gc-hook");
5702 staticpro (&Qpost_gc_hook);
5703
5704 DEFVAR_LISP ("memory-signal-data", &Vmemory_signal_data,
5705 doc: /* Precomputed `signal' argument for memory-full error. */);
5706 /* We build this in advance because if we wait until we need it, we might
5707 not be able to allocate the memory to hold it. */
5708 Vmemory_signal_data
5709 = list2 (Qerror,
5710 build_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"));
5711
5712 DEFVAR_LISP ("memory-full", &Vmemory_full,
5713 doc: /* Non-nil means we are handling a memory-full error. */);
5714 Vmemory_full = Qnil;
5715
5716 staticpro (&Qgc_cons_threshold);
5717 Qgc_cons_threshold = intern ("gc-cons-threshold");
5718
5719 staticpro (&Qchar_table_extra_slots);
5720 Qchar_table_extra_slots = intern ("char-table-extra-slots");
5721
5722 DEFVAR_LISP ("gc-elapsed", &Vgc_elapsed,
5723 doc: /* Accumulated time elapsed in garbage collections.
5724 The time is in seconds as a floating point value. */);
5725 DEFVAR_INT ("gcs-done", &gcs_done,
5726 doc: /* Accumulated number of garbage collections done. */);
5727
5728 defsubr (&Scons);
5729 defsubr (&Slist);
5730 defsubr (&Svector);
5731 defsubr (&Smake_byte_code);
5732 defsubr (&Smake_list);
5733 defsubr (&Smake_vector);
5734 defsubr (&Smake_string);
5735 defsubr (&Smake_bool_vector);
5736 defsubr (&Smake_symbol);
5737 defsubr (&Smake_marker);
5738 defsubr (&Spurecopy);
5739 defsubr (&Sgarbage_collect);
5740 defsubr (&Smemory_limit);
5741 defsubr (&Smemory_use_counts);
5742
5743 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5744 defsubr (&Sgc_status);
5745 #endif
5746 }