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