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