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