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