lisp/*.el: Remove lexical-binding warnings; additional small cleanups.
[bpt/emacs.git] / src / alloc.c
CommitLineData
7146af97 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
999dd333 2
ab422c4d
PE
3Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2013 Free Software
4Foundation, Inc.
7146af97
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
7146af97 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
7146af97
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
7146af97 20
18160b98 21#include <config.h>
f162bcc3
PE
22
23#define LISP_INLINE EXTERN_INLINE
24
e9b309ac 25#include <stdio.h>
ab6780cd 26#include <limits.h> /* For CHAR_BIT. */
92939d31 27
bc8000ff 28#ifdef ENABLE_CHECKING
b09cca6a 29#include <signal.h> /* For SIGABRT. */
bc8000ff
EZ
30#endif
31
ae9e757a 32#ifdef HAVE_PTHREAD
aa477689
JD
33#include <pthread.h>
34#endif
35
7146af97 36#include "lisp.h"
ece93c02 37#include "process.h"
d5e35230 38#include "intervals.h"
4c0be5f4 39#include "puresize.h"
e5560ff7 40#include "character.h"
7146af97
JB
41#include "buffer.h"
42#include "window.h"
2538fae4 43#include "keyboard.h"
502b9b64 44#include "frame.h"
9ac0d9e0 45#include "blockinput.h"
4a729fd8 46#include "termhooks.h" /* For struct terminal. */
0328b6de 47
0065d054 48#include <verify.h>
e065a56e 49
52828e02
PE
50/* GC_CHECK_MARKED_OBJECTS means do sanity checks on allocated objects.
51 Doable only if GC_MARK_STACK. */
52#if ! GC_MARK_STACK
53# undef GC_CHECK_MARKED_OBJECTS
54#endif
55
6b61353c 56/* GC_MALLOC_CHECK defined means perform validity checks of malloc'd
52828e02
PE
57 memory. Can do this only if using gmalloc.c and if not checking
58 marked objects. */
6b61353c 59
52828e02
PE
60#if (defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC \
61 || defined GC_CHECK_MARKED_OBJECTS)
6b61353c
KH
62#undef GC_MALLOC_CHECK
63#endif
64
bf952fb6 65#include <unistd.h>
de7124a7 66#include <fcntl.h>
de7124a7 67
a411ac43
PE
68#ifdef USE_GTK
69# include "gtkutil.h"
70#endif
69666f77 71#ifdef WINDOWSNT
f892cf9c 72#include "w32.h"
62aba0d4 73#include "w32heap.h" /* for sbrk */
69666f77
EZ
74#endif
75
d1658221 76#ifdef DOUG_LEA_MALLOC
2e471eb5 77
d1658221 78#include <malloc.h>
81d492d5 79
2e471eb5
GM
80/* Specify maximum number of areas to mmap. It would be nice to use a
81 value that explicitly means "no limit". */
82
81d492d5
RS
83#define MMAP_MAX_AREAS 100000000
84
2e471eb5 85#endif /* not DOUG_LEA_MALLOC */
276cbe5a 86
2e471eb5
GM
87/* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
88 to a struct Lisp_String. */
89
7cdee936
SM
90#define MARK_STRING(S) ((S)->size |= ARRAY_MARK_FLAG)
91#define UNMARK_STRING(S) ((S)->size &= ~ARRAY_MARK_FLAG)
b059de99 92#define STRING_MARKED_P(S) (((S)->size & ARRAY_MARK_FLAG) != 0)
2e471eb5 93
eab3844f
PE
94#define VECTOR_MARK(V) ((V)->header.size |= ARRAY_MARK_FLAG)
95#define VECTOR_UNMARK(V) ((V)->header.size &= ~ARRAY_MARK_FLAG)
96#define VECTOR_MARKED_P(V) (((V)->header.size & ARRAY_MARK_FLAG) != 0)
3ef06d12 97
0dd6d66d
DA
98/* Default value of gc_cons_threshold (see below). */
99
663e2b3f 100#define GC_DEFAULT_THRESHOLD (100000 * word_size)
0dd6d66d 101
29208e82
TT
102/* Global variables. */
103struct emacs_globals globals;
104
2e471eb5
GM
105/* Number of bytes of consing done since the last gc. */
106
dac616ff 107EMACS_INT consing_since_gc;
7146af97 108
974aae61
RS
109/* Similar minimum, computed from Vgc_cons_percentage. */
110
dac616ff 111EMACS_INT gc_relative_threshold;
310ea200 112
24d8a105
RS
113/* Minimum number of bytes of consing since GC before next GC,
114 when memory is full. */
115
dac616ff 116EMACS_INT memory_full_cons_threshold;
24d8a105 117
fce31d69 118/* True during GC. */
2e471eb5 119
fce31d69 120bool gc_in_progress;
7146af97 121
fce31d69 122/* True means abort if try to GC.
3de0effb
RS
123 This is for code which is written on the assumption that
124 no GC will happen, so as to verify that assumption. */
125
fce31d69 126bool abort_on_gc;
3de0effb 127
34400008
GM
128/* Number of live and free conses etc. */
129
3ab6e069 130static EMACS_INT total_conses, total_markers, total_symbols, total_buffers;
c0c5c8ae 131static EMACS_INT total_free_conses, total_free_markers, total_free_symbols;
3ab6e069 132static EMACS_INT total_free_floats, total_floats;
fd27a537 133
2e471eb5 134/* Points to memory space allocated as "spare", to be freed if we run
24d8a105
RS
135 out of memory. We keep one large block, four cons-blocks, and
136 two string blocks. */
2e471eb5 137
d3d47262 138static char *spare_memory[7];
276cbe5a 139
2b6148e4
PE
140/* Amount of spare memory to keep in large reserve block, or to see
141 whether this much is available when malloc fails on a larger request. */
2e471eb5 142
276cbe5a 143#define SPARE_MEMORY (1 << 14)
4d09bcf6 144
1b8950e5
RS
145/* Initialize it to a nonzero value to force it into data space
146 (rather than bss space). That way unexec will remap it into text
147 space (pure), on some systems. We have not implemented the
148 remapping on more recent systems because this is less important
149 nowadays than in the days of small memories and timesharing. */
2e471eb5 150
2c4685ee 151EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
7146af97 152#define PUREBEG (char *) pure
2e471eb5 153
9e713715 154/* Pointer to the pure area, and its size. */
2e471eb5 155
9e713715 156static char *purebeg;
903fe15d 157static ptrdiff_t pure_size;
9e713715
GM
158
159/* Number of bytes of pure storage used before pure storage overflowed.
160 If this is non-zero, this implies that an overflow occurred. */
161
903fe15d 162static ptrdiff_t pure_bytes_used_before_overflow;
7146af97 163
fce31d69 164/* True if P points into pure space. */
34400008
GM
165
166#define PURE_POINTER_P(P) \
6a0bf43d 167 ((uintptr_t) (P) - (uintptr_t) purebeg <= pure_size)
34400008 168
fecbd8ff 169/* Index in pure at which next pure Lisp object will be allocated.. */
e5bc14d4 170
d311d28c 171static ptrdiff_t pure_bytes_used_lisp;
e5bc14d4
YM
172
173/* Number of bytes allocated for non-Lisp objects in pure storage. */
174
d311d28c 175static ptrdiff_t pure_bytes_used_non_lisp;
e5bc14d4 176
2e471eb5
GM
177/* If nonzero, this is a warning delivered by malloc and not yet
178 displayed. */
179
a8fe7202 180const char *pending_malloc_warning;
7146af97
JB
181
182/* Maximum amount of C stack to save when a GC happens. */
183
184#ifndef MAX_SAVE_STACK
185#define MAX_SAVE_STACK 16000
186#endif
187
188/* Buffer in which we save a copy of the C stack at each GC. */
189
dd3f25f7 190#if MAX_SAVE_STACK > 0
d3d47262 191static char *stack_copy;
903fe15d 192static ptrdiff_t stack_copy_size;
dd3f25f7 193#endif
7146af97 194
fecbd8ff
SM
195static Lisp_Object Qconses;
196static Lisp_Object Qsymbols;
197static Lisp_Object Qmiscs;
198static Lisp_Object Qstrings;
199static Lisp_Object Qvectors;
200static Lisp_Object Qfloats;
201static Lisp_Object Qintervals;
202static Lisp_Object Qbuffers;
f8643a6b 203static Lisp_Object Qstring_bytes, Qvector_slots, Qheap;
955cbe7b 204static Lisp_Object Qgc_cons_threshold;
3d80c99f 205Lisp_Object Qautomatic_gc;
955cbe7b 206Lisp_Object Qchar_table_extra_slots;
e8197642 207
9e713715
GM
208/* Hook run after GC has finished. */
209
955cbe7b 210static Lisp_Object Qpost_gc_hook;
2c5bd608 211
f57e2426 212static void mark_terminals (void);
f57e2426 213static void gc_sweep (void);
72cb32cf 214static Lisp_Object make_pure_vector (ptrdiff_t);
c752cfa9 215static void mark_buffer (struct buffer *);
41c28a37 216
69003fd8
PE
217#if !defined REL_ALLOC || defined SYSTEM_MALLOC
218static void refill_memory_reserve (void);
219#endif
f57e2426
J
220static void compact_small_strings (void);
221static void free_large_strings (void);
196e41e4 222extern Lisp_Object which_symbols (Lisp_Object, EMACS_INT) EXTERNALLY_VISIBLE;
34400008 223
914adc42
DA
224/* When scanning the C stack for live Lisp objects, Emacs keeps track of
225 what memory allocated via lisp_malloc and lisp_align_malloc is intended
226 for what purpose. This enumeration specifies the type of memory. */
34400008
GM
227
228enum mem_type
229{
230 MEM_TYPE_NON_LISP,
231 MEM_TYPE_BUFFER,
232 MEM_TYPE_CONS,
233 MEM_TYPE_STRING,
234 MEM_TYPE_MISC,
235 MEM_TYPE_SYMBOL,
236 MEM_TYPE_FLOAT,
914adc42
DA
237 /* Since all non-bool pseudovectors are small enough to be
238 allocated from vector blocks, this memory type denotes
239 large regular vectors and large bool pseudovectors. */
f3372c87
DA
240 MEM_TYPE_VECTORLIKE,
241 /* Special type to denote vector blocks. */
35aaa1ea
DA
242 MEM_TYPE_VECTOR_BLOCK,
243 /* Special type to denote reserved memory. */
244 MEM_TYPE_SPARE
34400008
GM
245};
246
877935b1 247#if GC_MARK_STACK || defined GC_MALLOC_CHECK
0b378936 248
0b378936
GM
249/* A unique object in pure space used to make some Lisp objects
250 on free lists recognizable in O(1). */
251
d3d47262 252static Lisp_Object Vdead;
ca78dc43 253#define DEADP(x) EQ (x, Vdead)
0b378936 254
877935b1
GM
255#ifdef GC_MALLOC_CHECK
256
257enum mem_type allocated_mem_type;
877935b1
GM
258
259#endif /* GC_MALLOC_CHECK */
260
261/* A node in the red-black tree describing allocated memory containing
262 Lisp data. Each such block is recorded with its start and end
263 address when it is allocated, and removed from the tree when it
264 is freed.
265
266 A red-black tree is a balanced binary tree with the following
267 properties:
268
269 1. Every node is either red or black.
270 2. Every leaf is black.
271 3. If a node is red, then both of its children are black.
272 4. Every simple path from a node to a descendant leaf contains
273 the same number of black nodes.
274 5. The root is always black.
275
276 When nodes are inserted into the tree, or deleted from the tree,
277 the tree is "fixed" so that these properties are always true.
278
279 A red-black tree with N internal nodes has height at most 2
280 log(N+1). Searches, insertions and deletions are done in O(log N).
281 Please see a text book about data structures for a detailed
282 description of red-black trees. Any book worth its salt should
283 describe them. */
284
285struct mem_node
286{
9f7d9210
RS
287 /* Children of this node. These pointers are never NULL. When there
288 is no child, the value is MEM_NIL, which points to a dummy node. */
289 struct mem_node *left, *right;
290
291 /* The parent of this node. In the root node, this is NULL. */
292 struct mem_node *parent;
877935b1
GM
293
294 /* Start and end of allocated region. */
295 void *start, *end;
296
297 /* Node color. */
298 enum {MEM_BLACK, MEM_RED} color;
177c0ea7 299
877935b1
GM
300 /* Memory type. */
301 enum mem_type type;
302};
303
304/* Base address of stack. Set in main. */
305
306Lisp_Object *stack_base;
307
308/* Root of the tree describing allocated Lisp memory. */
309
310static struct mem_node *mem_root;
311
ece93c02
GM
312/* Lowest and highest known address in the heap. */
313
314static void *min_heap_address, *max_heap_address;
315
877935b1
GM
316/* Sentinel node of the tree. */
317
318static struct mem_node mem_z;
319#define MEM_NIL &mem_z
320
52828e02 321#if GC_MARK_STACK || defined GC_MALLOC_CHECK
f57e2426
J
322static struct mem_node *mem_insert (void *, void *, enum mem_type);
323static void mem_insert_fixup (struct mem_node *);
324static void mem_rotate_left (struct mem_node *);
325static void mem_rotate_right (struct mem_node *);
326static void mem_delete (struct mem_node *);
327static void mem_delete_fixup (struct mem_node *);
b0ab8123 328static struct mem_node *mem_find (void *);
0caaedb1 329#endif
34400008 330
877935b1 331#endif /* GC_MARK_STACK || GC_MALLOC_CHECK */
34400008 332
ca78dc43
PE
333#ifndef DEADP
334# define DEADP(x) 0
335#endif
336
1f0b3fd2
GM
337/* Recording what needs to be marked for gc. */
338
339struct gcpro *gcprolist;
340
379b98b1
PE
341/* Addresses of staticpro'd variables. Initialize it to a nonzero
342 value; otherwise some compilers put it into BSS. */
1f0b3fd2 343
4195afc3 344enum { NSTATICS = 2048 };
d3d47262 345static Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag};
1f0b3fd2
GM
346
347/* Index of next unused slot in staticvec. */
348
fff62aa9 349static int staticidx;
1f0b3fd2 350
261cb4bb 351static void *pure_alloc (size_t, int);
1f0b3fd2
GM
352
353
354/* Value is SZ rounded up to the next multiple of ALIGNMENT.
355 ALIGNMENT must be a power of 2. */
356
ab6780cd 357#define ALIGN(ptr, ALIGNMENT) \
261cb4bb
PE
358 ((void *) (((uintptr_t) (ptr) + (ALIGNMENT) - 1) \
359 & ~ ((ALIGNMENT) - 1)))
1f0b3fd2 360
84575e67
PE
361static void
362XFLOAT_INIT (Lisp_Object f, double n)
363{
364 XFLOAT (f)->u.data = n;
365}
ece93c02 366
7146af97 367\f
34400008
GM
368/************************************************************************
369 Malloc
370 ************************************************************************/
371
4455ad75 372/* Function malloc calls this if it finds we are near exhausting storage. */
d457598b
AS
373
374void
a8fe7202 375malloc_warning (const char *str)
7146af97
JB
376{
377 pending_malloc_warning = str;
378}
379
34400008 380
4455ad75 381/* Display an already-pending malloc warning. */
34400008 382
d457598b 383void
971de7fb 384display_malloc_warning (void)
7146af97 385{
4455ad75
RS
386 call3 (intern ("display-warning"),
387 intern ("alloc"),
388 build_string (pending_malloc_warning),
389 intern ("emergency"));
7146af97 390 pending_malloc_warning = 0;
7146af97 391}
49efed3a 392\f
276cbe5a
RS
393/* Called if we can't allocate relocatable space for a buffer. */
394
395void
d311d28c 396buffer_memory_full (ptrdiff_t nbytes)
276cbe5a 397{
2e471eb5
GM
398 /* If buffers use the relocating allocator, no need to free
399 spare_memory, because we may have plenty of malloc space left
400 that we could get, and if we don't, the malloc that fails will
401 itself cause spare_memory to be freed. If buffers don't use the
402 relocating allocator, treat this like any other failing
403 malloc. */
276cbe5a
RS
404
405#ifndef REL_ALLOC
531b0165 406 memory_full (nbytes);
d9df6f40 407#else
2e471eb5
GM
408 /* This used to call error, but if we've run out of memory, we could
409 get infinite recursion trying to build the string. */
9b306d37 410 xsignal (Qnil, Vmemory_signal_data);
d9df6f40 411#endif
7146af97
JB
412}
413
f3372c87
DA
414/* A common multiple of the positive integers A and B. Ideally this
415 would be the least common multiple, but there's no way to do that
416 as a constant expression in C, so do the best that we can easily do. */
417#define COMMON_MULTIPLE(a, b) \
418 ((a) % (b) == 0 ? (a) : (b) % (a) == 0 ? (b) : (a) * (b))
34400008 419
c9d624c6 420#ifndef XMALLOC_OVERRUN_CHECK
903fe15d 421#define XMALLOC_OVERRUN_CHECK_OVERHEAD 0
c9d624c6 422#else
212f33f1 423
903fe15d
PE
424/* Check for overrun in malloc'ed buffers by wrapping a header and trailer
425 around each block.
bdbed949 426
f701dc2a
PE
427 The header consists of XMALLOC_OVERRUN_CHECK_SIZE fixed bytes
428 followed by XMALLOC_OVERRUN_SIZE_SIZE bytes containing the original
429 block size in little-endian order. The trailer consists of
430 XMALLOC_OVERRUN_CHECK_SIZE fixed bytes.
bdbed949
KS
431
432 The header is used to detect whether this block has been allocated
f701dc2a
PE
433 through these functions, as some low-level libc functions may
434 bypass the malloc hooks. */
bdbed949 435
212f33f1 436#define XMALLOC_OVERRUN_CHECK_SIZE 16
903fe15d 437#define XMALLOC_OVERRUN_CHECK_OVERHEAD \
38532ce6
PE
438 (2 * XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE)
439
440/* Define XMALLOC_OVERRUN_SIZE_SIZE so that (1) it's large enough to
f701dc2a
PE
441 hold a size_t value and (2) the header size is a multiple of the
442 alignment that Emacs needs for C types and for USE_LSB_TAG. */
443#define XMALLOC_BASE_ALIGNMENT \
e32a5799 444 alignof (union { long double d; intmax_t i; void *p; })
f3372c87 445
bfe3e0a2 446#if USE_LSB_TAG
f701dc2a 447# define XMALLOC_HEADER_ALIGNMENT \
2b90362b 448 COMMON_MULTIPLE (GCALIGNMENT, XMALLOC_BASE_ALIGNMENT)
38532ce6
PE
449#else
450# define XMALLOC_HEADER_ALIGNMENT XMALLOC_BASE_ALIGNMENT
451#endif
452#define XMALLOC_OVERRUN_SIZE_SIZE \
f701dc2a
PE
453 (((XMALLOC_OVERRUN_CHECK_SIZE + sizeof (size_t) \
454 + XMALLOC_HEADER_ALIGNMENT - 1) \
455 / XMALLOC_HEADER_ALIGNMENT * XMALLOC_HEADER_ALIGNMENT) \
456 - XMALLOC_OVERRUN_CHECK_SIZE)
bdbed949 457
903fe15d
PE
458static char const xmalloc_overrun_check_header[XMALLOC_OVERRUN_CHECK_SIZE] =
459 { '\x9a', '\x9b', '\xae', '\xaf',
460 '\xbf', '\xbe', '\xce', '\xcf',
461 '\xea', '\xeb', '\xec', '\xed',
462 '\xdf', '\xde', '\x9c', '\x9d' };
212f33f1 463
903fe15d
PE
464static char const xmalloc_overrun_check_trailer[XMALLOC_OVERRUN_CHECK_SIZE] =
465 { '\xaa', '\xab', '\xac', '\xad',
466 '\xba', '\xbb', '\xbc', '\xbd',
467 '\xca', '\xcb', '\xcc', '\xcd',
468 '\xda', '\xdb', '\xdc', '\xdd' };
212f33f1 469
903fe15d 470/* Insert and extract the block size in the header. */
bdbed949 471
903fe15d
PE
472static void
473xmalloc_put_size (unsigned char *ptr, size_t size)
474{
475 int i;
38532ce6 476 for (i = 0; i < XMALLOC_OVERRUN_SIZE_SIZE; i++)
903fe15d 477 {
38532ce6 478 *--ptr = size & ((1 << CHAR_BIT) - 1);
903fe15d
PE
479 size >>= CHAR_BIT;
480 }
481}
bdbed949 482
903fe15d
PE
483static size_t
484xmalloc_get_size (unsigned char *ptr)
485{
486 size_t size = 0;
487 int i;
38532ce6
PE
488 ptr -= XMALLOC_OVERRUN_SIZE_SIZE;
489 for (i = 0; i < XMALLOC_OVERRUN_SIZE_SIZE; i++)
903fe15d
PE
490 {
491 size <<= CHAR_BIT;
492 size += *ptr++;
493 }
494 return size;
495}
bdbed949
KS
496
497
498/* Like malloc, but wraps allocated block with header and trailer. */
499
261cb4bb 500static void *
e7974947 501overrun_check_malloc (size_t size)
212f33f1 502{
bdbed949 503 register unsigned char *val;
0caaedb1 504 if (SIZE_MAX - XMALLOC_OVERRUN_CHECK_OVERHEAD < size)
1088b922 505 emacs_abort ();
212f33f1 506
0caaedb1
PE
507 val = malloc (size + XMALLOC_OVERRUN_CHECK_OVERHEAD);
508 if (val)
212f33f1 509 {
903fe15d 510 memcpy (val, xmalloc_overrun_check_header, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6 511 val += XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
903fe15d 512 xmalloc_put_size (val, size);
72af86bd
AS
513 memcpy (val + size, xmalloc_overrun_check_trailer,
514 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 515 }
261cb4bb 516 return val;
212f33f1
KS
517}
518
bdbed949
KS
519
520/* Like realloc, but checks old block for overrun, and wraps new block
521 with header and trailer. */
522
261cb4bb
PE
523static void *
524overrun_check_realloc (void *block, size_t size)
212f33f1 525{
e7974947 526 register unsigned char *val = (unsigned char *) block;
0caaedb1 527 if (SIZE_MAX - XMALLOC_OVERRUN_CHECK_OVERHEAD < size)
1088b922 528 emacs_abort ();
212f33f1
KS
529
530 if (val
72af86bd 531 && memcmp (xmalloc_overrun_check_header,
38532ce6 532 val - XMALLOC_OVERRUN_CHECK_SIZE - XMALLOC_OVERRUN_SIZE_SIZE,
903fe15d 533 XMALLOC_OVERRUN_CHECK_SIZE) == 0)
212f33f1 534 {
903fe15d 535 size_t osize = xmalloc_get_size (val);
72af86bd
AS
536 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
537 XMALLOC_OVERRUN_CHECK_SIZE))
1088b922 538 emacs_abort ();
72af86bd 539 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6
PE
540 val -= XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
541 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE);
212f33f1
KS
542 }
543
0caaedb1 544 val = realloc (val, size + XMALLOC_OVERRUN_CHECK_OVERHEAD);
212f33f1 545
0caaedb1 546 if (val)
212f33f1 547 {
903fe15d 548 memcpy (val, xmalloc_overrun_check_header, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6 549 val += XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
903fe15d 550 xmalloc_put_size (val, size);
72af86bd
AS
551 memcpy (val + size, xmalloc_overrun_check_trailer,
552 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 553 }
261cb4bb 554 return val;
212f33f1
KS
555}
556
bdbed949
KS
557/* Like free, but checks block for overrun. */
558
2538aa2f 559static void
261cb4bb 560overrun_check_free (void *block)
212f33f1 561{
e7974947 562 unsigned char *val = (unsigned char *) block;
212f33f1
KS
563
564 if (val
72af86bd 565 && memcmp (xmalloc_overrun_check_header,
38532ce6 566 val - XMALLOC_OVERRUN_CHECK_SIZE - XMALLOC_OVERRUN_SIZE_SIZE,
903fe15d 567 XMALLOC_OVERRUN_CHECK_SIZE) == 0)
212f33f1 568 {
903fe15d 569 size_t osize = xmalloc_get_size (val);
72af86bd
AS
570 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
571 XMALLOC_OVERRUN_CHECK_SIZE))
1088b922 572 emacs_abort ();
454d7973 573#ifdef XMALLOC_CLEAR_FREE_MEMORY
38532ce6 574 val -= XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
903fe15d 575 memset (val, 0xff, osize + XMALLOC_OVERRUN_CHECK_OVERHEAD);
454d7973 576#else
72af86bd 577 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
38532ce6
PE
578 val -= XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE;
579 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE + XMALLOC_OVERRUN_SIZE_SIZE);
454d7973 580#endif
212f33f1
KS
581 }
582
583 free (val);
584}
585
586#undef malloc
587#undef realloc
588#undef free
589#define malloc overrun_check_malloc
590#define realloc overrun_check_realloc
591#define free overrun_check_free
592#endif
593
0caaedb1
PE
594/* If compiled with XMALLOC_BLOCK_INPUT_CHECK, define a symbol
595 BLOCK_INPUT_IN_MEMORY_ALLOCATORS that is visible to the debugger.
596 If that variable is set, block input while in one of Emacs's memory
597 allocation functions. There should be no need for this debugging
598 option, since signal handlers do not allocate memory, but Emacs
599 formerly allocated memory in signal handlers and this compile-time
600 option remains as a way to help debug the issue should it rear its
601 ugly head again. */
602#ifdef XMALLOC_BLOCK_INPUT_CHECK
603bool block_input_in_memory_allocators EXTERNALLY_VISIBLE;
604static void
605malloc_block_input (void)
606{
607 if (block_input_in_memory_allocators)
4d7e6e51 608 block_input ();
0caaedb1
PE
609}
610static void
611malloc_unblock_input (void)
612{
613 if (block_input_in_memory_allocators)
4d7e6e51 614 unblock_input ();
0caaedb1
PE
615}
616# define MALLOC_BLOCK_INPUT malloc_block_input ()
617# define MALLOC_UNBLOCK_INPUT malloc_unblock_input ()
dafc79fa 618#else
0caaedb1
PE
619# define MALLOC_BLOCK_INPUT ((void) 0)
620# define MALLOC_UNBLOCK_INPUT ((void) 0)
dafc79fa 621#endif
bdbed949 622
3a880af4
SM
623#define MALLOC_PROBE(size) \
624 do { \
625 if (profiler_memory_running) \
626 malloc_probe (size); \
627 } while (0)
628
629
34400008 630/* Like malloc but check for no memory and block interrupt input.. */
7146af97 631
261cb4bb 632void *
971de7fb 633xmalloc (size_t size)
7146af97 634{
261cb4bb 635 void *val;
7146af97 636
dafc79fa 637 MALLOC_BLOCK_INPUT;
261cb4bb 638 val = malloc (size);
dafc79fa 639 MALLOC_UNBLOCK_INPUT;
7146af97 640
2e471eb5 641 if (!val && size)
531b0165 642 memory_full (size);
c2d7786e 643 MALLOC_PROBE (size);
7146af97
JB
644 return val;
645}
646
23f86fce
DA
647/* Like the above, but zeroes out the memory just allocated. */
648
649void *
650xzalloc (size_t size)
651{
652 void *val;
653
654 MALLOC_BLOCK_INPUT;
655 val = malloc (size);
656 MALLOC_UNBLOCK_INPUT;
657
658 if (!val && size)
659 memory_full (size);
660 memset (val, 0, size);
c2d7786e 661 MALLOC_PROBE (size);
23f86fce
DA
662 return val;
663}
34400008
GM
664
665/* Like realloc but check for no memory and block interrupt input.. */
666
261cb4bb
PE
667void *
668xrealloc (void *block, size_t size)
7146af97 669{
261cb4bb 670 void *val;
7146af97 671
dafc79fa 672 MALLOC_BLOCK_INPUT;
56d2031b
JB
673 /* We must call malloc explicitly when BLOCK is 0, since some
674 reallocs don't do this. */
675 if (! block)
261cb4bb 676 val = malloc (size);
f048679d 677 else
261cb4bb 678 val = realloc (block, size);
dafc79fa 679 MALLOC_UNBLOCK_INPUT;
7146af97 680
531b0165
PE
681 if (!val && size)
682 memory_full (size);
c2d7786e 683 MALLOC_PROBE (size);
7146af97
JB
684 return val;
685}
9ac0d9e0 686
34400008 687
005ca5c7 688/* Like free but block interrupt input. */
34400008 689
9ac0d9e0 690void
261cb4bb 691xfree (void *block)
9ac0d9e0 692{
70fdbb46
JM
693 if (!block)
694 return;
dafc79fa 695 MALLOC_BLOCK_INPUT;
9ac0d9e0 696 free (block);
dafc79fa 697 MALLOC_UNBLOCK_INPUT;
24d8a105 698 /* We don't call refill_memory_reserve here
0caaedb1 699 because in practice the call in r_alloc_free seems to suffice. */
9ac0d9e0
JB
700}
701
c8099634 702
0065d054
PE
703/* Other parts of Emacs pass large int values to allocator functions
704 expecting ptrdiff_t. This is portable in practice, but check it to
705 be safe. */
706verify (INT_MAX <= PTRDIFF_MAX);
707
708
709/* Allocate an array of NITEMS items, each of size ITEM_SIZE.
710 Signal an error on memory exhaustion, and block interrupt input. */
711
712void *
713xnmalloc (ptrdiff_t nitems, ptrdiff_t item_size)
714{
a54e2c05 715 eassert (0 <= nitems && 0 < item_size);
0065d054
PE
716 if (min (PTRDIFF_MAX, SIZE_MAX) / item_size < nitems)
717 memory_full (SIZE_MAX);
718 return xmalloc (nitems * item_size);
719}
720
721
722/* Reallocate an array PA to make it of NITEMS items, each of size ITEM_SIZE.
723 Signal an error on memory exhaustion, and block interrupt input. */
724
725void *
726xnrealloc (void *pa, ptrdiff_t nitems, ptrdiff_t item_size)
727{
a54e2c05 728 eassert (0 <= nitems && 0 < item_size);
0065d054
PE
729 if (min (PTRDIFF_MAX, SIZE_MAX) / item_size < nitems)
730 memory_full (SIZE_MAX);
731 return xrealloc (pa, nitems * item_size);
732}
733
734
735/* Grow PA, which points to an array of *NITEMS items, and return the
736 location of the reallocated array, updating *NITEMS to reflect its
737 new size. The new array will contain at least NITEMS_INCR_MIN more
738 items, but will not contain more than NITEMS_MAX items total.
739 ITEM_SIZE is the size of each item, in bytes.
740
741 ITEM_SIZE and NITEMS_INCR_MIN must be positive. *NITEMS must be
742 nonnegative. If NITEMS_MAX is -1, it is treated as if it were
743 infinity.
744
745 If PA is null, then allocate a new array instead of reallocating
2dd2e622 746 the old one.
0065d054
PE
747
748 Block interrupt input as needed. If memory exhaustion occurs, set
749 *NITEMS to zero if PA is null, and signal an error (i.e., do not
2dd2e622
PE
750 return).
751
752 Thus, to grow an array A without saving its old contents, do
753 { xfree (A); A = NULL; A = xpalloc (NULL, &AITEMS, ...); }.
754 The A = NULL avoids a dangling pointer if xpalloc exhausts memory
755 and signals an error, and later this code is reexecuted and
756 attempts to free A. */
0065d054
PE
757
758void *
759xpalloc (void *pa, ptrdiff_t *nitems, ptrdiff_t nitems_incr_min,
760 ptrdiff_t nitems_max, ptrdiff_t item_size)
761{
762 /* The approximate size to use for initial small allocation
763 requests. This is the largest "small" request for the GNU C
764 library malloc. */
765 enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
766
767 /* If the array is tiny, grow it to about (but no greater than)
768 DEFAULT_MXFAST bytes. Otherwise, grow it by about 50%. */
769 ptrdiff_t n = *nitems;
770 ptrdiff_t tiny_max = DEFAULT_MXFAST / item_size - n;
771 ptrdiff_t half_again = n >> 1;
772 ptrdiff_t incr_estimate = max (tiny_max, half_again);
773
774 /* Adjust the increment according to three constraints: NITEMS_INCR_MIN,
775 NITEMS_MAX, and what the C language can represent safely. */
776 ptrdiff_t C_language_max = min (PTRDIFF_MAX, SIZE_MAX) / item_size;
777 ptrdiff_t n_max = (0 <= nitems_max && nitems_max < C_language_max
778 ? nitems_max : C_language_max);
779 ptrdiff_t nitems_incr_max = n_max - n;
780 ptrdiff_t incr = max (nitems_incr_min, min (incr_estimate, nitems_incr_max));
781
7216e43b 782 eassert (0 < item_size && 0 < nitems_incr_min && 0 <= n && -1 <= nitems_max);
0065d054
PE
783 if (! pa)
784 *nitems = 0;
785 if (nitems_incr_max < incr)
786 memory_full (SIZE_MAX);
787 n += incr;
788 pa = xrealloc (pa, n * item_size);
789 *nitems = n;
790 return pa;
791}
792
793
dca7c6a8
GM
794/* Like strdup, but uses xmalloc. */
795
796char *
971de7fb 797xstrdup (const char *s)
dca7c6a8 798{
309f24d1
DA
799 eassert (s);
800 return strcpy (xmalloc (strlen (s) + 1), s);
dca7c6a8
GM
801}
802
5745a7df
PE
803/* Like putenv, but (1) use the equivalent of xmalloc and (2) the
804 argument is a const pointer. */
805
806void
807xputenv (char const *string)
808{
809 if (putenv ((char *) string) != 0)
810 memory_full (0);
811}
dca7c6a8 812
98c6f1e3
PE
813/* Return a newly allocated memory block of SIZE bytes, remembering
814 to free it when unwinding. */
815void *
816record_xmalloc (size_t size)
817{
818 void *p = xmalloc (size);
27e498e6 819 record_unwind_protect_ptr (xfree, p);
98c6f1e3
PE
820 return p;
821}
822
f61bef8b 823
34400008
GM
824/* Like malloc but used for allocating Lisp data. NBYTES is the
825 number of bytes to allocate, TYPE describes the intended use of the
91af3942 826 allocated memory block (for strings, for conses, ...). */
34400008 827
bfe3e0a2
PE
828#if ! USE_LSB_TAG
829void *lisp_malloc_loser EXTERNALLY_VISIBLE;
212f33f1 830#endif
918a23a7 831
261cb4bb 832static void *
971de7fb 833lisp_malloc (size_t nbytes, enum mem_type type)
c8099634 834{
34400008 835 register void *val;
c8099634 836
dafc79fa 837 MALLOC_BLOCK_INPUT;
877935b1
GM
838
839#ifdef GC_MALLOC_CHECK
840 allocated_mem_type = type;
841#endif
177c0ea7 842
38182d90 843 val = malloc (nbytes);
c8099634 844
bfe3e0a2 845#if ! USE_LSB_TAG
918a23a7
RS
846 /* If the memory just allocated cannot be addressed thru a Lisp
847 object's pointer, and it needs to be,
848 that's equivalent to running out of memory. */
849 if (val && type != MEM_TYPE_NON_LISP)
850 {
851 Lisp_Object tem;
852 XSETCONS (tem, (char *) val + nbytes - 1);
853 if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
854 {
855 lisp_malloc_loser = val;
856 free (val);
857 val = 0;
858 }
859 }
6b61353c 860#endif
918a23a7 861
877935b1 862#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
dca7c6a8 863 if (val && type != MEM_TYPE_NON_LISP)
34400008
GM
864 mem_insert (val, (char *) val + nbytes, type);
865#endif
177c0ea7 866
dafc79fa 867 MALLOC_UNBLOCK_INPUT;
dca7c6a8 868 if (!val && nbytes)
531b0165 869 memory_full (nbytes);
c2d7786e 870 MALLOC_PROBE (nbytes);
c8099634
RS
871 return val;
872}
873
34400008
GM
874/* Free BLOCK. This must be called to free memory allocated with a
875 call to lisp_malloc. */
876
bf952fb6 877static void
261cb4bb 878lisp_free (void *block)
c8099634 879{
dafc79fa 880 MALLOC_BLOCK_INPUT;
c8099634 881 free (block);
877935b1 882#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
34400008
GM
883 mem_delete (mem_find (block));
884#endif
dafc79fa 885 MALLOC_UNBLOCK_INPUT;
c8099634 886}
34400008 887
453b951e
SM
888/***** Allocation of aligned blocks of memory to store Lisp data. *****/
889
890/* The entry point is lisp_align_malloc which returns blocks of at most
891 BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
ab6780cd 892
b4181b01
KS
893#if defined (HAVE_POSIX_MEMALIGN) && defined (SYSTEM_MALLOC)
894#define USE_POSIX_MEMALIGN 1
895#endif
ab6780cd
SM
896
897/* BLOCK_ALIGN has to be a power of 2. */
898#define BLOCK_ALIGN (1 << 10)
ab6780cd
SM
899
900/* Padding to leave at the end of a malloc'd block. This is to give
901 malloc a chance to minimize the amount of memory wasted to alignment.
902 It should be tuned to the particular malloc library used.
19bcad1f
SM
903 On glibc-2.3.2, malloc never tries to align, so a padding of 0 is best.
904 posix_memalign on the other hand would ideally prefer a value of 4
905 because otherwise, there's 1020 bytes wasted between each ablocks.
f501ccb4
SM
906 In Emacs, testing shows that those 1020 can most of the time be
907 efficiently used by malloc to place other objects, so a value of 0 can
908 still preferable unless you have a lot of aligned blocks and virtually
909 nothing else. */
19bcad1f
SM
910#define BLOCK_PADDING 0
911#define BLOCK_BYTES \
0b432f21 912 (BLOCK_ALIGN - sizeof (struct ablocks *) - BLOCK_PADDING)
19bcad1f
SM
913
914/* Internal data structures and constants. */
915
ab6780cd
SM
916#define ABLOCKS_SIZE 16
917
918/* An aligned block of memory. */
919struct ablock
920{
921 union
922 {
923 char payload[BLOCK_BYTES];
924 struct ablock *next_free;
925 } x;
926 /* `abase' is the aligned base of the ablocks. */
927 /* It is overloaded to hold the virtual `busy' field that counts
928 the number of used ablock in the parent ablocks.
929 The first ablock has the `busy' field, the others have the `abase'
930 field. To tell the difference, we assume that pointers will have
931 integer values larger than 2 * ABLOCKS_SIZE. The lowest bit of `busy'
932 is used to tell whether the real base of the parent ablocks is `abase'
933 (if not, the word before the first ablock holds a pointer to the
934 real base). */
935 struct ablocks *abase;
936 /* The padding of all but the last ablock is unused. The padding of
937 the last ablock in an ablocks is not allocated. */
19bcad1f
SM
938#if BLOCK_PADDING
939 char padding[BLOCK_PADDING];
ebb8d410 940#endif
ab6780cd
SM
941};
942
943/* A bunch of consecutive aligned blocks. */
944struct ablocks
945{
946 struct ablock blocks[ABLOCKS_SIZE];
947};
948
4b5afbb0 949/* Size of the block requested from malloc or posix_memalign. */
19bcad1f 950#define ABLOCKS_BYTES (sizeof (struct ablocks) - BLOCK_PADDING)
ab6780cd
SM
951
952#define ABLOCK_ABASE(block) \
d01a7826 953 (((uintptr_t) (block)->abase) <= (1 + 2 * ABLOCKS_SIZE) \
ab6780cd
SM
954 ? (struct ablocks *)(block) \
955 : (block)->abase)
956
957/* Virtual `busy' field. */
958#define ABLOCKS_BUSY(abase) ((abase)->blocks[0].abase)
959
960/* Pointer to the (not necessarily aligned) malloc block. */
349a4500 961#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
962#define ABLOCKS_BASE(abase) (abase)
963#else
ab6780cd 964#define ABLOCKS_BASE(abase) \
d01a7826 965 (1 & (intptr_t) ABLOCKS_BUSY (abase) ? abase : ((void**)abase)[-1])
19bcad1f 966#endif
ab6780cd
SM
967
968/* The list of free ablock. */
969static struct ablock *free_ablock;
970
971/* Allocate an aligned block of nbytes.
972 Alignment is on a multiple of BLOCK_ALIGN and `nbytes' has to be
973 smaller or equal to BLOCK_BYTES. */
261cb4bb 974static void *
971de7fb 975lisp_align_malloc (size_t nbytes, enum mem_type type)
ab6780cd
SM
976{
977 void *base, *val;
978 struct ablocks *abase;
979
980 eassert (nbytes <= BLOCK_BYTES);
981
dafc79fa 982 MALLOC_BLOCK_INPUT;
ab6780cd
SM
983
984#ifdef GC_MALLOC_CHECK
985 allocated_mem_type = type;
986#endif
987
988 if (!free_ablock)
989 {
005ca5c7 990 int i;
d01a7826 991 intptr_t aligned; /* int gets warning casting to 64-bit pointer. */
ab6780cd
SM
992
993#ifdef DOUG_LEA_MALLOC
994 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
995 because mapped region contents are not preserved in
996 a dumped Emacs. */
997 mallopt (M_MMAP_MAX, 0);
998#endif
999
349a4500 1000#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
1001 {
1002 int err = posix_memalign (&base, BLOCK_ALIGN, ABLOCKS_BYTES);
ab349c19
RS
1003 if (err)
1004 base = NULL;
1005 abase = base;
19bcad1f
SM
1006 }
1007#else
ab6780cd
SM
1008 base = malloc (ABLOCKS_BYTES);
1009 abase = ALIGN (base, BLOCK_ALIGN);
ab349c19
RS
1010#endif
1011
6b61353c
KH
1012 if (base == 0)
1013 {
dafc79fa 1014 MALLOC_UNBLOCK_INPUT;
531b0165 1015 memory_full (ABLOCKS_BYTES);
6b61353c 1016 }
ab6780cd
SM
1017
1018 aligned = (base == abase);
1019 if (!aligned)
1020 ((void**)abase)[-1] = base;
1021
1022#ifdef DOUG_LEA_MALLOC
1023 /* Back to a reasonable maximum of mmap'ed areas. */
1024 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1025#endif
1026
bfe3e0a2 1027#if ! USE_LSB_TAG
8f924df7
KH
1028 /* If the memory just allocated cannot be addressed thru a Lisp
1029 object's pointer, and it needs to be, that's equivalent to
1030 running out of memory. */
1031 if (type != MEM_TYPE_NON_LISP)
1032 {
1033 Lisp_Object tem;
1034 char *end = (char *) base + ABLOCKS_BYTES - 1;
1035 XSETCONS (tem, end);
1036 if ((char *) XCONS (tem) != end)
1037 {
1038 lisp_malloc_loser = base;
1039 free (base);
dafc79fa 1040 MALLOC_UNBLOCK_INPUT;
531b0165 1041 memory_full (SIZE_MAX);
8f924df7
KH
1042 }
1043 }
6b61353c 1044#endif
8f924df7 1045
ab6780cd 1046 /* Initialize the blocks and put them on the free list.
453b951e 1047 If `base' was not properly aligned, we can't use the last block. */
ab6780cd
SM
1048 for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
1049 {
1050 abase->blocks[i].abase = abase;
1051 abase->blocks[i].x.next_free = free_ablock;
1052 free_ablock = &abase->blocks[i];
1053 }
8ac068ac 1054 ABLOCKS_BUSY (abase) = (struct ablocks *) aligned;
ab6780cd 1055
d01a7826 1056 eassert (0 == ((uintptr_t) abase) % BLOCK_ALIGN);
ab6780cd
SM
1057 eassert (ABLOCK_ABASE (&abase->blocks[3]) == abase); /* 3 is arbitrary */
1058 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase);
1059 eassert (ABLOCKS_BASE (abase) == base);
d01a7826 1060 eassert (aligned == (intptr_t) ABLOCKS_BUSY (abase));
ab6780cd
SM
1061 }
1062
1063 abase = ABLOCK_ABASE (free_ablock);
8ac068ac 1064 ABLOCKS_BUSY (abase) =
d01a7826 1065 (struct ablocks *) (2 + (intptr_t) ABLOCKS_BUSY (abase));
ab6780cd
SM
1066 val = free_ablock;
1067 free_ablock = free_ablock->x.next_free;
1068
ab6780cd 1069#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
3687c2ef 1070 if (type != MEM_TYPE_NON_LISP)
ab6780cd
SM
1071 mem_insert (val, (char *) val + nbytes, type);
1072#endif
1073
dafc79fa 1074 MALLOC_UNBLOCK_INPUT;
ab6780cd 1075
c2d7786e
TM
1076 MALLOC_PROBE (nbytes);
1077
d01a7826 1078 eassert (0 == ((uintptr_t) val) % BLOCK_ALIGN);
ab6780cd
SM
1079 return val;
1080}
1081
1082static void
261cb4bb 1083lisp_align_free (void *block)
ab6780cd
SM
1084{
1085 struct ablock *ablock = block;
1086 struct ablocks *abase = ABLOCK_ABASE (ablock);
1087
dafc79fa 1088 MALLOC_BLOCK_INPUT;
ab6780cd
SM
1089#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
1090 mem_delete (mem_find (block));
1091#endif
1092 /* Put on free list. */
1093 ablock->x.next_free = free_ablock;
1094 free_ablock = ablock;
1095 /* Update busy count. */
453b951e
SM
1096 ABLOCKS_BUSY (abase)
1097 = (struct ablocks *) (-2 + (intptr_t) ABLOCKS_BUSY (abase));
d2db1c32 1098
d01a7826 1099 if (2 > (intptr_t) ABLOCKS_BUSY (abase))
ab6780cd 1100 { /* All the blocks are free. */
d01a7826 1101 int i = 0, aligned = (intptr_t) ABLOCKS_BUSY (abase);
ab6780cd
SM
1102 struct ablock **tem = &free_ablock;
1103 struct ablock *atop = &abase->blocks[aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1];
1104
1105 while (*tem)
1106 {
1107 if (*tem >= (struct ablock *) abase && *tem < atop)
1108 {
1109 i++;
1110 *tem = (*tem)->x.next_free;
1111 }
1112 else
1113 tem = &(*tem)->x.next_free;
1114 }
1115 eassert ((aligned & 1) == aligned);
1116 eassert (i == (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1));
349a4500 1117#ifdef USE_POSIX_MEMALIGN
d01a7826 1118 eassert ((uintptr_t) ABLOCKS_BASE (abase) % BLOCK_ALIGN == 0);
cfb2f32e 1119#endif
ab6780cd
SM
1120 free (ABLOCKS_BASE (abase));
1121 }
dafc79fa 1122 MALLOC_UNBLOCK_INPUT;
ab6780cd 1123}
3ef06d12 1124
9ac0d9e0 1125\f
2e471eb5
GM
1126/***********************************************************************
1127 Interval Allocation
1128 ***********************************************************************/
1a4f1e2c 1129
34400008
GM
1130/* Number of intervals allocated in an interval_block structure.
1131 The 1020 is 1024 minus malloc overhead. */
1132
d5e35230
JA
1133#define INTERVAL_BLOCK_SIZE \
1134 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
1135
bad98418 1136/* Intervals are allocated in chunks in the form of an interval_block
34400008
GM
1137 structure. */
1138
d5e35230 1139struct interval_block
2e471eb5 1140{
6b61353c 1141 /* Place `intervals' first, to preserve alignment. */
2e471eb5 1142 struct interval intervals[INTERVAL_BLOCK_SIZE];
6b61353c 1143 struct interval_block *next;
2e471eb5 1144};
d5e35230 1145
34400008
GM
1146/* Current interval block. Its `next' pointer points to older
1147 blocks. */
1148
d3d47262 1149static struct interval_block *interval_block;
34400008
GM
1150
1151/* Index in interval_block above of the next unused interval
1152 structure. */
1153
fff62aa9 1154static int interval_block_index = INTERVAL_BLOCK_SIZE;
34400008
GM
1155
1156/* Number of free and live intervals. */
1157
c0c5c8ae 1158static EMACS_INT total_free_intervals, total_intervals;
d5e35230 1159
34400008
GM
1160/* List of free intervals. */
1161
244ed907 1162static INTERVAL interval_free_list;
d5e35230 1163
34400008 1164/* Return a new interval. */
d5e35230
JA
1165
1166INTERVAL
971de7fb 1167make_interval (void)
d5e35230
JA
1168{
1169 INTERVAL val;
1170
dafc79fa 1171 MALLOC_BLOCK_INPUT;
cfb2f32e 1172
d5e35230
JA
1173 if (interval_free_list)
1174 {
1175 val = interval_free_list;
439d5cb4 1176 interval_free_list = INTERVAL_PARENT (interval_free_list);
d5e35230
JA
1177 }
1178 else
1179 {
1180 if (interval_block_index == INTERVAL_BLOCK_SIZE)
1181 {
38182d90
PE
1182 struct interval_block *newi
1183 = lisp_malloc (sizeof *newi, MEM_TYPE_NON_LISP);
d5e35230 1184
d5e35230
JA
1185 newi->next = interval_block;
1186 interval_block = newi;
1187 interval_block_index = 0;
3900d5de 1188 total_free_intervals += INTERVAL_BLOCK_SIZE;
d5e35230
JA
1189 }
1190 val = &interval_block->intervals[interval_block_index++];
1191 }
e2984df0 1192
dafc79fa 1193 MALLOC_UNBLOCK_INPUT;
e2984df0 1194
d5e35230 1195 consing_since_gc += sizeof (struct interval);
310ea200 1196 intervals_consed++;
3900d5de 1197 total_free_intervals--;
d5e35230 1198 RESET_INTERVAL (val);
2336fe58 1199 val->gcmarkbit = 0;
d5e35230
JA
1200 return val;
1201}
1202
34400008 1203
ee28be33 1204/* Mark Lisp objects in interval I. */
d5e35230
JA
1205
1206static void
971de7fb 1207mark_interval (register INTERVAL i, Lisp_Object dummy)
d5e35230 1208{
cce7fefc
DA
1209 /* Intervals should never be shared. So, if extra internal checking is
1210 enabled, GC aborts if it seems to have visited an interval twice. */
1211 eassert (!i->gcmarkbit);
2336fe58 1212 i->gcmarkbit = 1;
49723c04 1213 mark_object (i->plist);
d5e35230
JA
1214}
1215
34400008
GM
1216/* Mark the interval tree rooted in I. */
1217
8707c1e5
DA
1218#define MARK_INTERVAL_TREE(i) \
1219 do { \
1220 if (i && !i->gcmarkbit) \
1221 traverse_intervals_noorder (i, mark_interval, Qnil); \
2e471eb5 1222 } while (0)
77c7bcb1 1223
2e471eb5
GM
1224/***********************************************************************
1225 String Allocation
1226 ***********************************************************************/
1a4f1e2c 1227
2e471eb5
GM
1228/* Lisp_Strings are allocated in string_block structures. When a new
1229 string_block is allocated, all the Lisp_Strings it contains are
e0fead5d 1230 added to a free-list string_free_list. When a new Lisp_String is
2e471eb5
GM
1231 needed, it is taken from that list. During the sweep phase of GC,
1232 string_blocks that are entirely free are freed, except two which
1233 we keep.
7146af97 1234
2e471eb5
GM
1235 String data is allocated from sblock structures. Strings larger
1236 than LARGE_STRING_BYTES, get their own sblock, data for smaller
1237 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
7146af97 1238
2e471eb5
GM
1239 Sblocks consist internally of sdata structures, one for each
1240 Lisp_String. The sdata structure points to the Lisp_String it
1241 belongs to. The Lisp_String points back to the `u.data' member of
1242 its sdata structure.
7146af97 1243
2e471eb5
GM
1244 When a Lisp_String is freed during GC, it is put back on
1245 string_free_list, and its `data' member and its sdata's `string'
1246 pointer is set to null. The size of the string is recorded in the
fbe9e0b9 1247 `n.nbytes' member of the sdata. So, sdata structures that are no
2e471eb5
GM
1248 longer used, can be easily recognized, and it's easy to compact the
1249 sblocks of small strings which we do in compact_small_strings. */
7146af97 1250
2e471eb5
GM
1251/* Size in bytes of an sblock structure used for small strings. This
1252 is 8192 minus malloc overhead. */
7146af97 1253
2e471eb5 1254#define SBLOCK_SIZE 8188
c8099634 1255
2e471eb5
GM
1256/* Strings larger than this are considered large strings. String data
1257 for large strings is allocated from individual sblocks. */
7146af97 1258
2e471eb5
GM
1259#define LARGE_STRING_BYTES 1024
1260
fbe9e0b9 1261/* Struct or union describing string memory sub-allocated from an sblock.
2e471eb5
GM
1262 This is where the contents of Lisp strings are stored. */
1263
fbe9e0b9
PE
1264#ifdef GC_CHECK_STRING_BYTES
1265
1266typedef struct
7146af97 1267{
2e471eb5
GM
1268 /* Back-pointer to the string this sdata belongs to. If null, this
1269 structure is free, and the NBYTES member of the union below
34400008 1270 contains the string's byte size (the same value that STRING_BYTES
2e471eb5
GM
1271 would return if STRING were non-null). If non-null, STRING_BYTES
1272 (STRING) is the size of the data, and DATA contains the string's
1273 contents. */
1274 struct Lisp_String *string;
7146af97 1275
d311d28c 1276 ptrdiff_t nbytes;
fbe9e0b9
PE
1277 unsigned char data[FLEXIBLE_ARRAY_MEMBER];
1278} sdata;
177c0ea7 1279
31d929e5
GM
1280#define SDATA_NBYTES(S) (S)->nbytes
1281#define SDATA_DATA(S) (S)->data
36372bf9 1282#define SDATA_SELECTOR(member) member
177c0ea7 1283
fbe9e0b9 1284#else
31d929e5 1285
fbe9e0b9
PE
1286typedef union
1287{
1288 struct Lisp_String *string;
1289
1290 /* When STRING is non-null. */
1291 struct
2e471eb5 1292 {
fbe9e0b9
PE
1293 struct Lisp_String *string;
1294 unsigned char data[FLEXIBLE_ARRAY_MEMBER];
1295 } u;
2e471eb5 1296
fbe9e0b9
PE
1297 /* When STRING is null. */
1298 struct
1299 {
1300 struct Lisp_String *string;
d311d28c 1301 ptrdiff_t nbytes;
fbe9e0b9
PE
1302 } n;
1303} sdata;
177c0ea7 1304
fbe9e0b9 1305#define SDATA_NBYTES(S) (S)->n.nbytes
31d929e5 1306#define SDATA_DATA(S) (S)->u.data
36372bf9 1307#define SDATA_SELECTOR(member) u.member
31d929e5
GM
1308
1309#endif /* not GC_CHECK_STRING_BYTES */
36372bf9 1310
fbe9e0b9 1311#define SDATA_DATA_OFFSET offsetof (sdata, SDATA_SELECTOR (data))
2e471eb5 1312
31d929e5 1313
2e471eb5
GM
1314/* Structure describing a block of memory which is sub-allocated to
1315 obtain string data memory for strings. Blocks for small strings
1316 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
1317 as large as needed. */
1318
1319struct sblock
7146af97 1320{
2e471eb5
GM
1321 /* Next in list. */
1322 struct sblock *next;
7146af97 1323
2e471eb5
GM
1324 /* Pointer to the next free sdata block. This points past the end
1325 of the sblock if there isn't any space left in this block. */
fbe9e0b9 1326 sdata *next_free;
2e471eb5
GM
1327
1328 /* Start of data. */
fbe9e0b9 1329 sdata first_data;
2e471eb5
GM
1330};
1331
1332/* Number of Lisp strings in a string_block structure. The 1020 is
1333 1024 minus malloc overhead. */
1334
19bcad1f 1335#define STRING_BLOCK_SIZE \
2e471eb5
GM
1336 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
1337
1338/* Structure describing a block from which Lisp_String structures
1339 are allocated. */
1340
1341struct string_block
7146af97 1342{
6b61353c 1343 /* Place `strings' first, to preserve alignment. */
19bcad1f 1344 struct Lisp_String strings[STRING_BLOCK_SIZE];
6b61353c 1345 struct string_block *next;
2e471eb5 1346};
7146af97 1347
2e471eb5
GM
1348/* Head and tail of the list of sblock structures holding Lisp string
1349 data. We always allocate from current_sblock. The NEXT pointers
1350 in the sblock structures go from oldest_sblock to current_sblock. */
3c06d205 1351
2e471eb5 1352static struct sblock *oldest_sblock, *current_sblock;
7146af97 1353
2e471eb5 1354/* List of sblocks for large strings. */
7146af97 1355
2e471eb5 1356static struct sblock *large_sblocks;
7146af97 1357
5a25e253 1358/* List of string_block structures. */
7146af97 1359
2e471eb5 1360static struct string_block *string_blocks;
7146af97 1361
2e471eb5 1362/* Free-list of Lisp_Strings. */
7146af97 1363
2e471eb5 1364static struct Lisp_String *string_free_list;
7146af97 1365
2e471eb5 1366/* Number of live and free Lisp_Strings. */
c8099634 1367
c0c5c8ae 1368static EMACS_INT total_strings, total_free_strings;
7146af97 1369
2e471eb5
GM
1370/* Number of bytes used by live strings. */
1371
3ab6e069 1372static EMACS_INT total_string_bytes;
2e471eb5
GM
1373
1374/* Given a pointer to a Lisp_String S which is on the free-list
1375 string_free_list, return a pointer to its successor in the
1376 free-list. */
1377
1378#define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
1379
1380/* Return a pointer to the sdata structure belonging to Lisp string S.
1381 S must be live, i.e. S->data must not be null. S->data is actually
1382 a pointer to the `u.data' member of its sdata structure; the
1383 structure starts at a constant offset in front of that. */
177c0ea7 1384
fbe9e0b9 1385#define SDATA_OF_STRING(S) ((sdata *) ((S)->data - SDATA_DATA_OFFSET))
31d929e5 1386
212f33f1
KS
1387
1388#ifdef GC_CHECK_STRING_OVERRUN
bdbed949
KS
1389
1390/* We check for overrun in string data blocks by appending a small
1391 "cookie" after each allocated string data block, and check for the
8349069c 1392 presence of this cookie during GC. */
bdbed949
KS
1393
1394#define GC_STRING_OVERRUN_COOKIE_SIZE 4
bfd1c781
PE
1395static char const string_overrun_cookie[GC_STRING_OVERRUN_COOKIE_SIZE] =
1396 { '\xde', '\xad', '\xbe', '\xef' };
bdbed949 1397
212f33f1 1398#else
bdbed949 1399#define GC_STRING_OVERRUN_COOKIE_SIZE 0
212f33f1
KS
1400#endif
1401
2e471eb5
GM
1402/* Value is the size of an sdata structure large enough to hold NBYTES
1403 bytes of string data. The value returned includes a terminating
1404 NUL byte, the size of the sdata structure, and padding. */
1405
31d929e5
GM
1406#ifdef GC_CHECK_STRING_BYTES
1407
2e471eb5 1408#define SDATA_SIZE(NBYTES) \
36372bf9 1409 ((SDATA_DATA_OFFSET \
2e471eb5 1410 + (NBYTES) + 1 \
d311d28c
PE
1411 + sizeof (ptrdiff_t) - 1) \
1412 & ~(sizeof (ptrdiff_t) - 1))
2e471eb5 1413
31d929e5
GM
1414#else /* not GC_CHECK_STRING_BYTES */
1415
f2d3008d
PE
1416/* The 'max' reserves space for the nbytes union member even when NBYTES + 1 is
1417 less than the size of that member. The 'max' is not needed when
d311d28c 1418 SDATA_DATA_OFFSET is a multiple of sizeof (ptrdiff_t), because then the
f2d3008d
PE
1419 alignment code reserves enough space. */
1420
1421#define SDATA_SIZE(NBYTES) \
1422 ((SDATA_DATA_OFFSET \
d311d28c 1423 + (SDATA_DATA_OFFSET % sizeof (ptrdiff_t) == 0 \
f2d3008d 1424 ? NBYTES \
d311d28c 1425 : max (NBYTES, sizeof (ptrdiff_t) - 1)) \
f2d3008d 1426 + 1 \
d311d28c
PE
1427 + sizeof (ptrdiff_t) - 1) \
1428 & ~(sizeof (ptrdiff_t) - 1))
31d929e5
GM
1429
1430#endif /* not GC_CHECK_STRING_BYTES */
2e471eb5 1431
bdbed949
KS
1432/* Extra bytes to allocate for each string. */
1433
1434#define GC_STRING_EXTRA (GC_STRING_OVERRUN_COOKIE_SIZE)
1435
c9d624c6
PE
1436/* Exact bound on the number of bytes in a string, not counting the
1437 terminating null. A string cannot contain more bytes than
1438 STRING_BYTES_BOUND, nor can it be so long that the size_t
1439 arithmetic in allocate_string_data would overflow while it is
1440 calculating a value to be passed to malloc. */
03a660a6
PE
1441static ptrdiff_t const STRING_BYTES_MAX =
1442 min (STRING_BYTES_BOUND,
1443 ((SIZE_MAX - XMALLOC_OVERRUN_CHECK_OVERHEAD
1444 - GC_STRING_EXTRA
1445 - offsetof (struct sblock, first_data)
1446 - SDATA_DATA_OFFSET)
1447 & ~(sizeof (EMACS_INT) - 1)));
c9d624c6 1448
2e471eb5 1449/* Initialize string allocation. Called from init_alloc_once. */
d457598b 1450
d3d47262 1451static void
971de7fb 1452init_strings (void)
7146af97 1453{
4d774b0f
JB
1454 empty_unibyte_string = make_pure_string ("", 0, 0, 0);
1455 empty_multibyte_string = make_pure_string ("", 0, 0, 1);
7146af97
JB
1456}
1457
2e471eb5 1458
361b097f
GM
1459#ifdef GC_CHECK_STRING_BYTES
1460
361b097f
GM
1461static int check_string_bytes_count;
1462
e499d0ee
DA
1463/* Like STRING_BYTES, but with debugging check. Can be
1464 called during GC, so pay attention to the mark bit. */
676a7251 1465
d311d28c 1466ptrdiff_t
14162469 1467string_bytes (struct Lisp_String *s)
676a7251 1468{
d311d28c 1469 ptrdiff_t nbytes =
14162469
EZ
1470 (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte);
1471
676a7251
GM
1472 if (!PURE_POINTER_P (s)
1473 && s->data
1474 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1088b922 1475 emacs_abort ();
676a7251
GM
1476 return nbytes;
1477}
177c0ea7 1478
2c5bd608 1479/* Check validity of Lisp strings' string_bytes member in B. */
676a7251 1480
d3d47262 1481static void
d0f4e1f5 1482check_sblock (struct sblock *b)
361b097f 1483{
fbe9e0b9 1484 sdata *from, *end, *from_end;
177c0ea7 1485
676a7251 1486 end = b->next_free;
177c0ea7 1487
676a7251 1488 for (from = &b->first_data; from < end; from = from_end)
361b097f 1489 {
676a7251
GM
1490 /* Compute the next FROM here because copying below may
1491 overwrite data we need to compute it. */
d311d28c 1492 ptrdiff_t nbytes;
177c0ea7 1493
676a7251 1494 /* Check that the string size recorded in the string is the
ee28be33 1495 same as the one recorded in the sdata structure. */
e499d0ee
DA
1496 nbytes = SDATA_SIZE (from->string ? string_bytes (from->string)
1497 : SDATA_NBYTES (from));
fbe9e0b9 1498 from_end = (sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
676a7251
GM
1499 }
1500}
361b097f 1501
676a7251
GM
1502
1503/* Check validity of Lisp strings' string_bytes member. ALL_P
fce31d69 1504 means check all strings, otherwise check only most
676a7251
GM
1505 recently allocated strings. Used for hunting a bug. */
1506
d3d47262 1507static void
fce31d69 1508check_string_bytes (bool all_p)
676a7251
GM
1509{
1510 if (all_p)
1511 {
1512 struct sblock *b;
1513
1514 for (b = large_sblocks; b; b = b->next)
1515 {
1516 struct Lisp_String *s = b->first_data.string;
1517 if (s)
e499d0ee 1518 string_bytes (s);
361b097f 1519 }
177c0ea7 1520
676a7251
GM
1521 for (b = oldest_sblock; b; b = b->next)
1522 check_sblock (b);
361b097f 1523 }
296094c3 1524 else if (current_sblock)
676a7251 1525 check_sblock (current_sblock);
361b097f
GM
1526}
1527
e499d0ee
DA
1528#else /* not GC_CHECK_STRING_BYTES */
1529
1530#define check_string_bytes(all) ((void) 0)
1531
361b097f
GM
1532#endif /* GC_CHECK_STRING_BYTES */
1533
212f33f1
KS
1534#ifdef GC_CHECK_STRING_FREE_LIST
1535
bdbed949
KS
1536/* Walk through the string free list looking for bogus next pointers.
1537 This may catch buffer overrun from a previous string. */
1538
212f33f1 1539static void
d0f4e1f5 1540check_string_free_list (void)
212f33f1
KS
1541{
1542 struct Lisp_String *s;
1543
1544 /* Pop a Lisp_String off the free-list. */
1545 s = string_free_list;
1546 while (s != NULL)
1547 {
d01a7826 1548 if ((uintptr_t) s < 1024)
1088b922 1549 emacs_abort ();
212f33f1
KS
1550 s = NEXT_FREE_LISP_STRING (s);
1551 }
1552}
1553#else
1554#define check_string_free_list()
1555#endif
361b097f 1556
2e471eb5
GM
1557/* Return a new Lisp_String. */
1558
1559static struct Lisp_String *
971de7fb 1560allocate_string (void)
7146af97 1561{
2e471eb5 1562 struct Lisp_String *s;
7146af97 1563
dafc79fa 1564 MALLOC_BLOCK_INPUT;
cfb2f32e 1565
2e471eb5
GM
1566 /* If the free-list is empty, allocate a new string_block, and
1567 add all the Lisp_Strings in it to the free-list. */
1568 if (string_free_list == NULL)
7146af97 1569 {
38182d90 1570 struct string_block *b = lisp_malloc (sizeof *b, MEM_TYPE_STRING);
2e471eb5
GM
1571 int i;
1572
2e471eb5
GM
1573 b->next = string_blocks;
1574 string_blocks = b;
2e471eb5 1575
19bcad1f 1576 for (i = STRING_BLOCK_SIZE - 1; i >= 0; --i)
7146af97 1577 {
2e471eb5 1578 s = b->strings + i;
3fe6dd74
DA
1579 /* Every string on a free list should have NULL data pointer. */
1580 s->data = NULL;
2e471eb5
GM
1581 NEXT_FREE_LISP_STRING (s) = string_free_list;
1582 string_free_list = s;
7146af97 1583 }
2e471eb5 1584
19bcad1f 1585 total_free_strings += STRING_BLOCK_SIZE;
7146af97 1586 }
c0f51373 1587
bdbed949 1588 check_string_free_list ();
212f33f1 1589
2e471eb5
GM
1590 /* Pop a Lisp_String off the free-list. */
1591 s = string_free_list;
1592 string_free_list = NEXT_FREE_LISP_STRING (s);
c0f51373 1593
dafc79fa 1594 MALLOC_UNBLOCK_INPUT;
e2984df0 1595
2e471eb5
GM
1596 --total_free_strings;
1597 ++total_strings;
1598 ++strings_consed;
1599 consing_since_gc += sizeof *s;
c0f51373 1600
361b097f 1601#ifdef GC_CHECK_STRING_BYTES
e39a993c 1602 if (!noninteractive)
361b097f 1603 {
676a7251
GM
1604 if (++check_string_bytes_count == 200)
1605 {
1606 check_string_bytes_count = 0;
1607 check_string_bytes (1);
1608 }
1609 else
1610 check_string_bytes (0);
361b097f 1611 }
676a7251 1612#endif /* GC_CHECK_STRING_BYTES */
361b097f 1613
2e471eb5 1614 return s;
c0f51373 1615}
7146af97 1616
7146af97 1617
2e471eb5
GM
1618/* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
1619 plus a NUL byte at the end. Allocate an sdata structure for S, and
1620 set S->data to its `u.data' member. Store a NUL byte at the end of
1621 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
1622 S->data if it was initially non-null. */
7146af97 1623
2e471eb5 1624void
413d18e7
EZ
1625allocate_string_data (struct Lisp_String *s,
1626 EMACS_INT nchars, EMACS_INT nbytes)
7146af97 1627{
fbe9e0b9 1628 sdata *data, *old_data;
2e471eb5 1629 struct sblock *b;
b7ffe040 1630 ptrdiff_t needed, old_nbytes;
7146af97 1631
c9d624c6
PE
1632 if (STRING_BYTES_MAX < nbytes)
1633 string_overflow ();
1634
2e471eb5
GM
1635 /* Determine the number of bytes needed to store NBYTES bytes
1636 of string data. */
1637 needed = SDATA_SIZE (nbytes);
b7ffe040
DA
1638 if (s->data)
1639 {
1640 old_data = SDATA_OF_STRING (s);
e499d0ee 1641 old_nbytes = STRING_BYTES (s);
b7ffe040
DA
1642 }
1643 else
1644 old_data = NULL;
e2984df0 1645
dafc79fa 1646 MALLOC_BLOCK_INPUT;
7146af97 1647
2e471eb5
GM
1648 if (nbytes > LARGE_STRING_BYTES)
1649 {
36372bf9 1650 size_t size = offsetof (struct sblock, first_data) + needed;
2e471eb5
GM
1651
1652#ifdef DOUG_LEA_MALLOC
f8608968
GM
1653 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
1654 because mapped region contents are not preserved in
d36b182f
DL
1655 a dumped Emacs.
1656
1657 In case you think of allowing it in a dumped Emacs at the
1658 cost of not being able to re-dump, there's another reason:
1659 mmap'ed data typically have an address towards the top of the
1660 address space, which won't fit into an EMACS_INT (at least on
1661 32-bit systems with the current tagging scheme). --fx */
2e471eb5
GM
1662 mallopt (M_MMAP_MAX, 0);
1663#endif
1664
38182d90 1665 b = lisp_malloc (size + GC_STRING_EXTRA, MEM_TYPE_NON_LISP);
177c0ea7 1666
2e471eb5 1667#ifdef DOUG_LEA_MALLOC
b09cca6a 1668 /* Back to a reasonable maximum of mmap'ed areas. */
2e471eb5
GM
1669 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1670#endif
177c0ea7 1671
2e471eb5
GM
1672 b->next_free = &b->first_data;
1673 b->first_data.string = NULL;
1674 b->next = large_sblocks;
1675 large_sblocks = b;
1676 }
1677 else if (current_sblock == NULL
1678 || (((char *) current_sblock + SBLOCK_SIZE
1679 - (char *) current_sblock->next_free)
212f33f1 1680 < (needed + GC_STRING_EXTRA)))
2e471eb5
GM
1681 {
1682 /* Not enough room in the current sblock. */
38182d90 1683 b = lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP);
2e471eb5
GM
1684 b->next_free = &b->first_data;
1685 b->first_data.string = NULL;
1686 b->next = NULL;
1687
1688 if (current_sblock)
1689 current_sblock->next = b;
1690 else
1691 oldest_sblock = b;
1692 current_sblock = b;
1693 }
1694 else
1695 b = current_sblock;
5c5fecb3 1696
2e471eb5 1697 data = b->next_free;
fbe9e0b9 1698 b->next_free = (sdata *) ((char *) data + needed + GC_STRING_EXTRA);
a0b08700 1699
dafc79fa 1700 MALLOC_UNBLOCK_INPUT;
e2984df0 1701
2e471eb5 1702 data->string = s;
31d929e5
GM
1703 s->data = SDATA_DATA (data);
1704#ifdef GC_CHECK_STRING_BYTES
1705 SDATA_NBYTES (data) = nbytes;
1706#endif
2e471eb5
GM
1707 s->size = nchars;
1708 s->size_byte = nbytes;
1709 s->data[nbytes] = '\0';
212f33f1 1710#ifdef GC_CHECK_STRING_OVERRUN
000098c1
PE
1711 memcpy ((char *) data + needed, string_overrun_cookie,
1712 GC_STRING_OVERRUN_COOKIE_SIZE);
212f33f1 1713#endif
b7ffe040
DA
1714
1715 /* Note that Faset may call to this function when S has already data
1716 assigned. In this case, mark data as free by setting it's string
1717 back-pointer to null, and record the size of the data in it. */
1718 if (old_data)
1719 {
1720 SDATA_NBYTES (old_data) = old_nbytes;
1721 old_data->string = NULL;
1722 }
1723
2e471eb5
GM
1724 consing_since_gc += needed;
1725}
1726
1727
1728/* Sweep and compact strings. */
1729
1730static void
971de7fb 1731sweep_strings (void)
2e471eb5
GM
1732{
1733 struct string_block *b, *next;
1734 struct string_block *live_blocks = NULL;
177c0ea7 1735
2e471eb5
GM
1736 string_free_list = NULL;
1737 total_strings = total_free_strings = 0;
3ab6e069 1738 total_string_bytes = 0;
2e471eb5
GM
1739
1740 /* Scan strings_blocks, free Lisp_Strings that aren't marked. */
1741 for (b = string_blocks; b; b = next)
1742 {
1743 int i, nfree = 0;
1744 struct Lisp_String *free_list_before = string_free_list;
1745
1746 next = b->next;
1747
19bcad1f 1748 for (i = 0; i < STRING_BLOCK_SIZE; ++i)
2e471eb5
GM
1749 {
1750 struct Lisp_String *s = b->strings + i;
1751
1752 if (s->data)
1753 {
1754 /* String was not on free-list before. */
1755 if (STRING_MARKED_P (s))
1756 {
1757 /* String is live; unmark it and its intervals. */
1758 UNMARK_STRING (s);
177c0ea7 1759
8707c1e5
DA
1760 /* Do not use string_(set|get)_intervals here. */
1761 s->intervals = balance_intervals (s->intervals);
2e471eb5
GM
1762
1763 ++total_strings;
3ab6e069 1764 total_string_bytes += STRING_BYTES (s);
2e471eb5
GM
1765 }
1766 else
1767 {
1768 /* String is dead. Put it on the free-list. */
fbe9e0b9 1769 sdata *data = SDATA_OF_STRING (s);
2e471eb5
GM
1770
1771 /* Save the size of S in its sdata so that we know
1772 how large that is. Reset the sdata's string
1773 back-pointer so that we know it's free. */
31d929e5 1774#ifdef GC_CHECK_STRING_BYTES
e499d0ee 1775 if (string_bytes (s) != SDATA_NBYTES (data))
1088b922 1776 emacs_abort ();
31d929e5 1777#else
fbe9e0b9 1778 data->n.nbytes = STRING_BYTES (s);
31d929e5 1779#endif
2e471eb5
GM
1780 data->string = NULL;
1781
1782 /* Reset the strings's `data' member so that we
1783 know it's free. */
1784 s->data = NULL;
1785
1786 /* Put the string on the free-list. */
1787 NEXT_FREE_LISP_STRING (s) = string_free_list;
1788 string_free_list = s;
1789 ++nfree;
1790 }
1791 }
1792 else
1793 {
1794 /* S was on the free-list before. Put it there again. */
1795 NEXT_FREE_LISP_STRING (s) = string_free_list;
1796 string_free_list = s;
1797 ++nfree;
1798 }
1799 }
1800
34400008 1801 /* Free blocks that contain free Lisp_Strings only, except
2e471eb5 1802 the first two of them. */
19bcad1f
SM
1803 if (nfree == STRING_BLOCK_SIZE
1804 && total_free_strings > STRING_BLOCK_SIZE)
2e471eb5
GM
1805 {
1806 lisp_free (b);
2e471eb5
GM
1807 string_free_list = free_list_before;
1808 }
1809 else
1810 {
1811 total_free_strings += nfree;
1812 b->next = live_blocks;
1813 live_blocks = b;
1814 }
1815 }
1816
bdbed949 1817 check_string_free_list ();
212f33f1 1818
2e471eb5
GM
1819 string_blocks = live_blocks;
1820 free_large_strings ();
1821 compact_small_strings ();
212f33f1 1822
bdbed949 1823 check_string_free_list ();
2e471eb5
GM
1824}
1825
1826
1827/* Free dead large strings. */
1828
1829static void
971de7fb 1830free_large_strings (void)
2e471eb5
GM
1831{
1832 struct sblock *b, *next;
1833 struct sblock *live_blocks = NULL;
177c0ea7 1834
2e471eb5
GM
1835 for (b = large_sblocks; b; b = next)
1836 {
1837 next = b->next;
1838
1839 if (b->first_data.string == NULL)
1840 lisp_free (b);
1841 else
1842 {
1843 b->next = live_blocks;
1844 live_blocks = b;
1845 }
1846 }
1847
1848 large_sblocks = live_blocks;
1849}
1850
1851
1852/* Compact data of small strings. Free sblocks that don't contain
1853 data of live strings after compaction. */
1854
1855static void
971de7fb 1856compact_small_strings (void)
2e471eb5
GM
1857{
1858 struct sblock *b, *tb, *next;
fbe9e0b9
PE
1859 sdata *from, *to, *end, *tb_end;
1860 sdata *to_end, *from_end;
2e471eb5
GM
1861
1862 /* TB is the sblock we copy to, TO is the sdata within TB we copy
1863 to, and TB_END is the end of TB. */
1864 tb = oldest_sblock;
fbe9e0b9 1865 tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
2e471eb5
GM
1866 to = &tb->first_data;
1867
1868 /* Step through the blocks from the oldest to the youngest. We
1869 expect that old blocks will stabilize over time, so that less
1870 copying will happen this way. */
1871 for (b = oldest_sblock; b; b = b->next)
1872 {
1873 end = b->next_free;
a54e2c05 1874 eassert ((char *) end <= (char *) b + SBLOCK_SIZE);
177c0ea7 1875
2e471eb5
GM
1876 for (from = &b->first_data; from < end; from = from_end)
1877 {
1878 /* Compute the next FROM here because copying below may
1879 overwrite data we need to compute it. */
d311d28c 1880 ptrdiff_t nbytes;
e499d0ee 1881 struct Lisp_String *s = from->string;
2e471eb5 1882
31d929e5
GM
1883#ifdef GC_CHECK_STRING_BYTES
1884 /* Check that the string size recorded in the string is the
b09cca6a 1885 same as the one recorded in the sdata structure. */
e499d0ee 1886 if (s && string_bytes (s) != SDATA_NBYTES (from))
1088b922 1887 emacs_abort ();
31d929e5 1888#endif /* GC_CHECK_STRING_BYTES */
177c0ea7 1889
e499d0ee
DA
1890 nbytes = s ? STRING_BYTES (s) : SDATA_NBYTES (from);
1891 eassert (nbytes <= LARGE_STRING_BYTES);
212f33f1 1892
2e471eb5 1893 nbytes = SDATA_SIZE (nbytes);
fbe9e0b9 1894 from_end = (sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
212f33f1
KS
1895
1896#ifdef GC_CHECK_STRING_OVERRUN
72af86bd
AS
1897 if (memcmp (string_overrun_cookie,
1898 (char *) from_end - GC_STRING_OVERRUN_COOKIE_SIZE,
1899 GC_STRING_OVERRUN_COOKIE_SIZE))
1088b922 1900 emacs_abort ();
212f33f1 1901#endif
177c0ea7 1902
e499d0ee
DA
1903 /* Non-NULL S means it's alive. Copy its data. */
1904 if (s)
2e471eb5
GM
1905 {
1906 /* If TB is full, proceed with the next sblock. */
fbe9e0b9 1907 to_end = (sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5
GM
1908 if (to_end > tb_end)
1909 {
1910 tb->next_free = to;
1911 tb = tb->next;
fbe9e0b9 1912 tb_end = (sdata *) ((char *) tb + SBLOCK_SIZE);
2e471eb5 1913 to = &tb->first_data;
fbe9e0b9 1914 to_end = (sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5 1915 }
177c0ea7 1916
2e471eb5
GM
1917 /* Copy, and update the string's `data' pointer. */
1918 if (from != to)
1919 {
a54e2c05 1920 eassert (tb != b || to < from);
72af86bd 1921 memmove (to, from, nbytes + GC_STRING_EXTRA);
31d929e5 1922 to->string->data = SDATA_DATA (to);
2e471eb5
GM
1923 }
1924
1925 /* Advance past the sdata we copied to. */
1926 to = to_end;
1927 }
1928 }
1929 }
1930
1931 /* The rest of the sblocks following TB don't contain live data, so
1932 we can free them. */
1933 for (b = tb->next; b; b = next)
1934 {
1935 next = b->next;
1936 lisp_free (b);
1937 }
1938
1939 tb->next_free = to;
1940 tb->next = NULL;
1941 current_sblock = tb;
1942}
1943
cb93f9be
PE
1944void
1945string_overflow (void)
1946{
1947 error ("Maximum string size exceeded");
1948}
2e471eb5 1949
a7ca3326 1950DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
69623621
RS
1951 doc: /* Return a newly created string of length LENGTH, with INIT in each element.
1952LENGTH must be an integer.
1953INIT must be an integer that represents a character. */)
5842a27b 1954 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
1955{
1956 register Lisp_Object val;
1957 register unsigned char *p, *end;
14162469
EZ
1958 int c;
1959 EMACS_INT nbytes;
2e471eb5 1960
b7826503 1961 CHECK_NATNUM (length);
2bccce07 1962 CHECK_CHARACTER (init);
2e471eb5 1963
2bccce07 1964 c = XFASTINT (init);
830ff83b 1965 if (ASCII_CHAR_P (c))
2e471eb5
GM
1966 {
1967 nbytes = XINT (length);
1968 val = make_uninit_string (nbytes);
d5db4077
KR
1969 p = SDATA (val);
1970 end = p + SCHARS (val);
2e471eb5
GM
1971 while (p != end)
1972 *p++ = c;
1973 }
1974 else
1975 {
d942b71c 1976 unsigned char str[MAX_MULTIBYTE_LENGTH];
2e471eb5 1977 int len = CHAR_STRING (c, str);
14162469 1978 EMACS_INT string_len = XINT (length);
2e471eb5 1979
d1f3d2af 1980 if (string_len > STRING_BYTES_MAX / len)
cb93f9be 1981 string_overflow ();
14162469
EZ
1982 nbytes = len * string_len;
1983 val = make_uninit_multibyte_string (string_len, nbytes);
d5db4077 1984 p = SDATA (val);
2e471eb5
GM
1985 end = p + nbytes;
1986 while (p != end)
1987 {
72af86bd 1988 memcpy (p, str, len);
2e471eb5
GM
1989 p += len;
1990 }
1991 }
177c0ea7 1992
2e471eb5
GM
1993 *p = 0;
1994 return val;
1995}
1996
1997
a7ca3326 1998DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
909e3b33 1999 doc: /* Return a new bool-vector of length LENGTH, using INIT for each element.
7ee72033 2000LENGTH must be a number. INIT matters only in whether it is t or nil. */)
5842a27b 2001 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2002{
2003 register Lisp_Object val;
2004 struct Lisp_Bool_Vector *p;
d311d28c
PE
2005 ptrdiff_t length_in_chars;
2006 EMACS_INT length_in_elts;
14162469 2007 int bits_per_value;
d06714cb
PE
2008 int extra_bool_elts = ((bool_header_size - header_size + word_size - 1)
2009 / word_size);
2e471eb5 2010
b7826503 2011 CHECK_NATNUM (length);
2e471eb5 2012
a097329f 2013 bits_per_value = sizeof (EMACS_INT) * BOOL_VECTOR_BITS_PER_CHAR;
2e471eb5
GM
2014
2015 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
2e471eb5 2016
d06714cb 2017 val = Fmake_vector (make_number (length_in_elts + extra_bool_elts), Qnil);
177c0ea7 2018
eab3844f 2019 /* No Lisp_Object to trace in there. */
914adc42 2020 XSETPVECTYPESIZE (XVECTOR (val), PVEC_BOOL_VECTOR, 0, 0);
d2029e5b
SM
2021
2022 p = XBOOL_VECTOR (val);
2e471eb5 2023 p->size = XFASTINT (length);
177c0ea7 2024
d311d28c
PE
2025 length_in_chars = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
2026 / BOOL_VECTOR_BITS_PER_CHAR);
c0c1ee9f
PE
2027 if (length_in_chars)
2028 {
2029 memset (p->data, ! NILP (init) ? -1 : 0, length_in_chars);
177c0ea7 2030
c0c1ee9f
PE
2031 /* Clear any extraneous bits in the last byte. */
2032 p->data[length_in_chars - 1]
83713154 2033 &= (1 << ((XFASTINT (length) - 1) % BOOL_VECTOR_BITS_PER_CHAR + 1)) - 1;
c0c1ee9f 2034 }
2e471eb5
GM
2035
2036 return val;
2037}
2038
2039
2040/* Make a string from NBYTES bytes at CONTENTS, and compute the number
2041 of characters from the contents. This string may be unibyte or
2042 multibyte, depending on the contents. */
2043
2044Lisp_Object
d311d28c 2045make_string (const char *contents, ptrdiff_t nbytes)
2e471eb5
GM
2046{
2047 register Lisp_Object val;
d311d28c 2048 ptrdiff_t nchars, multibyte_nbytes;
9eac9d59 2049
90256841
PE
2050 parse_str_as_multibyte ((const unsigned char *) contents, nbytes,
2051 &nchars, &multibyte_nbytes);
9eac9d59
KH
2052 if (nbytes == nchars || nbytes != multibyte_nbytes)
2053 /* CONTENTS contains no multibyte sequences or contains an invalid
2054 multibyte sequence. We must make unibyte string. */
495a6df3
KH
2055 val = make_unibyte_string (contents, nbytes);
2056 else
2057 val = make_multibyte_string (contents, nchars, nbytes);
2e471eb5
GM
2058 return val;
2059}
2060
2061
2062/* Make an unibyte string from LENGTH bytes at CONTENTS. */
2063
2064Lisp_Object
d311d28c 2065make_unibyte_string (const char *contents, ptrdiff_t length)
2e471eb5
GM
2066{
2067 register Lisp_Object val;
2068 val = make_uninit_string (length);
72af86bd 2069 memcpy (SDATA (val), contents, length);
2e471eb5
GM
2070 return val;
2071}
2072
2073
2074/* Make a multibyte string from NCHARS characters occupying NBYTES
2075 bytes at CONTENTS. */
2076
2077Lisp_Object
14162469 2078make_multibyte_string (const char *contents,
d311d28c 2079 ptrdiff_t nchars, ptrdiff_t nbytes)
2e471eb5
GM
2080{
2081 register Lisp_Object val;
2082 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2083 memcpy (SDATA (val), contents, nbytes);
2e471eb5
GM
2084 return val;
2085}
2086
2087
2088/* Make a string from NCHARS characters occupying NBYTES bytes at
2089 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
2090
2091Lisp_Object
14162469 2092make_string_from_bytes (const char *contents,
d311d28c 2093 ptrdiff_t nchars, ptrdiff_t nbytes)
2e471eb5
GM
2094{
2095 register Lisp_Object val;
2096 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2097 memcpy (SDATA (val), contents, nbytes);
d5db4077
KR
2098 if (SBYTES (val) == SCHARS (val))
2099 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2100 return val;
2101}
2102
2103
2104/* Make a string from NCHARS characters occupying NBYTES bytes at
2105 CONTENTS. The argument MULTIBYTE controls whether to label the
229b28c4
KH
2106 string as multibyte. If NCHARS is negative, it counts the number of
2107 characters by itself. */
2e471eb5
GM
2108
2109Lisp_Object
14162469 2110make_specified_string (const char *contents,
fce31d69 2111 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
2e471eb5 2112{
fce31d69 2113 Lisp_Object val;
229b28c4
KH
2114
2115 if (nchars < 0)
2116 {
2117 if (multibyte)
90256841
PE
2118 nchars = multibyte_chars_in_text ((const unsigned char *) contents,
2119 nbytes);
229b28c4
KH
2120 else
2121 nchars = nbytes;
2122 }
2e471eb5 2123 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2124 memcpy (SDATA (val), contents, nbytes);
2e471eb5 2125 if (!multibyte)
d5db4077 2126 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2127 return val;
2128}
2129
2130
2e471eb5
GM
2131/* Return an unibyte Lisp_String set up to hold LENGTH characters
2132 occupying LENGTH bytes. */
2133
2134Lisp_Object
413d18e7 2135make_uninit_string (EMACS_INT length)
2e471eb5
GM
2136{
2137 Lisp_Object val;
4d774b0f
JB
2138
2139 if (!length)
2140 return empty_unibyte_string;
2e471eb5 2141 val = make_uninit_multibyte_string (length, length);
d5db4077 2142 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2143 return val;
2144}
2145
2146
2147/* Return a multibyte Lisp_String set up to hold NCHARS characters
2148 which occupy NBYTES bytes. */
2149
2150Lisp_Object
413d18e7 2151make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
2e471eb5
GM
2152{
2153 Lisp_Object string;
2154 struct Lisp_String *s;
2155
2156 if (nchars < 0)
1088b922 2157 emacs_abort ();
4d774b0f
JB
2158 if (!nbytes)
2159 return empty_multibyte_string;
2e471eb5
GM
2160
2161 s = allocate_string ();
77c7bcb1 2162 s->intervals = NULL;
2e471eb5
GM
2163 allocate_string_data (s, nchars, nbytes);
2164 XSETSTRING (string, s);
2165 string_chars_consed += nbytes;
2166 return string;
2167}
2168
a8290ec3
DA
2169/* Print arguments to BUF according to a FORMAT, then return
2170 a Lisp_String initialized with the data from BUF. */
2171
2172Lisp_Object
2173make_formatted_string (char *buf, const char *format, ...)
2174{
2175 va_list ap;
26bccfae 2176 int length;
a8290ec3
DA
2177
2178 va_start (ap, format);
2179 length = vsprintf (buf, format, ap);
2180 va_end (ap);
2181 return make_string (buf, length);
2182}
2e471eb5
GM
2183
2184\f
2185/***********************************************************************
2186 Float Allocation
2187 ***********************************************************************/
2188
2e471eb5
GM
2189/* We store float cells inside of float_blocks, allocating a new
2190 float_block with malloc whenever necessary. Float cells reclaimed
2191 by GC are put on a free list to be reallocated before allocating
ab6780cd 2192 any new float cells from the latest float_block. */
2e471eb5 2193
6b61353c
KH
2194#define FLOAT_BLOCK_SIZE \
2195 (((BLOCK_BYTES - sizeof (struct float_block *) \
2196 /* The compiler might add padding at the end. */ \
2197 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
ab6780cd
SM
2198 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2199
2200#define GETMARKBIT(block,n) \
5e617bc2
JB
2201 (((block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2202 >> ((n) % (sizeof (int) * CHAR_BIT))) \
ab6780cd
SM
2203 & 1)
2204
2205#define SETMARKBIT(block,n) \
5e617bc2
JB
2206 (block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2207 |= 1 << ((n) % (sizeof (int) * CHAR_BIT))
ab6780cd
SM
2208
2209#define UNSETMARKBIT(block,n) \
5e617bc2
JB
2210 (block)->gcmarkbits[(n) / (sizeof (int) * CHAR_BIT)] \
2211 &= ~(1 << ((n) % (sizeof (int) * CHAR_BIT)))
ab6780cd
SM
2212
2213#define FLOAT_BLOCK(fptr) \
d01a7826 2214 ((struct float_block *) (((uintptr_t) (fptr)) & ~(BLOCK_ALIGN - 1)))
ab6780cd
SM
2215
2216#define FLOAT_INDEX(fptr) \
d01a7826 2217 ((((uintptr_t) (fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float))
2e471eb5
GM
2218
2219struct float_block
2220{
ab6780cd 2221 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */
2e471eb5 2222 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
5e617bc2 2223 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof (int) * CHAR_BIT)];
ab6780cd 2224 struct float_block *next;
2e471eb5
GM
2225};
2226
ab6780cd
SM
2227#define FLOAT_MARKED_P(fptr) \
2228 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2229
2230#define FLOAT_MARK(fptr) \
2231 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2232
2233#define FLOAT_UNMARK(fptr) \
2234 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2235
34400008
GM
2236/* Current float_block. */
2237
244ed907 2238static struct float_block *float_block;
34400008
GM
2239
2240/* Index of first unused Lisp_Float in the current float_block. */
2241
fff62aa9 2242static int float_block_index = FLOAT_BLOCK_SIZE;
2e471eb5 2243
34400008
GM
2244/* Free-list of Lisp_Floats. */
2245
244ed907 2246static struct Lisp_Float *float_free_list;
2e471eb5 2247
34400008
GM
2248/* Return a new float object with value FLOAT_VALUE. */
2249
2e471eb5 2250Lisp_Object
971de7fb 2251make_float (double float_value)
2e471eb5
GM
2252{
2253 register Lisp_Object val;
2254
dafc79fa 2255 MALLOC_BLOCK_INPUT;
cfb2f32e 2256
2e471eb5
GM
2257 if (float_free_list)
2258 {
2259 /* We use the data field for chaining the free list
2260 so that we won't use the same field that has the mark bit. */
2261 XSETFLOAT (val, float_free_list);
28a099a4 2262 float_free_list = float_free_list->u.chain;
2e471eb5
GM
2263 }
2264 else
2265 {
2266 if (float_block_index == FLOAT_BLOCK_SIZE)
2267 {
38182d90
PE
2268 struct float_block *new
2269 = lisp_align_malloc (sizeof *new, MEM_TYPE_FLOAT);
2e471eb5 2270 new->next = float_block;
72af86bd 2271 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2272 float_block = new;
2273 float_block_index = 0;
3900d5de 2274 total_free_floats += FLOAT_BLOCK_SIZE;
2e471eb5 2275 }
6b61353c
KH
2276 XSETFLOAT (val, &float_block->floats[float_block_index]);
2277 float_block_index++;
2e471eb5 2278 }
177c0ea7 2279
dafc79fa 2280 MALLOC_UNBLOCK_INPUT;
e2984df0 2281
f601cdf3 2282 XFLOAT_INIT (val, float_value);
6b61353c 2283 eassert (!FLOAT_MARKED_P (XFLOAT (val)));
2e471eb5
GM
2284 consing_since_gc += sizeof (struct Lisp_Float);
2285 floats_consed++;
3900d5de 2286 total_free_floats--;
2e471eb5
GM
2287 return val;
2288}
2289
2e471eb5
GM
2290
2291\f
2292/***********************************************************************
2293 Cons Allocation
2294 ***********************************************************************/
2295
2296/* We store cons cells inside of cons_blocks, allocating a new
2297 cons_block with malloc whenever necessary. Cons cells reclaimed by
2298 GC are put on a free list to be reallocated before allocating
08b7c2cb 2299 any new cons cells from the latest cons_block. */
2e471eb5 2300
a2821611
AS
2301#define CONS_BLOCK_SIZE \
2302 (((BLOCK_BYTES - sizeof (struct cons_block *) \
2303 /* The compiler might add padding at the end. */ \
2304 - (sizeof (struct Lisp_Cons) - sizeof (int))) * CHAR_BIT) \
08b7c2cb
SM
2305 / (sizeof (struct Lisp_Cons) * CHAR_BIT + 1))
2306
2307#define CONS_BLOCK(fptr) \
d01a7826 2308 ((struct cons_block *) ((uintptr_t) (fptr) & ~(BLOCK_ALIGN - 1)))
08b7c2cb
SM
2309
2310#define CONS_INDEX(fptr) \
d01a7826 2311 (((uintptr_t) (fptr) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons))
2e471eb5
GM
2312
2313struct cons_block
2314{
08b7c2cb 2315 /* Place `conses' at the beginning, to ease up CONS_INDEX's job. */
2e471eb5 2316 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
5e617bc2 2317 int gcmarkbits[1 + CONS_BLOCK_SIZE / (sizeof (int) * CHAR_BIT)];
08b7c2cb 2318 struct cons_block *next;
2e471eb5
GM
2319};
2320
08b7c2cb
SM
2321#define CONS_MARKED_P(fptr) \
2322 GETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2323
2324#define CONS_MARK(fptr) \
2325 SETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2326
2327#define CONS_UNMARK(fptr) \
2328 UNSETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2329
34400008
GM
2330/* Current cons_block. */
2331
244ed907 2332static struct cons_block *cons_block;
34400008
GM
2333
2334/* Index of first unused Lisp_Cons in the current block. */
2335
fff62aa9 2336static int cons_block_index = CONS_BLOCK_SIZE;
2e471eb5 2337
34400008
GM
2338/* Free-list of Lisp_Cons structures. */
2339
244ed907 2340static struct Lisp_Cons *cons_free_list;
2e471eb5 2341
34400008 2342/* Explicitly free a cons cell by putting it on the free-list. */
2e471eb5
GM
2343
2344void
971de7fb 2345free_cons (struct Lisp_Cons *ptr)
2e471eb5 2346{
28a099a4 2347 ptr->u.chain = cons_free_list;
34400008 2348#if GC_MARK_STACK
c644523b 2349 ptr->car = Vdead;
34400008 2350#endif
2e471eb5 2351 cons_free_list = ptr;
0dd6d66d 2352 consing_since_gc -= sizeof *ptr;
3900d5de 2353 total_free_conses++;
2e471eb5
GM
2354}
2355
a7ca3326 2356DEFUN ("cons", Fcons, Scons, 2, 2, 0,
a6266d23 2357 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
5842a27b 2358 (Lisp_Object car, Lisp_Object cdr)
2e471eb5
GM
2359{
2360 register Lisp_Object val;
2361
dafc79fa 2362 MALLOC_BLOCK_INPUT;
cfb2f32e 2363
2e471eb5
GM
2364 if (cons_free_list)
2365 {
2366 /* We use the cdr for chaining the free list
2367 so that we won't use the same field that has the mark bit. */
2368 XSETCONS (val, cons_free_list);
28a099a4 2369 cons_free_list = cons_free_list->u.chain;
2e471eb5
GM
2370 }
2371 else
2372 {
2373 if (cons_block_index == CONS_BLOCK_SIZE)
2374 {
38182d90
PE
2375 struct cons_block *new
2376 = lisp_align_malloc (sizeof *new, MEM_TYPE_CONS);
72af86bd 2377 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2378 new->next = cons_block;
2379 cons_block = new;
2380 cons_block_index = 0;
3900d5de 2381 total_free_conses += CONS_BLOCK_SIZE;
2e471eb5 2382 }
6b61353c
KH
2383 XSETCONS (val, &cons_block->conses[cons_block_index]);
2384 cons_block_index++;
2e471eb5 2385 }
177c0ea7 2386
dafc79fa 2387 MALLOC_UNBLOCK_INPUT;
e2984df0 2388
f3fbd155
KR
2389 XSETCAR (val, car);
2390 XSETCDR (val, cdr);
6b61353c 2391 eassert (!CONS_MARKED_P (XCONS (val)));
2e471eb5 2392 consing_since_gc += sizeof (struct Lisp_Cons);
3900d5de 2393 total_free_conses--;
2e471eb5
GM
2394 cons_cells_consed++;
2395 return val;
2396}
2397
e5aab7e7 2398#ifdef GC_CHECK_CONS_LIST
e3e56238
RS
2399/* Get an error now if there's any junk in the cons free list. */
2400void
971de7fb 2401check_cons_list (void)
e3e56238
RS
2402{
2403 struct Lisp_Cons *tail = cons_free_list;
2404
e3e56238 2405 while (tail)
28a099a4 2406 tail = tail->u.chain;
e3e56238 2407}
e5aab7e7 2408#endif
34400008 2409
9b306d37
KS
2410/* Make a list of 1, 2, 3, 4 or 5 specified objects. */
2411
2412Lisp_Object
971de7fb 2413list1 (Lisp_Object arg1)
9b306d37
KS
2414{
2415 return Fcons (arg1, Qnil);
2416}
2e471eb5
GM
2417
2418Lisp_Object
971de7fb 2419list2 (Lisp_Object arg1, Lisp_Object arg2)
2e471eb5
GM
2420{
2421 return Fcons (arg1, Fcons (arg2, Qnil));
2422}
2423
34400008 2424
2e471eb5 2425Lisp_Object
971de7fb 2426list3 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
2e471eb5
GM
2427{
2428 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
2429}
2430
34400008 2431
2e471eb5 2432Lisp_Object
971de7fb 2433list4 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4)
2e471eb5
GM
2434{
2435 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
2436}
2437
34400008 2438
2e471eb5 2439Lisp_Object
971de7fb 2440list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
2e471eb5
GM
2441{
2442 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
2443 Fcons (arg5, Qnil)))));
2444}
2445
694b6c97
DA
2446/* Make a list of COUNT Lisp_Objects, where ARG is the
2447 first one. Allocate conses from pure space if TYPE
3438fe21 2448 is CONSTYPE_PURE, or allocate as usual if type is CONSTYPE_HEAP. */
694b6c97
DA
2449
2450Lisp_Object
2451listn (enum constype type, ptrdiff_t count, Lisp_Object arg, ...)
2452{
2453 va_list ap;
2454 ptrdiff_t i;
2455 Lisp_Object val, *objp;
2456
2457 /* Change to SAFE_ALLOCA if you hit this eassert. */
663e2b3f 2458 eassert (count <= MAX_ALLOCA / word_size);
694b6c97 2459
663e2b3f 2460 objp = alloca (count * word_size);
694b6c97
DA
2461 objp[0] = arg;
2462 va_start (ap, arg);
2463 for (i = 1; i < count; i++)
2464 objp[i] = va_arg (ap, Lisp_Object);
2465 va_end (ap);
2466
bcfbc9de 2467 for (val = Qnil, i = count - 1; i >= 0; i--)
694b6c97 2468 {
3438fe21 2469 if (type == CONSTYPE_PURE)
694b6c97 2470 val = pure_cons (objp[i], val);
3438fe21 2471 else if (type == CONSTYPE_HEAP)
694b6c97
DA
2472 val = Fcons (objp[i], val);
2473 else
1088b922 2474 emacs_abort ();
694b6c97
DA
2475 }
2476 return val;
2477}
34400008 2478
a7ca3326 2479DEFUN ("list", Flist, Slist, 0, MANY, 0,
eae936e2 2480 doc: /* Return a newly created list with specified arguments as elements.
ae8e8122
MB
2481Any number of arguments, even zero arguments, are allowed.
2482usage: (list &rest OBJECTS) */)
f66c7cf8 2483 (ptrdiff_t nargs, Lisp_Object *args)
2e471eb5
GM
2484{
2485 register Lisp_Object val;
2486 val = Qnil;
2487
2488 while (nargs > 0)
2489 {
2490 nargs--;
2491 val = Fcons (args[nargs], val);
2492 }
2493 return val;
2494}
2495
34400008 2496
a7ca3326 2497DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
a6266d23 2498 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
5842a27b 2499 (register Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2500{
2501 register Lisp_Object val;
14162469 2502 register EMACS_INT size;
2e471eb5 2503
b7826503 2504 CHECK_NATNUM (length);
2e471eb5
GM
2505 size = XFASTINT (length);
2506
2507 val = Qnil;
ce070307
GM
2508 while (size > 0)
2509 {
2510 val = Fcons (init, val);
2511 --size;
2512
2513 if (size > 0)
2514 {
2515 val = Fcons (init, val);
2516 --size;
177c0ea7 2517
ce070307
GM
2518 if (size > 0)
2519 {
2520 val = Fcons (init, val);
2521 --size;
177c0ea7 2522
ce070307
GM
2523 if (size > 0)
2524 {
2525 val = Fcons (init, val);
2526 --size;
177c0ea7 2527
ce070307
GM
2528 if (size > 0)
2529 {
2530 val = Fcons (init, val);
2531 --size;
2532 }
2533 }
2534 }
2535 }
2536
2537 QUIT;
2538 }
177c0ea7 2539
7146af97
JB
2540 return val;
2541}
2e471eb5
GM
2542
2543
7146af97 2544\f
2e471eb5
GM
2545/***********************************************************************
2546 Vector Allocation
2547 ***********************************************************************/
7146af97 2548
f3372c87
DA
2549/* This value is balanced well enough to avoid too much internal overhead
2550 for the most common cases; it's not required to be a power of two, but
2551 it's expected to be a mult-of-ROUNDUP_SIZE (see below). */
34400008 2552
f3372c87 2553#define VECTOR_BLOCK_SIZE 4096
7146af97 2554
d06714cb 2555/* Align allocation request sizes to be a multiple of ROUNDUP_SIZE. */
dd0b0efb
PE
2556enum
2557 {
2b90362b 2558 roundup_size = COMMON_MULTIPLE (word_size, USE_LSB_TAG ? GCALIGNMENT : 1)
dd0b0efb 2559 };
34400008 2560
bfe3e0a2
PE
2561/* ROUNDUP_SIZE must be a power of 2. */
2562verify ((roundup_size & (roundup_size - 1)) == 0);
2563
ca95b3eb
DA
2564/* Verify assumptions described above. */
2565verify ((VECTOR_BLOCK_SIZE % roundup_size) == 0);
ee28be33 2566verify (VECTOR_BLOCK_SIZE <= (1 << PSEUDOVECTOR_SIZE_BITS));
ca95b3eb 2567
bfe3e0a2 2568/* Round up X to nearest mult-of-ROUNDUP_SIZE. */
f3372c87
DA
2569
2570#define vroundup(x) (((x) + (roundup_size - 1)) & ~(roundup_size - 1))
2571
2572/* Rounding helps to maintain alignment constraints if USE_LSB_TAG. */
2573
2574#define VECTOR_BLOCK_BYTES (VECTOR_BLOCK_SIZE - vroundup (sizeof (void *)))
2575
2576/* Size of the minimal vector allocated from block. */
2577
fbe9e0b9 2578#define VBLOCK_BYTES_MIN vroundup (header_size + sizeof (Lisp_Object))
f3372c87
DA
2579
2580/* Size of the largest vector allocated from block. */
2581
2582#define VBLOCK_BYTES_MAX \
d06714cb 2583 vroundup ((VECTOR_BLOCK_BYTES / 2) - word_size)
f3372c87
DA
2584
2585/* We maintain one free list for each possible block-allocated
2586 vector size, and this is the number of free lists we have. */
2587
2588#define VECTOR_MAX_FREE_LIST_INDEX \
2589 ((VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN) / roundup_size + 1)
2590
f3372c87
DA
2591/* Common shortcut to advance vector pointer over a block data. */
2592
2593#define ADVANCE(v, nbytes) ((struct Lisp_Vector *) ((char *) (v) + (nbytes)))
2594
2595/* Common shortcut to calculate NBYTES-vector index in VECTOR_FREE_LISTS. */
2596
2597#define VINDEX(nbytes) (((nbytes) - VBLOCK_BYTES_MIN) / roundup_size)
2598
76ae24d7
PE
2599/* Get and set the next field in block-allocated vectorlike objects on
2600 the free list. Doing it this way respects C's aliasing rules.
2601 We could instead make 'contents' a union, but that would mean
2602 changes everywhere that the code uses 'contents'. */
2603static struct Lisp_Vector *
2604next_in_free_list (struct Lisp_Vector *v)
7d377c48 2605{
76ae24d7
PE
2606 intptr_t i = XLI (v->contents[0]);
2607 return (struct Lisp_Vector *) i;
2608}
2609static void
2610set_next_in_free_list (struct Lisp_Vector *v, struct Lisp_Vector *next)
2611{
2612 v->contents[0] = XIL ((intptr_t) next);
2613}
914adc42 2614
f3372c87
DA
2615/* Common shortcut to setup vector on a free list. */
2616
914adc42
DA
2617#define SETUP_ON_FREE_LIST(v, nbytes, tmp) \
2618 do { \
2619 (tmp) = ((nbytes - header_size) / word_size); \
2620 XSETPVECTYPESIZE (v, PVEC_FREE, 0, (tmp)); \
2621 eassert ((nbytes) % roundup_size == 0); \
2622 (tmp) = VINDEX (nbytes); \
2623 eassert ((tmp) < VECTOR_MAX_FREE_LIST_INDEX); \
76ae24d7 2624 set_next_in_free_list (v, vector_free_lists[tmp]); \
914adc42
DA
2625 vector_free_lists[tmp] = (v); \
2626 total_free_vector_slots += (nbytes) / word_size; \
f3372c87
DA
2627 } while (0)
2628
914adc42
DA
2629/* This internal type is used to maintain the list of large vectors
2630 which are allocated at their own, e.g. outside of vector blocks. */
2631
2632struct large_vector
2633{
2634 union {
2635 struct large_vector *vector;
2636#if USE_LSB_TAG
2637 /* We need to maintain ROUNDUP_SIZE alignment for the vector member. */
2638 unsigned char c[vroundup (sizeof (struct large_vector *))];
2639#endif
2640 } next;
2641 struct Lisp_Vector v;
2642};
2643
2644/* This internal type is used to maintain an underlying storage
2645 for small vectors. */
2646
f3372c87
DA
2647struct vector_block
2648{
2649 char data[VECTOR_BLOCK_BYTES];
2650 struct vector_block *next;
2651};
2652
2653/* Chain of vector blocks. */
2654
2655static struct vector_block *vector_blocks;
2656
2657/* Vector free lists, where NTH item points to a chain of free
2658 vectors of the same NBYTES size, so NTH == VINDEX (NBYTES). */
2659
2660static struct Lisp_Vector *vector_free_lists[VECTOR_MAX_FREE_LIST_INDEX];
2661
2662/* Singly-linked list of large vectors. */
2663
914adc42 2664static struct large_vector *large_vectors;
f3372c87
DA
2665
2666/* The only vector with 0 slots, allocated from pure space. */
2667
9730daca 2668Lisp_Object zero_vector;
f3372c87 2669
3ab6e069
DA
2670/* Number of live vectors. */
2671
2672static EMACS_INT total_vectors;
2673
5b835e1d 2674/* Total size of live and free vectors, in Lisp_Object units. */
3ab6e069 2675
5b835e1d 2676static EMACS_INT total_vector_slots, total_free_vector_slots;
3ab6e069 2677
f3372c87
DA
2678/* Get a new vector block. */
2679
2680static struct vector_block *
2681allocate_vector_block (void)
2682{
38182d90 2683 struct vector_block *block = xmalloc (sizeof *block);
f3372c87
DA
2684
2685#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
2686 mem_insert (block->data, block->data + VECTOR_BLOCK_BYTES,
2687 MEM_TYPE_VECTOR_BLOCK);
2688#endif
2689
2690 block->next = vector_blocks;
2691 vector_blocks = block;
2692 return block;
2693}
2694
2695/* Called once to initialize vector allocation. */
2696
2697static void
2698init_vectors (void)
2699{
9730daca 2700 zero_vector = make_pure_vector (0);
f3372c87
DA
2701}
2702
2703/* Allocate vector from a vector block. */
2704
2705static struct Lisp_Vector *
2706allocate_vector_from_block (size_t nbytes)
2707{
914adc42 2708 struct Lisp_Vector *vector;
f3372c87
DA
2709 struct vector_block *block;
2710 size_t index, restbytes;
2711
2712 eassert (VBLOCK_BYTES_MIN <= nbytes && nbytes <= VBLOCK_BYTES_MAX);
2713 eassert (nbytes % roundup_size == 0);
2714
2715 /* First, try to allocate from a free list
2716 containing vectors of the requested size. */
2717 index = VINDEX (nbytes);
2718 if (vector_free_lists[index])
2719 {
2720 vector = vector_free_lists[index];
76ae24d7 2721 vector_free_lists[index] = next_in_free_list (vector);
5b835e1d 2722 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2723 return vector;
2724 }
2725
2726 /* Next, check free lists containing larger vectors. Since
2727 we will split the result, we should have remaining space
2728 large enough to use for one-slot vector at least. */
2729 for (index = VINDEX (nbytes + VBLOCK_BYTES_MIN);
2730 index < VECTOR_MAX_FREE_LIST_INDEX; index++)
2731 if (vector_free_lists[index])
2732 {
2733 /* This vector is larger than requested. */
2734 vector = vector_free_lists[index];
76ae24d7 2735 vector_free_lists[index] = next_in_free_list (vector);
5b835e1d 2736 total_free_vector_slots -= nbytes / word_size;
f3372c87
DA
2737
2738 /* Excess bytes are used for the smaller vector,
2739 which should be set on an appropriate free list. */
2740 restbytes = index * roundup_size + VBLOCK_BYTES_MIN - nbytes;
2741 eassert (restbytes % roundup_size == 0);
914adc42 2742 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2743 return vector;
2744 }
2745
2746 /* Finally, need a new vector block. */
2747 block = allocate_vector_block ();
2748
2749 /* New vector will be at the beginning of this block. */
2750 vector = (struct Lisp_Vector *) block->data;
f3372c87
DA
2751
2752 /* If the rest of space from this block is large enough
2753 for one-slot vector at least, set up it on a free list. */
2754 restbytes = VECTOR_BLOCK_BYTES - nbytes;
2755 if (restbytes >= VBLOCK_BYTES_MIN)
2756 {
2757 eassert (restbytes % roundup_size == 0);
914adc42 2758 SETUP_ON_FREE_LIST (ADVANCE (vector, nbytes), restbytes, index);
f3372c87
DA
2759 }
2760 return vector;
914adc42 2761}
f3372c87 2762
f3372c87
DA
2763/* Nonzero if VECTOR pointer is valid pointer inside BLOCK. */
2764
2765#define VECTOR_IN_BLOCK(vector, block) \
2766 ((char *) (vector) <= (block)->data \
2767 + VECTOR_BLOCK_BYTES - VBLOCK_BYTES_MIN)
2768
914adc42 2769/* Return the memory footprint of V in bytes. */
ee28be33 2770
914adc42
DA
2771static ptrdiff_t
2772vector_nbytes (struct Lisp_Vector *v)
2773{
2774 ptrdiff_t size = v->header.size & ~ARRAY_MARK_FLAG;
2775
2776 if (size & PSEUDOVECTOR_FLAG)
2777 {
2778 if (PSEUDOVECTOR_TYPEP (&v->header, PVEC_BOOL_VECTOR))
2779 size = (bool_header_size
2780 + (((struct Lisp_Bool_Vector *) v)->size
2781 + BOOL_VECTOR_BITS_PER_CHAR - 1)
2782 / BOOL_VECTOR_BITS_PER_CHAR);
2783 else
2784 size = (header_size
2785 + ((size & PSEUDOVECTOR_SIZE_MASK)
2786 + ((size & PSEUDOVECTOR_REST_MASK)
2787 >> PSEUDOVECTOR_SIZE_BITS)) * word_size);
2788 }
2789 else
2790 size = header_size + size * word_size;
2791 return vroundup (size);
2792}
ee28be33 2793
f3372c87
DA
2794/* Reclaim space used by unmarked vectors. */
2795
2796static void
2797sweep_vectors (void)
2798{
2799 struct vector_block *block = vector_blocks, **bprev = &vector_blocks;
914adc42
DA
2800 struct large_vector *lv, **lvprev = &large_vectors;
2801 struct Lisp_Vector *vector, *next;
f3372c87 2802
5b835e1d 2803 total_vectors = total_vector_slots = total_free_vector_slots = 0;
f3372c87
DA
2804 memset (vector_free_lists, 0, sizeof (vector_free_lists));
2805
2806 /* Looking through vector blocks. */
2807
2808 for (block = vector_blocks; block; block = *bprev)
2809 {
fce31d69 2810 bool free_this_block = 0;
914adc42 2811 ptrdiff_t nbytes;
f3372c87
DA
2812
2813 for (vector = (struct Lisp_Vector *) block->data;
2814 VECTOR_IN_BLOCK (vector, block); vector = next)
2815 {
2816 if (VECTOR_MARKED_P (vector))
2817 {
2818 VECTOR_UNMARK (vector);
3ab6e069 2819 total_vectors++;
914adc42
DA
2820 nbytes = vector_nbytes (vector);
2821 total_vector_slots += nbytes / word_size;
2822 next = ADVANCE (vector, nbytes);
f3372c87
DA
2823 }
2824 else
2825 {
914adc42 2826 ptrdiff_t total_bytes;
f3372c87 2827
914adc42
DA
2828 nbytes = vector_nbytes (vector);
2829 total_bytes = nbytes;
ee28be33 2830 next = ADVANCE (vector, nbytes);
f3372c87
DA
2831
2832 /* While NEXT is not marked, try to coalesce with VECTOR,
2833 thus making VECTOR of the largest possible size. */
2834
2835 while (VECTOR_IN_BLOCK (next, block))
2836 {
2837 if (VECTOR_MARKED_P (next))
2838 break;
914adc42 2839 nbytes = vector_nbytes (next);
ee28be33 2840 total_bytes += nbytes;
f3372c87
DA
2841 next = ADVANCE (next, nbytes);
2842 }
bfe3e0a2 2843
ee28be33 2844 eassert (total_bytes % roundup_size == 0);
f3372c87
DA
2845
2846 if (vector == (struct Lisp_Vector *) block->data
2847 && !VECTOR_IN_BLOCK (next, block))
2848 /* This block should be freed because all of it's
2849 space was coalesced into the only free vector. */
2850 free_this_block = 1;
2851 else
ee28be33
SM
2852 {
2853 int tmp;
2854 SETUP_ON_FREE_LIST (vector, total_bytes, tmp);
2855 }
f3372c87
DA
2856 }
2857 }
2858
2859 if (free_this_block)
2860 {
2861 *bprev = block->next;
2862#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
2863 mem_delete (mem_find (block->data));
2864#endif
2865 xfree (block);
2866 }
2867 else
2868 bprev = &block->next;
2869 }
2870
2871 /* Sweep large vectors. */
2872
914adc42 2873 for (lv = large_vectors; lv; lv = *lvprev)
f3372c87 2874 {
914adc42 2875 vector = &lv->v;
f3372c87
DA
2876 if (VECTOR_MARKED_P (vector))
2877 {
2878 VECTOR_UNMARK (vector);
3ab6e069 2879 total_vectors++;
169925ec
DA
2880 if (vector->header.size & PSEUDOVECTOR_FLAG)
2881 {
d06714cb
PE
2882 struct Lisp_Bool_Vector *b = (struct Lisp_Bool_Vector *) vector;
2883
2884 /* All non-bool pseudovectors are small enough to be allocated
2885 from vector blocks. This code should be redesigned if some
2886 pseudovector type grows beyond VBLOCK_BYTES_MAX. */
2887 eassert (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_BOOL_VECTOR));
2888
5b835e1d 2889 total_vector_slots
d06714cb
PE
2890 += (bool_header_size
2891 + ((b->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
5b835e1d 2892 / BOOL_VECTOR_BITS_PER_CHAR)) / word_size;
169925ec
DA
2893 }
2894 else
5b835e1d
DA
2895 total_vector_slots
2896 += header_size / word_size + vector->header.size;
914adc42 2897 lvprev = &lv->next.vector;
f3372c87
DA
2898 }
2899 else
2900 {
914adc42
DA
2901 *lvprev = lv->next.vector;
2902 lisp_free (lv);
f3372c87
DA
2903 }
2904 }
2905}
2906
34400008
GM
2907/* Value is a pointer to a newly allocated Lisp_Vector structure
2908 with room for LEN Lisp_Objects. */
2909
ece93c02 2910static struct Lisp_Vector *
d311d28c 2911allocate_vectorlike (ptrdiff_t len)
1825c68d
KH
2912{
2913 struct Lisp_Vector *p;
2914
dafc79fa
SM
2915 MALLOC_BLOCK_INPUT;
2916
f3372c87 2917 if (len == 0)
9730daca 2918 p = XVECTOR (zero_vector);
d12e8f5a 2919 else
8bbbc977 2920 {
d12e8f5a 2921 size_t nbytes = header_size + len * word_size;
f3372c87 2922
d12e8f5a
DA
2923#ifdef DOUG_LEA_MALLOC
2924 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
2925 because mapped region contents are not preserved in
2926 a dumped Emacs. */
2927 mallopt (M_MMAP_MAX, 0);
2928#endif
f3372c87 2929
d12e8f5a
DA
2930 if (nbytes <= VBLOCK_BYTES_MAX)
2931 p = allocate_vector_from_block (vroundup (nbytes));
2932 else
2933 {
914adc42 2934 struct large_vector *lv
fbe9e0b9
PE
2935 = lisp_malloc ((offsetof (struct large_vector, v.contents)
2936 + len * word_size),
914adc42
DA
2937 MEM_TYPE_VECTORLIKE);
2938 lv->next.vector = large_vectors;
2939 large_vectors = lv;
2940 p = &lv->v;
d12e8f5a 2941 }
177c0ea7 2942
d1658221 2943#ifdef DOUG_LEA_MALLOC
d12e8f5a
DA
2944 /* Back to a reasonable maximum of mmap'ed areas. */
2945 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
d1658221 2946#endif
177c0ea7 2947
d12e8f5a
DA
2948 consing_since_gc += nbytes;
2949 vector_cells_consed += len;
2950 }
1825c68d 2951
dafc79fa 2952 MALLOC_UNBLOCK_INPUT;
e2984df0 2953
1825c68d
KH
2954 return p;
2955}
2956
34400008 2957
dd0b0efb 2958/* Allocate a vector with LEN slots. */
ece93c02
GM
2959
2960struct Lisp_Vector *
dd0b0efb 2961allocate_vector (EMACS_INT len)
ece93c02 2962{
dd0b0efb
PE
2963 struct Lisp_Vector *v;
2964 ptrdiff_t nbytes_max = min (PTRDIFF_MAX, SIZE_MAX);
2965
2966 if (min ((nbytes_max - header_size) / word_size, MOST_POSITIVE_FIXNUM) < len)
2967 memory_full (SIZE_MAX);
2968 v = allocate_vectorlike (len);
2969 v->header.size = len;
ece93c02
GM
2970 return v;
2971}
2972
2973
2974/* Allocate other vector-like structures. */
2975
30f95089 2976struct Lisp_Vector *
914adc42 2977allocate_pseudovector (int memlen, int lisplen, enum pvec_type tag)
ece93c02 2978{
d2029e5b 2979 struct Lisp_Vector *v = allocate_vectorlike (memlen);
e46bb31a 2980 int i;
177c0ea7 2981
914adc42
DA
2982 /* Catch bogus values. */
2983 eassert (tag <= PVEC_FONT);
2984 eassert (memlen - lisplen <= (1 << PSEUDOVECTOR_REST_BITS) - 1);
2985 eassert (lisplen <= (1 << PSEUDOVECTOR_SIZE_BITS) - 1);
2986
d2029e5b 2987 /* Only the first lisplen slots will be traced normally by the GC. */
d2029e5b 2988 for (i = 0; i < lisplen; ++i)
ece93c02 2989 v->contents[i] = Qnil;
177c0ea7 2990
914adc42 2991 XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen);
d2029e5b
SM
2992 return v;
2993}
d2029e5b 2994
36429c89
DA
2995struct buffer *
2996allocate_buffer (void)
2997{
38182d90 2998 struct buffer *b = lisp_malloc (sizeof *b, MEM_TYPE_BUFFER);
36429c89 2999
914adc42 3000 BUFFER_PVEC_INIT (b);
c752cfa9 3001 /* Put B on the chain of all buffers including killed ones. */
914adc42 3002 b->next = all_buffers;
c752cfa9
DA
3003 all_buffers = b;
3004 /* Note that the rest fields of B are not initialized. */
36429c89
DA
3005 return b;
3006}
3007
ece93c02 3008struct Lisp_Hash_Table *
878f97ff 3009allocate_hash_table (void)
ece93c02 3010{
878f97ff 3011 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
ece93c02
GM
3012}
3013
ece93c02 3014struct window *
971de7fb 3015allocate_window (void)
ece93c02 3016{
62efea5e 3017 struct window *w;
177c0ea7 3018
62efea5e
DA
3019 w = ALLOCATE_PSEUDOVECTOR (struct window, current_matrix, PVEC_WINDOW);
3020 /* Users assumes that non-Lisp data is zeroed. */
3021 memset (&w->current_matrix, 0,
3022 sizeof (*w) - offsetof (struct window, current_matrix));
3023 return w;
3024}
177c0ea7 3025
4a729fd8 3026struct terminal *
971de7fb 3027allocate_terminal (void)
4a729fd8 3028{
62efea5e 3029 struct terminal *t;
ece93c02 3030
62efea5e
DA
3031 t = ALLOCATE_PSEUDOVECTOR (struct terminal, next_terminal, PVEC_TERMINAL);
3032 /* Users assumes that non-Lisp data is zeroed. */
3033 memset (&t->next_terminal, 0,
3034 sizeof (*t) - offsetof (struct terminal, next_terminal));
d2029e5b 3035 return t;
4a729fd8 3036}
ece93c02
GM
3037
3038struct frame *
971de7fb 3039allocate_frame (void)
ece93c02 3040{
62efea5e
DA
3041 struct frame *f;
3042
3043 f = ALLOCATE_PSEUDOVECTOR (struct frame, face_cache, PVEC_FRAME);
3044 /* Users assumes that non-Lisp data is zeroed. */
72af86bd 3045 memset (&f->face_cache, 0,
62efea5e 3046 sizeof (*f) - offsetof (struct frame, face_cache));
d2029e5b 3047 return f;
ece93c02
GM
3048}
3049
ece93c02 3050struct Lisp_Process *
971de7fb 3051allocate_process (void)
ece93c02 3052{
62efea5e 3053 struct Lisp_Process *p;
ece93c02 3054
62efea5e
DA
3055 p = ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
3056 /* Users assumes that non-Lisp data is zeroed. */
3057 memset (&p->pid, 0,
3058 sizeof (*p) - offsetof (struct Lisp_Process, pid));
3059 return p;
3060}
ece93c02 3061
a7ca3326 3062DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
a6266d23 3063 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
7ee72033 3064See also the function `vector'. */)
5842a27b 3065 (register Lisp_Object length, Lisp_Object init)
7146af97 3066{
1825c68d 3067 Lisp_Object vector;
d311d28c
PE
3068 register ptrdiff_t sizei;
3069 register ptrdiff_t i;
7146af97
JB
3070 register struct Lisp_Vector *p;
3071
b7826503 3072 CHECK_NATNUM (length);
7146af97 3073
d311d28c
PE
3074 p = allocate_vector (XFASTINT (length));
3075 sizei = XFASTINT (length);
ae35e756
PE
3076 for (i = 0; i < sizei; i++)
3077 p->contents[i] = init;
7146af97 3078
1825c68d 3079 XSETVECTOR (vector, p);
7146af97
JB
3080 return vector;
3081}
3082
34400008 3083
a7ca3326 3084DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
eae936e2 3085 doc: /* Return a newly created vector with specified arguments as elements.
ae8e8122
MB
3086Any number of arguments, even zero arguments, are allowed.
3087usage: (vector &rest OBJECTS) */)
f66c7cf8 3088 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3089{
f66c7cf8 3090 ptrdiff_t i;
25721f5b
DA
3091 register Lisp_Object val = make_uninit_vector (nargs);
3092 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3093
ae35e756
PE
3094 for (i = 0; i < nargs; i++)
3095 p->contents[i] = args[i];
7146af97
JB
3096 return val;
3097}
3098
3017f87f
SM
3099void
3100make_byte_code (struct Lisp_Vector *v)
3101{
3102 if (v->header.size > 1 && STRINGP (v->contents[1])
3103 && STRING_MULTIBYTE (v->contents[1]))
3104 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
3105 earlier because they produced a raw 8-bit string for byte-code
3106 and now such a byte-code string is loaded as multibyte while
3107 raw 8-bit characters converted to multibyte form. Thus, now we
3108 must convert them back to the original unibyte form. */
3109 v->contents[1] = Fstring_as_unibyte (v->contents[1]);
3110 XSETPVECTYPE (v, PVEC_COMPILED);
3111}
34400008 3112
a7ca3326 3113DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
a6266d23 3114 doc: /* Create a byte-code object with specified arguments as elements.
e2abe5a1
SM
3115The arguments should be the ARGLIST, bytecode-string BYTE-CODE, constant
3116vector CONSTANTS, maximum stack size DEPTH, (optional) DOCSTRING,
3117and (optional) INTERACTIVE-SPEC.
228299fa 3118The first four arguments are required; at most six have any
ae8e8122 3119significance.
e2abe5a1
SM
3120The ARGLIST can be either like the one of `lambda', in which case the arguments
3121will be dynamically bound before executing the byte code, or it can be an
3122integer of the form NNNNNNNRMMMMMMM where the 7bit MMMMMMM specifies the
3123minimum number of arguments, the 7-bit NNNNNNN specifies the maximum number
3124of arguments (ignoring &rest) and the R bit specifies whether there is a &rest
3125argument to catch the left-over arguments. If such an integer is used, the
3126arguments will not be dynamically bound but will be instead pushed on the
3127stack before executing the byte-code.
92cc28b2 3128usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
f66c7cf8 3129 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 3130{
f66c7cf8 3131 ptrdiff_t i;
25721f5b
DA
3132 register Lisp_Object val = make_uninit_vector (nargs);
3133 register struct Lisp_Vector *p = XVECTOR (val);
7146af97 3134
12fbe755 3135 /* We used to purecopy everything here, if purify-flag was set. This worked
3017f87f
SM
3136 OK for Emacs-23, but with Emacs-24's lexical binding code, it can be
3137 dangerous, since make-byte-code is used during execution to build
3138 closures, so any closure built during the preload phase would end up
3139 copied into pure space, including its free variables, which is sometimes
3140 just wasteful and other times plainly wrong (e.g. those free vars may want
3141 to be setcar'd). */
9eac9d59 3142
ae35e756 3143 for (i = 0; i < nargs; i++)
3017f87f
SM
3144 p->contents[i] = args[i];
3145 make_byte_code (p);
876c194c 3146 XSETCOMPILED (val, p);
7146af97
JB
3147 return val;
3148}
2e471eb5 3149
34400008 3150
7146af97 3151\f
2e471eb5
GM
3152/***********************************************************************
3153 Symbol Allocation
3154 ***********************************************************************/
7146af97 3155
d55c12ed
AS
3156/* Like struct Lisp_Symbol, but padded so that the size is a multiple
3157 of the required alignment if LSB tags are used. */
3158
3159union aligned_Lisp_Symbol
3160{
3161 struct Lisp_Symbol s;
bfe3e0a2 3162#if USE_LSB_TAG
2b90362b
DA
3163 unsigned char c[(sizeof (struct Lisp_Symbol) + GCALIGNMENT - 1)
3164 & -GCALIGNMENT];
d55c12ed
AS
3165#endif
3166};
3167
2e471eb5
GM
3168/* Each symbol_block is just under 1020 bytes long, since malloc
3169 really allocates in units of powers of two and uses 4 bytes for its
3017f87f 3170 own overhead. */
7146af97
JB
3171
3172#define SYMBOL_BLOCK_SIZE \
d55c12ed 3173 ((1020 - sizeof (struct symbol_block *)) / sizeof (union aligned_Lisp_Symbol))
7146af97
JB
3174
3175struct symbol_block
2e471eb5 3176{
6b61353c 3177 /* Place `symbols' first, to preserve alignment. */
d55c12ed 3178 union aligned_Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
6b61353c 3179 struct symbol_block *next;
2e471eb5 3180};
7146af97 3181
34400008
GM
3182/* Current symbol block and index of first unused Lisp_Symbol
3183 structure in it. */
3184
d3d47262 3185static struct symbol_block *symbol_block;
fff62aa9 3186static int symbol_block_index = SYMBOL_BLOCK_SIZE;
7146af97 3187
34400008
GM
3188/* List of free symbols. */
3189
d3d47262 3190static struct Lisp_Symbol *symbol_free_list;
7146af97 3191
84575e67
PE
3192static void
3193set_symbol_name (Lisp_Object sym, Lisp_Object name)
3194{
3195 XSYMBOL (sym)->name = name;
3196}
3197
a7ca3326 3198DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
a6266d23 3199 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
eadf1faa 3200Its value is void, and its function definition and property list are nil. */)
5842a27b 3201 (Lisp_Object name)
7146af97
JB
3202{
3203 register Lisp_Object val;
3204 register struct Lisp_Symbol *p;
3205
b7826503 3206 CHECK_STRING (name);
7146af97 3207
dafc79fa 3208 MALLOC_BLOCK_INPUT;
e2984df0 3209
7146af97
JB
3210 if (symbol_free_list)
3211 {
45d12a89 3212 XSETSYMBOL (val, symbol_free_list);
28a099a4 3213 symbol_free_list = symbol_free_list->next;
7146af97
JB
3214 }
3215 else
3216 {
3217 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
3218 {
38182d90
PE
3219 struct symbol_block *new
3220 = lisp_malloc (sizeof *new, MEM_TYPE_SYMBOL);
7146af97
JB
3221 new->next = symbol_block;
3222 symbol_block = new;
3223 symbol_block_index = 0;
3900d5de 3224 total_free_symbols += SYMBOL_BLOCK_SIZE;
7146af97 3225 }
d55c12ed 3226 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index].s);
6b61353c 3227 symbol_block_index++;
7146af97 3228 }
177c0ea7 3229
dafc79fa 3230 MALLOC_UNBLOCK_INPUT;
e2984df0 3231
7146af97 3232 p = XSYMBOL (val);
c644523b
DA
3233 set_symbol_name (val, name);
3234 set_symbol_plist (val, Qnil);
ce5b453a
SM
3235 p->redirect = SYMBOL_PLAINVAL;
3236 SET_SYMBOL_VAL (p, Qunbound);
eadf1faa 3237 set_symbol_function (val, Qnil);
c644523b 3238 set_symbol_next (val, NULL);
2336fe58 3239 p->gcmarkbit = 0;
9e713715
GM
3240 p->interned = SYMBOL_UNINTERNED;
3241 p->constant = 0;
b9598260 3242 p->declared_special = 0;
2e471eb5
GM
3243 consing_since_gc += sizeof (struct Lisp_Symbol);
3244 symbols_consed++;
3900d5de 3245 total_free_symbols--;
7146af97
JB
3246 return val;
3247}
3248
3f25e183 3249
2e471eb5
GM
3250\f
3251/***********************************************************************
34400008 3252 Marker (Misc) Allocation
2e471eb5 3253 ***********************************************************************/
3f25e183 3254
d55c12ed
AS
3255/* Like union Lisp_Misc, but padded so that its size is a multiple of
3256 the required alignment when LSB tags are used. */
3257
3258union aligned_Lisp_Misc
3259{
3260 union Lisp_Misc m;
bfe3e0a2 3261#if USE_LSB_TAG
2b90362b
DA
3262 unsigned char c[(sizeof (union Lisp_Misc) + GCALIGNMENT - 1)
3263 & -GCALIGNMENT];
d55c12ed
AS
3264#endif
3265};
3266
2e471eb5
GM
3267/* Allocation of markers and other objects that share that structure.
3268 Works like allocation of conses. */
c0696668 3269
2e471eb5 3270#define MARKER_BLOCK_SIZE \
d55c12ed 3271 ((1020 - sizeof (struct marker_block *)) / sizeof (union aligned_Lisp_Misc))
2e471eb5
GM
3272
3273struct marker_block
c0696668 3274{
6b61353c 3275 /* Place `markers' first, to preserve alignment. */
d55c12ed 3276 union aligned_Lisp_Misc markers[MARKER_BLOCK_SIZE];
6b61353c 3277 struct marker_block *next;
2e471eb5 3278};
c0696668 3279
d3d47262 3280static struct marker_block *marker_block;
fff62aa9 3281static int marker_block_index = MARKER_BLOCK_SIZE;
c0696668 3282
d3d47262 3283static union Lisp_Misc *marker_free_list;
c0696668 3284
d7a7fda3 3285/* Return a newly allocated Lisp_Misc object of specified TYPE. */
2e471eb5 3286
1b971ac1 3287static Lisp_Object
d7a7fda3 3288allocate_misc (enum Lisp_Misc_Type type)
7146af97 3289{
2e471eb5 3290 Lisp_Object val;
7146af97 3291
dafc79fa 3292 MALLOC_BLOCK_INPUT;
cfb2f32e 3293
2e471eb5 3294 if (marker_free_list)
7146af97 3295 {
2e471eb5
GM
3296 XSETMISC (val, marker_free_list);
3297 marker_free_list = marker_free_list->u_free.chain;
7146af97
JB
3298 }
3299 else
7146af97 3300 {
2e471eb5
GM
3301 if (marker_block_index == MARKER_BLOCK_SIZE)
3302 {
38182d90 3303 struct marker_block *new = lisp_malloc (sizeof *new, MEM_TYPE_MISC);
2e471eb5
GM
3304 new->next = marker_block;
3305 marker_block = new;
3306 marker_block_index = 0;
7b7990cc 3307 total_free_markers += MARKER_BLOCK_SIZE;
2e471eb5 3308 }
d55c12ed 3309 XSETMISC (val, &marker_block->markers[marker_block_index].m);
6b61353c 3310 marker_block_index++;
7146af97 3311 }
177c0ea7 3312
dafc79fa 3313 MALLOC_UNBLOCK_INPUT;
e2984df0 3314
7b7990cc 3315 --total_free_markers;
2e471eb5
GM
3316 consing_since_gc += sizeof (union Lisp_Misc);
3317 misc_objects_consed++;
84575e67 3318 XMISCANY (val)->type = type;
67ee9f6e 3319 XMISCANY (val)->gcmarkbit = 0;
2e471eb5
GM
3320 return val;
3321}
3322
73ebd38f 3323/* Free a Lisp_Misc object. */
7b7990cc 3324
73ebd38f 3325void
971de7fb 3326free_misc (Lisp_Object misc)
7b7990cc 3327{
84575e67 3328 XMISCANY (misc)->type = Lisp_Misc_Free;
7b7990cc
KS
3329 XMISC (misc)->u_free.chain = marker_free_list;
3330 marker_free_list = XMISC (misc);
0dd6d66d 3331 consing_since_gc -= sizeof (union Lisp_Misc);
7b7990cc
KS
3332 total_free_markers++;
3333}
3334
7b1123d8
PE
3335/* Verify properties of Lisp_Save_Value's representation
3336 that are assumed here and elsewhere. */
3337
3338verify (SAVE_UNUSED == 0);
52a9bcae
PE
3339verify (((SAVE_INTEGER | SAVE_POINTER | SAVE_FUNCPOINTER | SAVE_OBJECT)
3340 >> SAVE_SLOT_BITS)
3341 == 0);
7b1123d8 3342
1396ac86
PE
3343/* Return Lisp_Save_Value objects for the various combinations
3344 that callers need. */
1b971ac1
DA
3345
3346Lisp_Object
1396ac86 3347make_save_int_int_int (ptrdiff_t a, ptrdiff_t b, ptrdiff_t c)
1b971ac1 3348{
1b971ac1
DA
3349 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3350 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3351 p->save_type = SAVE_TYPE_INT_INT_INT;
3352 p->data[0].integer = a;
3353 p->data[1].integer = b;
3354 p->data[2].integer = c;
3355 return val;
3356}
1b971ac1 3357
1396ac86
PE
3358Lisp_Object
3359make_save_obj_obj_obj_obj (Lisp_Object a, Lisp_Object b, Lisp_Object c,
3360 Lisp_Object d)
3361{
3362 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3363 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3364 p->save_type = SAVE_TYPE_OBJ_OBJ_OBJ_OBJ;
3365 p->data[0].object = a;
3366 p->data[1].object = b;
3367 p->data[2].object = c;
3368 p->data[3].object = d;
3369 return val;
3370}
1b971ac1 3371
198fa217 3372#if defined HAVE_NS || defined HAVE_NTGUI
1396ac86
PE
3373Lisp_Object
3374make_save_ptr (void *a)
3375{
3376 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3377 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3378 p->save_type = SAVE_POINTER;
3379 p->data[0].pointer = a;
3380 return val;
3381}
3382#endif
7b1123d8 3383
1396ac86
PE
3384Lisp_Object
3385make_save_ptr_int (void *a, ptrdiff_t b)
3386{
3387 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3388 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3389 p->save_type = SAVE_TYPE_PTR_INT;
3390 p->data[0].pointer = a;
3391 p->data[1].integer = b;
3392 return val;
3393}
1b971ac1 3394
f4e891b5
PE
3395#if defined HAVE_MENUS && ! (defined USE_X_TOOLKIT || defined USE_GTK)
3396Lisp_Object
3397make_save_ptr_ptr (void *a, void *b)
3398{
3399 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3400 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3401 p->save_type = SAVE_TYPE_PTR_PTR;
3402 p->data[0].pointer = a;
3403 p->data[1].pointer = b;
3404 return val;
3405}
3406#endif
3407
1396ac86
PE
3408Lisp_Object
3409make_save_funcptr_ptr_obj (void (*a) (void), void *b, Lisp_Object c)
3410{
3411 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3412 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
3413 p->save_type = SAVE_TYPE_FUNCPTR_PTR_OBJ;
3414 p->data[0].funcpointer = a;
3415 p->data[1].pointer = b;
3416 p->data[2].object = c;
1b971ac1
DA
3417 return val;
3418}
3419
1396ac86
PE
3420/* Return a Lisp_Save_Value object that represents an array A
3421 of N Lisp objects. */
42172a6b
RS
3422
3423Lisp_Object
1396ac86 3424make_save_memory (Lisp_Object *a, ptrdiff_t n)
42172a6b 3425{
468afbac
DA
3426 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
3427 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1396ac86
PE
3428 p->save_type = SAVE_TYPE_MEMORY;
3429 p->data[0].pointer = a;
3430 p->data[1].integer = n;
468afbac 3431 return val;
42172a6b
RS
3432}
3433
73ebd38f
DA
3434/* Free a Lisp_Save_Value object. Do not use this function
3435 if SAVE contains pointer other than returned by xmalloc. */
62c2e5ed 3436
27e498e6 3437void
62c2e5ed
DA
3438free_save_value (Lisp_Object save)
3439{
2b30549c 3440 xfree (XSAVE_POINTER (save, 0));
62c2e5ed
DA
3441 free_misc (save);
3442}
3443
d7a7fda3
DA
3444/* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */
3445
3446Lisp_Object
3447build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist)
3448{
3449 register Lisp_Object overlay;
3450
3451 overlay = allocate_misc (Lisp_Misc_Overlay);
3452 OVERLAY_START (overlay) = start;
3453 OVERLAY_END (overlay) = end;
c644523b 3454 set_overlay_plist (overlay, plist);
d7a7fda3
DA
3455 XOVERLAY (overlay)->next = NULL;
3456 return overlay;
3457}
3458
a7ca3326 3459DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
a6266d23 3460 doc: /* Return a newly allocated marker which does not point at any place. */)
5842a27b 3461 (void)
2e471eb5 3462{
eeaea515
DA
3463 register Lisp_Object val;
3464 register struct Lisp_Marker *p;
7146af97 3465
eeaea515
DA
3466 val = allocate_misc (Lisp_Misc_Marker);
3467 p = XMARKER (val);
3468 p->buffer = 0;
3469 p->bytepos = 0;
3470 p->charpos = 0;
3471 p->next = NULL;
3472 p->insertion_type = 0;
3473 return val;
7146af97 3474}
2e471eb5 3475
657924ff
DA
3476/* Return a newly allocated marker which points into BUF
3477 at character position CHARPOS and byte position BYTEPOS. */
3478
3479Lisp_Object
3480build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos)
3481{
eeaea515
DA
3482 Lisp_Object obj;
3483 struct Lisp_Marker *m;
657924ff
DA
3484
3485 /* No dead buffers here. */
e578f381 3486 eassert (BUFFER_LIVE_P (buf));
657924ff 3487
eeaea515
DA
3488 /* Every character is at least one byte. */
3489 eassert (charpos <= bytepos);
3490
3491 obj = allocate_misc (Lisp_Misc_Marker);
3492 m = XMARKER (obj);
3493 m->buffer = buf;
3494 m->charpos = charpos;
3495 m->bytepos = bytepos;
3496 m->insertion_type = 0;
3497 m->next = BUF_MARKERS (buf);
3498 BUF_MARKERS (buf) = m;
3499 return obj;
657924ff
DA
3500}
3501
2e471eb5
GM
3502/* Put MARKER back on the free list after using it temporarily. */
3503
3504void
971de7fb 3505free_marker (Lisp_Object marker)
2e471eb5 3506{
ef89c2ce 3507 unchain_marker (XMARKER (marker));
7b7990cc 3508 free_misc (marker);
2e471eb5
GM
3509}
3510
c0696668 3511\f
7146af97 3512/* Return a newly created vector or string with specified arguments as
736471d1
RS
3513 elements. If all the arguments are characters that can fit
3514 in a string of events, make a string; otherwise, make a vector.
3515
3516 Any number of arguments, even zero arguments, are allowed. */
7146af97
JB
3517
3518Lisp_Object
971de7fb 3519make_event_array (register int nargs, Lisp_Object *args)
7146af97
JB
3520{
3521 int i;
3522
3523 for (i = 0; i < nargs; i++)
736471d1 3524 /* The things that fit in a string
c9ca4659
RS
3525 are characters that are in 0...127,
3526 after discarding the meta bit and all the bits above it. */
e687453f 3527 if (!INTEGERP (args[i])
c11285dc 3528 || (XINT (args[i]) & ~(-CHAR_META)) >= 0200)
7146af97
JB
3529 return Fvector (nargs, args);
3530
3531 /* Since the loop exited, we know that all the things in it are
3532 characters, so we can make a string. */
3533 {
c13ccad2 3534 Lisp_Object result;
177c0ea7 3535
50aee051 3536 result = Fmake_string (make_number (nargs), make_number (0));
7146af97 3537 for (i = 0; i < nargs; i++)
736471d1 3538 {
46e7e6b0 3539 SSET (result, i, XINT (args[i]));
736471d1
RS
3540 /* Move the meta bit to the right place for a string char. */
3541 if (XINT (args[i]) & CHAR_META)
46e7e6b0 3542 SSET (result, i, SREF (result, i) | 0x80);
736471d1 3543 }
177c0ea7 3544
7146af97
JB
3545 return result;
3546 }
3547}
2e471eb5
GM
3548
3549
7146af97 3550\f
24d8a105
RS
3551/************************************************************************
3552 Memory Full Handling
3553 ************************************************************************/
3554
3555
531b0165
PE
3556/* Called if malloc (NBYTES) returns zero. If NBYTES == SIZE_MAX,
3557 there may have been size_t overflow so that malloc was never
3558 called, or perhaps malloc was invoked successfully but the
3559 resulting pointer had problems fitting into a tagged EMACS_INT. In
3560 either case this counts as memory being full even though malloc did
3561 not fail. */
24d8a105
RS
3562
3563void
531b0165 3564memory_full (size_t nbytes)
24d8a105 3565{
531b0165 3566 /* Do not go into hysterics merely because a large request failed. */
fce31d69 3567 bool enough_free_memory = 0;
2b6148e4 3568 if (SPARE_MEMORY < nbytes)
531b0165 3569 {
66606eea
PE
3570 void *p;
3571
3572 MALLOC_BLOCK_INPUT;
3573 p = malloc (SPARE_MEMORY);
531b0165
PE
3574 if (p)
3575 {
4d09bcf6 3576 free (p);
531b0165
PE
3577 enough_free_memory = 1;
3578 }
66606eea 3579 MALLOC_UNBLOCK_INPUT;
531b0165 3580 }
24d8a105 3581
531b0165
PE
3582 if (! enough_free_memory)
3583 {
3584 int i;
24d8a105 3585
531b0165
PE
3586 Vmemory_full = Qt;
3587
3588 memory_full_cons_threshold = sizeof (struct cons_block);
3589
3590 /* The first time we get here, free the spare memory. */
3591 for (i = 0; i < sizeof (spare_memory) / sizeof (char *); i++)
3592 if (spare_memory[i])
3593 {
3594 if (i == 0)
3595 free (spare_memory[i]);
3596 else if (i >= 1 && i <= 4)
3597 lisp_align_free (spare_memory[i]);
3598 else
3599 lisp_free (spare_memory[i]);
3600 spare_memory[i] = 0;
3601 }
531b0165 3602 }
24d8a105
RS
3603
3604 /* This used to call error, but if we've run out of memory, we could
3605 get infinite recursion trying to build the string. */
9b306d37 3606 xsignal (Qnil, Vmemory_signal_data);
24d8a105
RS
3607}
3608
3609/* If we released our reserve (due to running out of memory),
3610 and we have a fair amount free once again,
3611 try to set aside another reserve in case we run out once more.
3612
3613 This is called when a relocatable block is freed in ralloc.c,
3614 and also directly from this file, in case we're not using ralloc.c. */
3615
3616void
971de7fb 3617refill_memory_reserve (void)
24d8a105
RS
3618{
3619#ifndef SYSTEM_MALLOC
3620 if (spare_memory[0] == 0)
38182d90 3621 spare_memory[0] = malloc (SPARE_MEMORY);
24d8a105 3622 if (spare_memory[1] == 0)
38182d90 3623 spare_memory[1] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3624 MEM_TYPE_SPARE);
24d8a105 3625 if (spare_memory[2] == 0)
38182d90 3626 spare_memory[2] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3627 MEM_TYPE_SPARE);
24d8a105 3628 if (spare_memory[3] == 0)
38182d90 3629 spare_memory[3] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3630 MEM_TYPE_SPARE);
24d8a105 3631 if (spare_memory[4] == 0)
38182d90 3632 spare_memory[4] = lisp_align_malloc (sizeof (struct cons_block),
35aaa1ea 3633 MEM_TYPE_SPARE);
24d8a105 3634 if (spare_memory[5] == 0)
38182d90 3635 spare_memory[5] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3636 MEM_TYPE_SPARE);
24d8a105 3637 if (spare_memory[6] == 0)
38182d90 3638 spare_memory[6] = lisp_malloc (sizeof (struct string_block),
35aaa1ea 3639 MEM_TYPE_SPARE);
24d8a105
RS
3640 if (spare_memory[0] && spare_memory[1] && spare_memory[5])
3641 Vmemory_full = Qnil;
3642#endif
3643}
3644\f
34400008
GM
3645/************************************************************************
3646 C Stack Marking
3647 ************************************************************************/
3648
13c844fb
GM
3649#if GC_MARK_STACK || defined GC_MALLOC_CHECK
3650
71cf5fa0
GM
3651/* Conservative C stack marking requires a method to identify possibly
3652 live Lisp objects given a pointer value. We do this by keeping
3653 track of blocks of Lisp data that are allocated in a red-black tree
3654 (see also the comment of mem_node which is the type of nodes in
3655 that tree). Function lisp_malloc adds information for an allocated
3656 block to the red-black tree with calls to mem_insert, and function
3657 lisp_free removes it with mem_delete. Functions live_string_p etc
3658 call mem_find to lookup information about a given pointer in the
3659 tree, and use that to determine if the pointer points to a Lisp
3660 object or not. */
3661
34400008
GM
3662/* Initialize this part of alloc.c. */
3663
3664static void
971de7fb 3665mem_init (void)
34400008
GM
3666{
3667 mem_z.left = mem_z.right = MEM_NIL;
3668 mem_z.parent = NULL;
3669 mem_z.color = MEM_BLACK;
3670 mem_z.start = mem_z.end = NULL;
3671 mem_root = MEM_NIL;
3672}
3673
3674
3675/* Value is a pointer to the mem_node containing START. Value is
3676 MEM_NIL if there is no node in the tree containing START. */
3677
b0ab8123 3678static struct mem_node *
971de7fb 3679mem_find (void *start)
34400008
GM
3680{
3681 struct mem_node *p;
3682
ece93c02
GM
3683 if (start < min_heap_address || start > max_heap_address)
3684 return MEM_NIL;
3685
34400008
GM
3686 /* Make the search always successful to speed up the loop below. */
3687 mem_z.start = start;
3688 mem_z.end = (char *) start + 1;
3689
3690 p = mem_root;
3691 while (start < p->start || start >= p->end)
3692 p = start < p->start ? p->left : p->right;
3693 return p;
3694}
3695
3696
3697/* Insert a new node into the tree for a block of memory with start
3698 address START, end address END, and type TYPE. Value is a
3699 pointer to the node that was inserted. */
3700
3701static struct mem_node *
971de7fb 3702mem_insert (void *start, void *end, enum mem_type type)
34400008
GM
3703{
3704 struct mem_node *c, *parent, *x;
3705
add3c3ea 3706 if (min_heap_address == NULL || start < min_heap_address)
ece93c02 3707 min_heap_address = start;
add3c3ea 3708 if (max_heap_address == NULL || end > max_heap_address)
ece93c02
GM
3709 max_heap_address = end;
3710
34400008
GM
3711 /* See where in the tree a node for START belongs. In this
3712 particular application, it shouldn't happen that a node is already
3713 present. For debugging purposes, let's check that. */
3714 c = mem_root;
3715 parent = NULL;
3716
3717#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
177c0ea7 3718
34400008
GM
3719 while (c != MEM_NIL)
3720 {
3721 if (start >= c->start && start < c->end)
1088b922 3722 emacs_abort ();
34400008
GM
3723 parent = c;
3724 c = start < c->start ? c->left : c->right;
3725 }
177c0ea7 3726
34400008 3727#else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
177c0ea7 3728
34400008
GM
3729 while (c != MEM_NIL)
3730 {
3731 parent = c;
3732 c = start < c->start ? c->left : c->right;
3733 }
177c0ea7 3734
34400008
GM
3735#endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
3736
3737 /* Create a new node. */
877935b1 3738#ifdef GC_MALLOC_CHECK
0caaedb1 3739 x = malloc (sizeof *x);
877935b1 3740 if (x == NULL)
1088b922 3741 emacs_abort ();
877935b1 3742#else
23f86fce 3743 x = xmalloc (sizeof *x);
877935b1 3744#endif
34400008
GM
3745 x->start = start;
3746 x->end = end;
3747 x->type = type;
3748 x->parent = parent;
3749 x->left = x->right = MEM_NIL;
3750 x->color = MEM_RED;
3751
3752 /* Insert it as child of PARENT or install it as root. */
3753 if (parent)
3754 {
3755 if (start < parent->start)
3756 parent->left = x;
3757 else
3758 parent->right = x;
3759 }
177c0ea7 3760 else
34400008
GM
3761 mem_root = x;
3762
3763 /* Re-establish red-black tree properties. */
3764 mem_insert_fixup (x);
877935b1 3765
34400008
GM
3766 return x;
3767}
3768
3769
3770/* Re-establish the red-black properties of the tree, and thereby
3771 balance the tree, after node X has been inserted; X is always red. */
3772
3773static void
971de7fb 3774mem_insert_fixup (struct mem_node *x)
34400008
GM
3775{
3776 while (x != mem_root && x->parent->color == MEM_RED)
3777 {
3778 /* X is red and its parent is red. This is a violation of
3779 red-black tree property #3. */
177c0ea7 3780
34400008
GM
3781 if (x->parent == x->parent->parent->left)
3782 {
3783 /* We're on the left side of our grandparent, and Y is our
3784 "uncle". */
3785 struct mem_node *y = x->parent->parent->right;
177c0ea7 3786
34400008
GM
3787 if (y->color == MEM_RED)
3788 {
3789 /* Uncle and parent are red but should be black because
3790 X is red. Change the colors accordingly and proceed
3791 with the grandparent. */
3792 x->parent->color = MEM_BLACK;
3793 y->color = MEM_BLACK;
3794 x->parent->parent->color = MEM_RED;
3795 x = x->parent->parent;
3796 }
3797 else
3798 {
3799 /* Parent and uncle have different colors; parent is
3800 red, uncle is black. */
3801 if (x == x->parent->right)
3802 {
3803 x = x->parent;
3804 mem_rotate_left (x);
3805 }
3806
3807 x->parent->color = MEM_BLACK;
3808 x->parent->parent->color = MEM_RED;
3809 mem_rotate_right (x->parent->parent);
3810 }
3811 }
3812 else
3813 {
3814 /* This is the symmetrical case of above. */
3815 struct mem_node *y = x->parent->parent->left;
177c0ea7 3816
34400008
GM
3817 if (y->color == MEM_RED)
3818 {
3819 x->parent->color = MEM_BLACK;
3820 y->color = MEM_BLACK;
3821 x->parent->parent->color = MEM_RED;
3822 x = x->parent->parent;
3823 }
3824 else
3825 {
3826 if (x == x->parent->left)
3827 {
3828 x = x->parent;
3829 mem_rotate_right (x);
3830 }
177c0ea7 3831
34400008
GM
3832 x->parent->color = MEM_BLACK;
3833 x->parent->parent->color = MEM_RED;
3834 mem_rotate_left (x->parent->parent);
3835 }
3836 }
3837 }
3838
3839 /* The root may have been changed to red due to the algorithm. Set
3840 it to black so that property #5 is satisfied. */
3841 mem_root->color = MEM_BLACK;
3842}
3843
3844
177c0ea7
JB
3845/* (x) (y)
3846 / \ / \
34400008
GM
3847 a (y) ===> (x) c
3848 / \ / \
3849 b c a b */
3850
3851static void
971de7fb 3852mem_rotate_left (struct mem_node *x)
34400008
GM
3853{
3854 struct mem_node *y;
3855
3856 /* Turn y's left sub-tree into x's right sub-tree. */
3857 y = x->right;
3858 x->right = y->left;
3859 if (y->left != MEM_NIL)
3860 y->left->parent = x;
3861
3862 /* Y's parent was x's parent. */
3863 if (y != MEM_NIL)
3864 y->parent = x->parent;
3865
3866 /* Get the parent to point to y instead of x. */
3867 if (x->parent)
3868 {
3869 if (x == x->parent->left)
3870 x->parent->left = y;
3871 else
3872 x->parent->right = y;
3873 }
3874 else
3875 mem_root = y;
3876
3877 /* Put x on y's left. */
3878 y->left = x;
3879 if (x != MEM_NIL)
3880 x->parent = y;
3881}
3882
3883
177c0ea7
JB
3884/* (x) (Y)
3885 / \ / \
3886 (y) c ===> a (x)
3887 / \ / \
34400008
GM
3888 a b b c */
3889
3890static void
971de7fb 3891mem_rotate_right (struct mem_node *x)
34400008
GM
3892{
3893 struct mem_node *y = x->left;
3894
3895 x->left = y->right;
3896 if (y->right != MEM_NIL)
3897 y->right->parent = x;
177c0ea7 3898
34400008
GM
3899 if (y != MEM_NIL)
3900 y->parent = x->parent;
3901 if (x->parent)
3902 {
3903 if (x == x->parent->right)
3904 x->parent->right = y;
3905 else
3906 x->parent->left = y;
3907 }
3908 else
3909 mem_root = y;
177c0ea7 3910
34400008
GM
3911 y->right = x;
3912 if (x != MEM_NIL)
3913 x->parent = y;
3914}
3915
3916
3917/* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
3918
3919static void
971de7fb 3920mem_delete (struct mem_node *z)
34400008
GM
3921{
3922 struct mem_node *x, *y;
3923
3924 if (!z || z == MEM_NIL)
3925 return;
3926
3927 if (z->left == MEM_NIL || z->right == MEM_NIL)
3928 y = z;
3929 else
3930 {
3931 y = z->right;
3932 while (y->left != MEM_NIL)
3933 y = y->left;
3934 }
3935
3936 if (y->left != MEM_NIL)
3937 x = y->left;
3938 else
3939 x = y->right;
3940
3941 x->parent = y->parent;
3942 if (y->parent)
3943 {
3944 if (y == y->parent->left)
3945 y->parent->left = x;
3946 else
3947 y->parent->right = x;
3948 }
3949 else
3950 mem_root = x;
3951
3952 if (y != z)
3953 {
3954 z->start = y->start;
3955 z->end = y->end;
3956 z->type = y->type;
3957 }
177c0ea7 3958
34400008
GM
3959 if (y->color == MEM_BLACK)
3960 mem_delete_fixup (x);
877935b1
GM
3961
3962#ifdef GC_MALLOC_CHECK
0caaedb1 3963 free (y);
877935b1 3964#else
34400008 3965 xfree (y);
877935b1 3966#endif
34400008
GM
3967}
3968
3969
3970/* Re-establish the red-black properties of the tree, after a
3971 deletion. */
3972
3973static void
971de7fb 3974mem_delete_fixup (struct mem_node *x)
34400008
GM
3975{
3976 while (x != mem_root && x->color == MEM_BLACK)
3977 {
3978 if (x == x->parent->left)
3979 {
3980 struct mem_node *w = x->parent->right;
177c0ea7 3981
34400008
GM
3982 if (w->color == MEM_RED)
3983 {
3984 w->color = MEM_BLACK;
3985 x->parent->color = MEM_RED;
3986 mem_rotate_left (x->parent);
3987 w = x->parent->right;
3988 }
177c0ea7 3989
34400008
GM
3990 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
3991 {
3992 w->color = MEM_RED;
3993 x = x->parent;
3994 }
3995 else
3996 {
3997 if (w->right->color == MEM_BLACK)
3998 {
3999 w->left->color = MEM_BLACK;
4000 w->color = MEM_RED;
4001 mem_rotate_right (w);
4002 w = x->parent->right;
4003 }
4004 w->color = x->parent->color;
4005 x->parent->color = MEM_BLACK;
4006 w->right->color = MEM_BLACK;
4007 mem_rotate_left (x->parent);
4008 x = mem_root;
4009 }
4010 }
4011 else
4012 {
4013 struct mem_node *w = x->parent->left;
177c0ea7 4014
34400008
GM
4015 if (w->color == MEM_RED)
4016 {
4017 w->color = MEM_BLACK;
4018 x->parent->color = MEM_RED;
4019 mem_rotate_right (x->parent);
4020 w = x->parent->left;
4021 }
177c0ea7 4022
34400008
GM
4023 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
4024 {
4025 w->color = MEM_RED;
4026 x = x->parent;
4027 }
4028 else
4029 {
4030 if (w->left->color == MEM_BLACK)
4031 {
4032 w->right->color = MEM_BLACK;
4033 w->color = MEM_RED;
4034 mem_rotate_left (w);
4035 w = x->parent->left;
4036 }
177c0ea7 4037
34400008
GM
4038 w->color = x->parent->color;
4039 x->parent->color = MEM_BLACK;
4040 w->left->color = MEM_BLACK;
4041 mem_rotate_right (x->parent);
4042 x = mem_root;
4043 }
4044 }
4045 }
177c0ea7 4046
34400008
GM
4047 x->color = MEM_BLACK;
4048}
4049
4050
4051/* Value is non-zero if P is a pointer to a live Lisp string on
4052 the heap. M is a pointer to the mem_block for P. */
4053
b0ab8123 4054static bool
971de7fb 4055live_string_p (struct mem_node *m, void *p)
34400008
GM
4056{
4057 if (m->type == MEM_TYPE_STRING)
4058 {
4059 struct string_block *b = (struct string_block *) m->start;
14162469 4060 ptrdiff_t offset = (char *) p - (char *) &b->strings[0];
34400008
GM
4061
4062 /* P must point to the start of a Lisp_String structure, and it
4063 must not be on the free-list. */
176bc847
GM
4064 return (offset >= 0
4065 && offset % sizeof b->strings[0] == 0
6b61353c 4066 && offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
34400008
GM
4067 && ((struct Lisp_String *) p)->data != NULL);
4068 }
4069 else
4070 return 0;
4071}
4072
4073
4074/* Value is non-zero if P is a pointer to a live Lisp cons on
4075 the heap. M is a pointer to the mem_block for P. */
4076
b0ab8123 4077static bool
971de7fb 4078live_cons_p (struct mem_node *m, void *p)
34400008
GM
4079{
4080 if (m->type == MEM_TYPE_CONS)
4081 {
4082 struct cons_block *b = (struct cons_block *) m->start;
14162469 4083 ptrdiff_t offset = (char *) p - (char *) &b->conses[0];
34400008
GM
4084
4085 /* P must point to the start of a Lisp_Cons, not be
4086 one of the unused cells in the current cons block,
4087 and not be on the free-list. */
176bc847
GM
4088 return (offset >= 0
4089 && offset % sizeof b->conses[0] == 0
6b61353c 4090 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
34400008
GM
4091 && (b != cons_block
4092 || offset / sizeof b->conses[0] < cons_block_index)
c644523b 4093 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
34400008
GM
4094 }
4095 else
4096 return 0;
4097}
4098
4099
4100/* Value is non-zero if P is a pointer to a live Lisp symbol on
4101 the heap. M is a pointer to the mem_block for P. */
4102
b0ab8123 4103static bool
971de7fb 4104live_symbol_p (struct mem_node *m, void *p)
34400008
GM
4105{
4106 if (m->type == MEM_TYPE_SYMBOL)
4107 {
4108 struct symbol_block *b = (struct symbol_block *) m->start;
14162469 4109 ptrdiff_t offset = (char *) p - (char *) &b->symbols[0];
177c0ea7 4110
34400008
GM
4111 /* P must point to the start of a Lisp_Symbol, not be
4112 one of the unused cells in the current symbol block,
4113 and not be on the free-list. */
176bc847
GM
4114 return (offset >= 0
4115 && offset % sizeof b->symbols[0] == 0
6b61353c 4116 && offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
34400008
GM
4117 && (b != symbol_block
4118 || offset / sizeof b->symbols[0] < symbol_block_index)
c644523b 4119 && !EQ (((struct Lisp_Symbol *)p)->function, Vdead));
34400008
GM
4120 }
4121 else
4122 return 0;
4123}
4124
4125
4126/* Value is non-zero if P is a pointer to a live Lisp float on
4127 the heap. M is a pointer to the mem_block for P. */
4128
b0ab8123 4129static bool
971de7fb 4130live_float_p (struct mem_node *m, void *p)
34400008
GM
4131{
4132 if (m->type == MEM_TYPE_FLOAT)
4133 {
4134 struct float_block *b = (struct float_block *) m->start;
14162469 4135 ptrdiff_t offset = (char *) p - (char *) &b->floats[0];
177c0ea7 4136
ab6780cd
SM
4137 /* P must point to the start of a Lisp_Float and not be
4138 one of the unused cells in the current float block. */
176bc847
GM
4139 return (offset >= 0
4140 && offset % sizeof b->floats[0] == 0
6b61353c 4141 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
34400008 4142 && (b != float_block
ab6780cd 4143 || offset / sizeof b->floats[0] < float_block_index));
34400008
GM
4144 }
4145 else
4146 return 0;
4147}
4148
4149
4150/* Value is non-zero if P is a pointer to a live Lisp Misc on
4151 the heap. M is a pointer to the mem_block for P. */
4152
b0ab8123 4153static bool
971de7fb 4154live_misc_p (struct mem_node *m, void *p)
34400008
GM
4155{
4156 if (m->type == MEM_TYPE_MISC)
4157 {
4158 struct marker_block *b = (struct marker_block *) m->start;
14162469 4159 ptrdiff_t offset = (char *) p - (char *) &b->markers[0];
177c0ea7 4160
34400008
GM
4161 /* P must point to the start of a Lisp_Misc, not be
4162 one of the unused cells in the current misc block,
4163 and not be on the free-list. */
176bc847
GM
4164 return (offset >= 0
4165 && offset % sizeof b->markers[0] == 0
6b61353c 4166 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
34400008
GM
4167 && (b != marker_block
4168 || offset / sizeof b->markers[0] < marker_block_index)
d314756e 4169 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free);
34400008
GM
4170 }
4171 else
4172 return 0;
4173}
4174
4175
4176/* Value is non-zero if P is a pointer to a live vector-like object.
4177 M is a pointer to the mem_block for P. */
4178
b0ab8123 4179static bool
971de7fb 4180live_vector_p (struct mem_node *m, void *p)
34400008 4181{
f3372c87
DA
4182 if (m->type == MEM_TYPE_VECTOR_BLOCK)
4183 {
4184 /* This memory node corresponds to a vector block. */
4185 struct vector_block *block = (struct vector_block *) m->start;
4186 struct Lisp_Vector *vector = (struct Lisp_Vector *) block->data;
4187
4188 /* P is in the block's allocation range. Scan the block
4189 up to P and see whether P points to the start of some
4190 vector which is not on a free list. FIXME: check whether
4191 some allocation patterns (probably a lot of short vectors)
4192 may cause a substantial overhead of this loop. */
4193 while (VECTOR_IN_BLOCK (vector, block)
4194 && vector <= (struct Lisp_Vector *) p)
4195 {
914adc42 4196 if (!PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FREE) && vector == p)
f3372c87
DA
4197 return 1;
4198 else
914adc42 4199 vector = ADVANCE (vector, vector_nbytes (vector));
f3372c87
DA
4200 }
4201 }
914adc42
DA
4202 else if (m->type == MEM_TYPE_VECTORLIKE
4203 && (char *) p == ((char *) m->start
4204 + offsetof (struct large_vector, v)))
f3372c87
DA
4205 /* This memory node corresponds to a large vector. */
4206 return 1;
4207 return 0;
34400008
GM
4208}
4209
4210
2336fe58 4211/* Value is non-zero if P is a pointer to a live buffer. M is a
34400008
GM
4212 pointer to the mem_block for P. */
4213
b0ab8123 4214static bool
971de7fb 4215live_buffer_p (struct mem_node *m, void *p)
34400008
GM
4216{
4217 /* P must point to the start of the block, and the buffer
4218 must not have been killed. */
4219 return (m->type == MEM_TYPE_BUFFER
4220 && p == m->start
e34f7f79 4221 && !NILP (((struct buffer *) p)->INTERNAL_FIELD (name)));
34400008
GM
4222}
4223
13c844fb
GM
4224#endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
4225
4226#if GC_MARK_STACK
4227
34400008
GM
4228#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4229
4230/* Array of objects that are kept alive because the C stack contains
4231 a pattern that looks like a reference to them . */
4232
4233#define MAX_ZOMBIES 10
4234static Lisp_Object zombies[MAX_ZOMBIES];
4235
4236/* Number of zombie objects. */
4237
211a0b2a 4238static EMACS_INT nzombies;
34400008
GM
4239
4240/* Number of garbage collections. */
4241
211a0b2a 4242static EMACS_INT ngcs;
34400008
GM
4243
4244/* Average percentage of zombies per collection. */
4245
4246static double avg_zombies;
4247
4248/* Max. number of live and zombie objects. */
4249
211a0b2a 4250static EMACS_INT max_live, max_zombies;
34400008
GM
4251
4252/* Average number of live objects per GC. */
4253
4254static double avg_live;
4255
a7ca3326 4256DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
7ee72033 4257 doc: /* Show information about live and zombie objects. */)
5842a27b 4258 (void)
34400008 4259{
83fc9c63 4260 Lisp_Object args[8], zombie_list = Qnil;
211a0b2a 4261 EMACS_INT i;
6e4b3fbe 4262 for (i = 0; i < min (MAX_ZOMBIES, nzombies); i++)
83fc9c63
DL
4263 zombie_list = Fcons (zombies[i], zombie_list);
4264 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
34400008
GM
4265 args[1] = make_number (ngcs);
4266 args[2] = make_float (avg_live);
4267 args[3] = make_float (avg_zombies);
4268 args[4] = make_float (avg_zombies / avg_live / 100);
4269 args[5] = make_number (max_live);
4270 args[6] = make_number (max_zombies);
83fc9c63
DL
4271 args[7] = zombie_list;
4272 return Fmessage (8, args);
34400008
GM
4273}
4274
4275#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4276
4277
182ff242
GM
4278/* Mark OBJ if we can prove it's a Lisp_Object. */
4279
b0ab8123 4280static void
971de7fb 4281mark_maybe_object (Lisp_Object obj)
182ff242 4282{
b609f591
YM
4283 void *po;
4284 struct mem_node *m;
4285
4286 if (INTEGERP (obj))
4287 return;
4288
4289 po = (void *) XPNTR (obj);
4290 m = mem_find (po);
177c0ea7 4291
182ff242
GM
4292 if (m != MEM_NIL)
4293 {
fce31d69 4294 bool mark_p = 0;
182ff242 4295
8e50cc2d 4296 switch (XTYPE (obj))
182ff242
GM
4297 {
4298 case Lisp_String:
4299 mark_p = (live_string_p (m, po)
4300 && !STRING_MARKED_P ((struct Lisp_String *) po));
4301 break;
4302
4303 case Lisp_Cons:
08b7c2cb 4304 mark_p = (live_cons_p (m, po) && !CONS_MARKED_P (XCONS (obj)));
182ff242
GM
4305 break;
4306
4307 case Lisp_Symbol:
2336fe58 4308 mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
182ff242
GM
4309 break;
4310
4311 case Lisp_Float:
ab6780cd 4312 mark_p = (live_float_p (m, po) && !FLOAT_MARKED_P (XFLOAT (obj)));
182ff242
GM
4313 break;
4314
4315 case Lisp_Vectorlike:
8e50cc2d 4316 /* Note: can't check BUFFERP before we know it's a
182ff242
GM
4317 buffer because checking that dereferences the pointer
4318 PO which might point anywhere. */
4319 if (live_vector_p (m, po))
8e50cc2d 4320 mark_p = !SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj));
182ff242 4321 else if (live_buffer_p (m, po))
8e50cc2d 4322 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
182ff242
GM
4323 break;
4324
4325 case Lisp_Misc:
67ee9f6e 4326 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit);
182ff242 4327 break;
6bbd7a29 4328
2de9f71c 4329 default:
6bbd7a29 4330 break;
182ff242
GM
4331 }
4332
4333 if (mark_p)
4334 {
4335#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4336 if (nzombies < MAX_ZOMBIES)
83fc9c63 4337 zombies[nzombies] = obj;
182ff242
GM
4338 ++nzombies;
4339#endif
49723c04 4340 mark_object (obj);
182ff242
GM
4341 }
4342 }
4343}
ece93c02
GM
4344
4345
4346/* If P points to Lisp data, mark that as live if it isn't already
4347 marked. */
4348
b0ab8123 4349static void
971de7fb 4350mark_maybe_pointer (void *p)
ece93c02
GM
4351{
4352 struct mem_node *m;
4353
bfe3e0a2 4354 /* Quickly rule out some values which can't point to Lisp data.
2b90362b 4355 USE_LSB_TAG needs Lisp data to be aligned on multiples of GCALIGNMENT.
bfe3e0a2 4356 Otherwise, assume that Lisp data is aligned on even addresses. */
2b90362b 4357 if ((intptr_t) p % (USE_LSB_TAG ? GCALIGNMENT : 2))
ece93c02 4358 return;
177c0ea7 4359
ece93c02
GM
4360 m = mem_find (p);
4361 if (m != MEM_NIL)
4362 {
4363 Lisp_Object obj = Qnil;
177c0ea7 4364
ece93c02
GM
4365 switch (m->type)
4366 {
4367 case MEM_TYPE_NON_LISP:
5474c384 4368 case MEM_TYPE_SPARE:
2fe50224 4369 /* Nothing to do; not a pointer to Lisp memory. */
ece93c02 4370 break;
177c0ea7 4371
ece93c02 4372 case MEM_TYPE_BUFFER:
5e617bc2 4373 if (live_buffer_p (m, p) && !VECTOR_MARKED_P ((struct buffer *)p))
ece93c02
GM
4374 XSETVECTOR (obj, p);
4375 break;
177c0ea7 4376
ece93c02 4377 case MEM_TYPE_CONS:
08b7c2cb 4378 if (live_cons_p (m, p) && !CONS_MARKED_P ((struct Lisp_Cons *) p))
ece93c02
GM
4379 XSETCONS (obj, p);
4380 break;
177c0ea7 4381
ece93c02
GM
4382 case MEM_TYPE_STRING:
4383 if (live_string_p (m, p)
4384 && !STRING_MARKED_P ((struct Lisp_String *) p))
4385 XSETSTRING (obj, p);
4386 break;
4387
4388 case MEM_TYPE_MISC:
2336fe58
SM
4389 if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
4390 XSETMISC (obj, p);
ece93c02 4391 break;
177c0ea7 4392
ece93c02 4393 case MEM_TYPE_SYMBOL:
2336fe58 4394 if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
ece93c02
GM
4395 XSETSYMBOL (obj, p);
4396 break;
177c0ea7 4397
ece93c02 4398 case MEM_TYPE_FLOAT:
ab6780cd 4399 if (live_float_p (m, p) && !FLOAT_MARKED_P (p))
ece93c02
GM
4400 XSETFLOAT (obj, p);
4401 break;
177c0ea7 4402
9c545a55 4403 case MEM_TYPE_VECTORLIKE:
f3372c87 4404 case MEM_TYPE_VECTOR_BLOCK:
ece93c02
GM
4405 if (live_vector_p (m, p))
4406 {
4407 Lisp_Object tem;
4408 XSETVECTOR (tem, p);
8e50cc2d 4409 if (!SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem)))
ece93c02
GM
4410 obj = tem;
4411 }
4412 break;
4413
4414 default:
1088b922 4415 emacs_abort ();
ece93c02
GM
4416 }
4417
8e50cc2d 4418 if (!NILP (obj))
49723c04 4419 mark_object (obj);
ece93c02
GM
4420 }
4421}
4422
4423
e32a5799 4424/* Alignment of pointer values. Use alignof, as it sometimes returns
e3fb2efb
PE
4425 a smaller alignment than GCC's __alignof__ and mark_memory might
4426 miss objects if __alignof__ were used. */
e32a5799 4427#define GC_POINTER_ALIGNMENT alignof (void *)
3164aeac 4428
e3fb2efb
PE
4429/* Define POINTERS_MIGHT_HIDE_IN_OBJECTS to 1 if marking via C pointers does
4430 not suffice, which is the typical case. A host where a Lisp_Object is
4431 wider than a pointer might allocate a Lisp_Object in non-adjacent halves.
4432 If USE_LSB_TAG, the bottom half is not a valid pointer, but it should
4433 suffice to widen it to to a Lisp_Object and check it that way. */
bfe3e0a2
PE
4434#if USE_LSB_TAG || VAL_MAX < UINTPTR_MAX
4435# if !USE_LSB_TAG && VAL_MAX < UINTPTR_MAX >> GCTYPEBITS
e3fb2efb
PE
4436 /* If tag bits straddle pointer-word boundaries, neither mark_maybe_pointer
4437 nor mark_maybe_object can follow the pointers. This should not occur on
4438 any practical porting target. */
4439# error "MSB type bits straddle pointer-word boundaries"
4440# endif
4441 /* Marking via C pointers does not suffice, because Lisp_Objects contain
4442 pointer words that hold pointers ORed with type bits. */
4443# define POINTERS_MIGHT_HIDE_IN_OBJECTS 1
4444#else
4445 /* Marking via C pointers suffices, because Lisp_Objects contain pointer
4446 words that hold unmodified pointers. */
4447# define POINTERS_MIGHT_HIDE_IN_OBJECTS 0
4448#endif
4449
55a314a5
YM
4450/* Mark Lisp objects referenced from the address range START+OFFSET..END
4451 or END+OFFSET..START. */
34400008 4452
177c0ea7 4453static void
3164aeac 4454mark_memory (void *start, void *end)
b41253a3
JW
4455#if defined (__clang__) && defined (__has_feature)
4456#if __has_feature(address_sanitizer)
ed6b3510
JW
4457 /* Do not allow -faddress-sanitizer to check this function, since it
4458 crosses the function stack boundary, and thus would yield many
4459 false positives. */
4460 __attribute__((no_address_safety_analysis))
4461#endif
b41253a3 4462#endif
34400008 4463{
ece93c02 4464 void **pp;
3164aeac 4465 int i;
34400008
GM
4466
4467#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4468 nzombies = 0;
4469#endif
4470
4471 /* Make START the pointer to the start of the memory region,
4472 if it isn't already. */
4473 if (end < start)
4474 {
4475 void *tem = start;
4476 start = end;
4477 end = tem;
4478 }
ece93c02 4479
ece93c02
GM
4480 /* Mark Lisp data pointed to. This is necessary because, in some
4481 situations, the C compiler optimizes Lisp objects away, so that
4482 only a pointer to them remains. Example:
4483
4484 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
7ee72033 4485 ()
ece93c02
GM
4486 {
4487 Lisp_Object obj = build_string ("test");
4488 struct Lisp_String *s = XSTRING (obj);
4489 Fgarbage_collect ();
4490 fprintf (stderr, "test `%s'\n", s->data);
4491 return Qnil;
4492 }
4493
4494 Here, `obj' isn't really used, and the compiler optimizes it
4495 away. The only reference to the life string is through the
4496 pointer `s'. */
177c0ea7 4497
3164aeac
PE
4498 for (pp = start; (void *) pp < end; pp++)
4499 for (i = 0; i < sizeof *pp; i += GC_POINTER_ALIGNMENT)
27f3c637 4500 {
e3fb2efb
PE
4501 void *p = *(void **) ((char *) pp + i);
4502 mark_maybe_pointer (p);
4503 if (POINTERS_MIGHT_HIDE_IN_OBJECTS)
646b5f55 4504 mark_maybe_object (XIL ((intptr_t) p));
27f3c637 4505 }
182ff242
GM
4506}
4507
182ff242
GM
4508#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
4509
fce31d69
PE
4510static bool setjmp_tested_p;
4511static int longjmps_done;
182ff242
GM
4512
4513#define SETJMP_WILL_LIKELY_WORK "\
4514\n\
4515Emacs garbage collector has been changed to use conservative stack\n\
4516marking. Emacs has determined that the method it uses to do the\n\
4517marking will likely work on your system, but this isn't sure.\n\
4518\n\
4519If you are a system-programmer, or can get the help of a local wizard\n\
4520who is, please take a look at the function mark_stack in alloc.c, and\n\
4521verify that the methods used are appropriate for your system.\n\
4522\n\
d191623b 4523Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4524"
4525
4526#define SETJMP_WILL_NOT_WORK "\
4527\n\
4528Emacs garbage collector has been changed to use conservative stack\n\
4529marking. Emacs has determined that the default method it uses to do the\n\
4530marking will not work on your system. We will need a system-dependent\n\
4531solution for your system.\n\
4532\n\
4533Please take a look at the function mark_stack in alloc.c, and\n\
4534try to find a way to make it work on your system.\n\
30f637f8
DL
4535\n\
4536Note that you may get false negatives, depending on the compiler.\n\
4537In particular, you need to use -O with GCC for this test.\n\
4538\n\
d191623b 4539Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4540"
4541
4542
4543/* Perform a quick check if it looks like setjmp saves registers in a
4544 jmp_buf. Print a message to stderr saying so. When this test
4545 succeeds, this is _not_ a proof that setjmp is sufficient for
4546 conservative stack marking. Only the sources or a disassembly
4547 can prove that. */
4548
4549static void
2018939f 4550test_setjmp (void)
182ff242
GM
4551{
4552 char buf[10];
4553 register int x;
0328b6de 4554 sys_jmp_buf jbuf;
182ff242
GM
4555
4556 /* Arrange for X to be put in a register. */
4557 sprintf (buf, "1");
4558 x = strlen (buf);
4559 x = 2 * x - 1;
4560
0328b6de 4561 sys_setjmp (jbuf);
182ff242 4562 if (longjmps_done == 1)
34400008 4563 {
182ff242 4564 /* Came here after the longjmp at the end of the function.
34400008 4565
182ff242
GM
4566 If x == 1, the longjmp has restored the register to its
4567 value before the setjmp, and we can hope that setjmp
4568 saves all such registers in the jmp_buf, although that
4569 isn't sure.
34400008 4570
182ff242
GM
4571 For other values of X, either something really strange is
4572 taking place, or the setjmp just didn't save the register. */
4573
4574 if (x == 1)
4575 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
4576 else
4577 {
4578 fprintf (stderr, SETJMP_WILL_NOT_WORK);
4579 exit (1);
34400008
GM
4580 }
4581 }
182ff242
GM
4582
4583 ++longjmps_done;
4584 x = 2;
4585 if (longjmps_done == 1)
0328b6de 4586 sys_longjmp (jbuf, 1);
34400008
GM
4587}
4588
182ff242
GM
4589#endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
4590
34400008
GM
4591
4592#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4593
4594/* Abort if anything GCPRO'd doesn't survive the GC. */
4595
4596static void
2018939f 4597check_gcpros (void)
34400008
GM
4598{
4599 struct gcpro *p;
f66c7cf8 4600 ptrdiff_t i;
34400008
GM
4601
4602 for (p = gcprolist; p; p = p->next)
4603 for (i = 0; i < p->nvars; ++i)
4604 if (!survives_gc_p (p->var[i]))
92cc28b2
SM
4605 /* FIXME: It's not necessarily a bug. It might just be that the
4606 GCPRO is unnecessary or should release the object sooner. */
1088b922 4607 emacs_abort ();
34400008
GM
4608}
4609
4610#elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4611
4612static void
2018939f 4613dump_zombies (void)
34400008
GM
4614{
4615 int i;
4616
6e4b3fbe 4617 fprintf (stderr, "\nZombies kept alive = %"pI"d:\n", nzombies);
34400008
GM
4618 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
4619 {
4620 fprintf (stderr, " %d = ", i);
4621 debug_print (zombies[i]);
4622 }
4623}
4624
4625#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4626
4627
182ff242
GM
4628/* Mark live Lisp objects on the C stack.
4629
4630 There are several system-dependent problems to consider when
4631 porting this to new architectures:
4632
4633 Processor Registers
4634
4635 We have to mark Lisp objects in CPU registers that can hold local
4636 variables or are used to pass parameters.
4637
4638 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
4639 something that either saves relevant registers on the stack, or
4640 calls mark_maybe_object passing it each register's contents.
4641
4642 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
4643 implementation assumes that calling setjmp saves registers we need
4644 to see in a jmp_buf which itself lies on the stack. This doesn't
4645 have to be true! It must be verified for each system, possibly
4646 by taking a look at the source code of setjmp.
4647
2018939f
AS
4648 If __builtin_unwind_init is available (defined by GCC >= 2.8) we
4649 can use it as a machine independent method to store all registers
4650 to the stack. In this case the macros described in the previous
4651 two paragraphs are not used.
4652
182ff242
GM
4653 Stack Layout
4654
4655 Architectures differ in the way their processor stack is organized.
4656 For example, the stack might look like this
4657
4658 +----------------+
4659 | Lisp_Object | size = 4
4660 +----------------+
4661 | something else | size = 2
4662 +----------------+
4663 | Lisp_Object | size = 4
4664 +----------------+
4665 | ... |
4666
4667 In such a case, not every Lisp_Object will be aligned equally. To
4668 find all Lisp_Object on the stack it won't be sufficient to walk
4669 the stack in steps of 4 bytes. Instead, two passes will be
4670 necessary, one starting at the start of the stack, and a second
4671 pass starting at the start of the stack + 2. Likewise, if the
4672 minimal alignment of Lisp_Objects on the stack is 1, four passes
4673 would be necessary, each one starting with one byte more offset
c9af454e 4674 from the stack start. */
34400008
GM
4675
4676static void
971de7fb 4677mark_stack (void)
34400008 4678{
34400008
GM
4679 void *end;
4680
2018939f
AS
4681#ifdef HAVE___BUILTIN_UNWIND_INIT
4682 /* Force callee-saved registers and register windows onto the stack.
4683 This is the preferred method if available, obviating the need for
4684 machine dependent methods. */
4685 __builtin_unwind_init ();
4686 end = &end;
4687#else /* not HAVE___BUILTIN_UNWIND_INIT */
dff45157
PE
4688#ifndef GC_SAVE_REGISTERS_ON_STACK
4689 /* jmp_buf may not be aligned enough on darwin-ppc64 */
4690 union aligned_jmpbuf {
4691 Lisp_Object o;
0328b6de 4692 sys_jmp_buf j;
dff45157 4693 } j;
fce31d69 4694 volatile bool stack_grows_down_p = (char *) &j > (char *) stack_base;
dff45157 4695#endif
34400008
GM
4696 /* This trick flushes the register windows so that all the state of
4697 the process is contained in the stack. */
ab6780cd 4698 /* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
422eec7e
DL
4699 needed on ia64 too. See mach_dep.c, where it also says inline
4700 assembler doesn't work with relevant proprietary compilers. */
4a00783e 4701#ifdef __sparc__
4d18a7a2
DN
4702#if defined (__sparc64__) && defined (__FreeBSD__)
4703 /* FreeBSD does not have a ta 3 handler. */
4c1616be
CY
4704 asm ("flushw");
4705#else
34400008 4706 asm ("ta 3");
4c1616be 4707#endif
34400008 4708#endif
177c0ea7 4709
34400008
GM
4710 /* Save registers that we need to see on the stack. We need to see
4711 registers used to hold register variables and registers used to
4712 pass parameters. */
4713#ifdef GC_SAVE_REGISTERS_ON_STACK
4714 GC_SAVE_REGISTERS_ON_STACK (end);
182ff242 4715#else /* not GC_SAVE_REGISTERS_ON_STACK */
177c0ea7 4716
182ff242
GM
4717#ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
4718 setjmp will definitely work, test it
4719 and print a message with the result
4720 of the test. */
4721 if (!setjmp_tested_p)
4722 {
4723 setjmp_tested_p = 1;
4724 test_setjmp ();
4725 }
4726#endif /* GC_SETJMP_WORKS */
177c0ea7 4727
0328b6de 4728 sys_setjmp (j.j);
34400008 4729 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
182ff242 4730#endif /* not GC_SAVE_REGISTERS_ON_STACK */
2018939f 4731#endif /* not HAVE___BUILTIN_UNWIND_INIT */
34400008
GM
4732
4733 /* This assumes that the stack is a contiguous region in memory. If
182ff242
GM
4734 that's not the case, something has to be done here to iterate
4735 over the stack segments. */
3164aeac
PE
4736 mark_memory (stack_base, end);
4737
4dec23ff
AS
4738 /* Allow for marking a secondary stack, like the register stack on the
4739 ia64. */
4740#ifdef GC_MARK_SECONDARY_STACK
4741 GC_MARK_SECONDARY_STACK ();
4742#endif
34400008
GM
4743
4744#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4745 check_gcpros ();
4746#endif
4747}
4748
34400008
GM
4749#endif /* GC_MARK_STACK != 0 */
4750
4751
7ffb6955 4752/* Determine whether it is safe to access memory at address P. */
d3d47262 4753static int
971de7fb 4754valid_pointer_p (void *p)
7ffb6955 4755{
f892cf9c
EZ
4756#ifdef WINDOWSNT
4757 return w32_valid_pointer_p (p, 16);
4758#else
41bed37d 4759 int fd[2];
7ffb6955
KS
4760
4761 /* Obviously, we cannot just access it (we would SEGV trying), so we
4762 trick the o/s to tell us whether p is a valid pointer.
4763 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
4764 not validate p in that case. */
4765
c7ddc792 4766 if (emacs_pipe (fd) == 0)
7ffb6955 4767 {
fce31d69 4768 bool valid = emacs_write (fd[1], (char *) p, 16) == 16;
41bed37d
PE
4769 emacs_close (fd[1]);
4770 emacs_close (fd[0]);
7ffb6955
KS
4771 return valid;
4772 }
4773
4774 return -1;
f892cf9c 4775#endif
7ffb6955 4776}
3cd55735 4777
6cda572a
DA
4778/* Return 2 if OBJ is a killed or special buffer object, 1 if OBJ is a
4779 valid lisp object, 0 if OBJ is NOT a valid lisp object, or -1 if we
4780 cannot validate OBJ. This function can be quite slow, so its primary
4781 use is the manual debugging. The only exception is print_object, where
4782 we use it to check whether the memory referenced by the pointer of
4783 Lisp_Save_Value object contains valid objects. */
3cd55735
KS
4784
4785int
971de7fb 4786valid_lisp_object_p (Lisp_Object obj)
3cd55735 4787{
de7124a7 4788 void *p;
7ffb6955 4789#if GC_MARK_STACK
3cd55735 4790 struct mem_node *m;
de7124a7 4791#endif
3cd55735
KS
4792
4793 if (INTEGERP (obj))
4794 return 1;
4795
4796 p = (void *) XPNTR (obj);
3cd55735
KS
4797 if (PURE_POINTER_P (p))
4798 return 1;
4799
c1ca42ca
DA
4800 if (p == &buffer_defaults || p == &buffer_local_symbols)
4801 return 2;
4802
de7124a7 4803#if !GC_MARK_STACK
7ffb6955 4804 return valid_pointer_p (p);
de7124a7
KS
4805#else
4806
3cd55735
KS
4807 m = mem_find (p);
4808
4809 if (m == MEM_NIL)
7ffb6955
KS
4810 {
4811 int valid = valid_pointer_p (p);
4812 if (valid <= 0)
4813 return valid;
4814
4815 if (SUBRP (obj))
4816 return 1;
4817
4818 return 0;
4819 }
3cd55735
KS
4820
4821 switch (m->type)
4822 {
4823 case MEM_TYPE_NON_LISP:
5474c384 4824 case MEM_TYPE_SPARE:
3cd55735
KS
4825 return 0;
4826
4827 case MEM_TYPE_BUFFER:
c1ca42ca 4828 return live_buffer_p (m, p) ? 1 : 2;
3cd55735
KS
4829
4830 case MEM_TYPE_CONS:
4831 return live_cons_p (m, p);
4832
4833 case MEM_TYPE_STRING:
4834 return live_string_p (m, p);
4835
4836 case MEM_TYPE_MISC:
4837 return live_misc_p (m, p);
4838
4839 case MEM_TYPE_SYMBOL:
4840 return live_symbol_p (m, p);
4841
4842 case MEM_TYPE_FLOAT:
4843 return live_float_p (m, p);
4844
9c545a55 4845 case MEM_TYPE_VECTORLIKE:
f3372c87 4846 case MEM_TYPE_VECTOR_BLOCK:
3cd55735
KS
4847 return live_vector_p (m, p);
4848
4849 default:
4850 break;
4851 }
4852
4853 return 0;
4854#endif
4855}
4856
4857
4858
34400008 4859\f
2e471eb5
GM
4860/***********************************************************************
4861 Pure Storage Management
4862 ***********************************************************************/
4863
1f0b3fd2
GM
4864/* Allocate room for SIZE bytes from pure Lisp storage and return a
4865 pointer to it. TYPE is the Lisp type for which the memory is
e5bc14d4 4866 allocated. TYPE < 0 means it's not used for a Lisp object. */
1f0b3fd2 4867
261cb4bb 4868static void *
971de7fb 4869pure_alloc (size_t size, int type)
1f0b3fd2 4870{
261cb4bb 4871 void *result;
bfe3e0a2 4872#if USE_LSB_TAG
2b90362b 4873 size_t alignment = GCALIGNMENT;
6b61353c 4874#else
e32a5799 4875 size_t alignment = alignof (EMACS_INT);
1f0b3fd2
GM
4876
4877 /* Give Lisp_Floats an extra alignment. */
4878 if (type == Lisp_Float)
e32a5799 4879 alignment = alignof (struct Lisp_Float);
6b61353c 4880#endif
1f0b3fd2 4881
44117420 4882 again:
e5bc14d4
YM
4883 if (type >= 0)
4884 {
4885 /* Allocate space for a Lisp object from the beginning of the free
4886 space with taking account of alignment. */
4887 result = ALIGN (purebeg + pure_bytes_used_lisp, alignment);
4888 pure_bytes_used_lisp = ((char *)result - (char *)purebeg) + size;
4889 }
4890 else
4891 {
4892 /* Allocate space for a non-Lisp object from the end of the free
4893 space. */
4894 pure_bytes_used_non_lisp += size;
4895 result = purebeg + pure_size - pure_bytes_used_non_lisp;
4896 }
4897 pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp;
44117420
KS
4898
4899 if (pure_bytes_used <= pure_size)
4900 return result;
4901
4902 /* Don't allocate a large amount here,
4903 because it might get mmap'd and then its address
4904 might not be usable. */
23f86fce 4905 purebeg = xmalloc (10000);
44117420
KS
4906 pure_size = 10000;
4907 pure_bytes_used_before_overflow += pure_bytes_used - size;
4908 pure_bytes_used = 0;
e5bc14d4 4909 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
44117420 4910 goto again;
1f0b3fd2
GM
4911}
4912
4913
852f8cdc 4914/* Print a warning if PURESIZE is too small. */
9e713715
GM
4915
4916void
971de7fb 4917check_pure_size (void)
9e713715
GM
4918{
4919 if (pure_bytes_used_before_overflow)
c2982e87
PE
4920 message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d"
4921 " bytes needed)"),
4922 pure_bytes_used + pure_bytes_used_before_overflow);
9e713715
GM
4923}
4924
4925
79fd0489
YM
4926/* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
4927 the non-Lisp data pool of the pure storage, and return its start
4928 address. Return NULL if not found. */
4929
4930static char *
d311d28c 4931find_string_data_in_pure (const char *data, ptrdiff_t nbytes)
79fd0489 4932{
14162469 4933 int i;
d311d28c 4934 ptrdiff_t skip, bm_skip[256], last_char_skip, infinity, start, start_max;
2aff7c53 4935 const unsigned char *p;
79fd0489
YM
4936 char *non_lisp_beg;
4937
d311d28c 4938 if (pure_bytes_used_non_lisp <= nbytes)
79fd0489
YM
4939 return NULL;
4940
4941 /* Set up the Boyer-Moore table. */
4942 skip = nbytes + 1;
4943 for (i = 0; i < 256; i++)
4944 bm_skip[i] = skip;
4945
2aff7c53 4946 p = (const unsigned char *) data;
79fd0489
YM
4947 while (--skip > 0)
4948 bm_skip[*p++] = skip;
4949
4950 last_char_skip = bm_skip['\0'];
4951
4952 non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
4953 start_max = pure_bytes_used_non_lisp - (nbytes + 1);
4954
4955 /* See the comments in the function `boyer_moore' (search.c) for the
4956 use of `infinity'. */
4957 infinity = pure_bytes_used_non_lisp + 1;
4958 bm_skip['\0'] = infinity;
4959
2aff7c53 4960 p = (const unsigned char *) non_lisp_beg + nbytes;
79fd0489
YM
4961 start = 0;
4962 do
4963 {
4964 /* Check the last character (== '\0'). */
4965 do
4966 {
4967 start += bm_skip[*(p + start)];
4968 }
4969 while (start <= start_max);
4970
4971 if (start < infinity)
4972 /* Couldn't find the last character. */
4973 return NULL;
4974
4975 /* No less than `infinity' means we could find the last
4976 character at `p[start - infinity]'. */
4977 start -= infinity;
4978
4979 /* Check the remaining characters. */
4980 if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
4981 /* Found. */
4982 return non_lisp_beg + start;
4983
4984 start += last_char_skip;
4985 }
4986 while (start <= start_max);
4987
4988 return NULL;
4989}
4990
4991
2e471eb5
GM
4992/* Return a string allocated in pure space. DATA is a buffer holding
4993 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
fce31d69 4994 means make the result string multibyte.
1a4f1e2c 4995
2e471eb5
GM
4996 Must get an error if pure storage is full, since if it cannot hold
4997 a large string it may be able to hold conses that point to that
4998 string; then the string is not protected from gc. */
7146af97
JB
4999
5000Lisp_Object
14162469 5001make_pure_string (const char *data,
fce31d69 5002 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
7146af97 5003{
2e471eb5 5004 Lisp_Object string;
98c6f1e3 5005 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
90256841 5006 s->data = (unsigned char *) find_string_data_in_pure (data, nbytes);
79fd0489
YM
5007 if (s->data == NULL)
5008 {
98c6f1e3 5009 s->data = pure_alloc (nbytes + 1, -1);
72af86bd 5010 memcpy (s->data, data, nbytes);
79fd0489
YM
5011 s->data[nbytes] = '\0';
5012 }
2e471eb5
GM
5013 s->size = nchars;
5014 s->size_byte = multibyte ? nbytes : -1;
77c7bcb1 5015 s->intervals = NULL;
2e471eb5
GM
5016 XSETSTRING (string, s);
5017 return string;
7146af97
JB
5018}
5019
2a0213a6
DA
5020/* Return a string allocated in pure space. Do not
5021 allocate the string data, just point to DATA. */
a56eaaef
DN
5022
5023Lisp_Object
2a0213a6 5024make_pure_c_string (const char *data, ptrdiff_t nchars)
a56eaaef
DN
5025{
5026 Lisp_Object string;
98c6f1e3 5027 struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
a56eaaef
DN
5028 s->size = nchars;
5029 s->size_byte = -1;
323637a2 5030 s->data = (unsigned char *) data;
77c7bcb1 5031 s->intervals = NULL;
a56eaaef
DN
5032 XSETSTRING (string, s);
5033 return string;
5034}
2e471eb5 5035
34400008
GM
5036/* Return a cons allocated from pure space. Give it pure copies
5037 of CAR as car and CDR as cdr. */
5038
7146af97 5039Lisp_Object
971de7fb 5040pure_cons (Lisp_Object car, Lisp_Object cdr)
7146af97 5041{
98c6f1e3
PE
5042 Lisp_Object new;
5043 struct Lisp_Cons *p = pure_alloc (sizeof *p, Lisp_Cons);
1f0b3fd2 5044 XSETCONS (new, p);
f3fbd155
KR
5045 XSETCAR (new, Fpurecopy (car));
5046 XSETCDR (new, Fpurecopy (cdr));
7146af97
JB
5047 return new;
5048}
5049
7146af97 5050
34400008
GM
5051/* Value is a float object with value NUM allocated from pure space. */
5052
d3d47262 5053static Lisp_Object
971de7fb 5054make_pure_float (double num)
7146af97 5055{
98c6f1e3
PE
5056 Lisp_Object new;
5057 struct Lisp_Float *p = pure_alloc (sizeof *p, Lisp_Float);
1f0b3fd2 5058 XSETFLOAT (new, p);
f601cdf3 5059 XFLOAT_INIT (new, num);
7146af97
JB
5060 return new;
5061}
5062
34400008
GM
5063
5064/* Return a vector with room for LEN Lisp_Objects allocated from
5065 pure space. */
5066
72cb32cf 5067static Lisp_Object
d311d28c 5068make_pure_vector (ptrdiff_t len)
7146af97 5069{
1f0b3fd2 5070 Lisp_Object new;
d06714cb 5071 size_t size = header_size + len * word_size;
98c6f1e3 5072 struct Lisp_Vector *p = pure_alloc (size, Lisp_Vectorlike);
1f0b3fd2 5073 XSETVECTOR (new, p);
eab3844f 5074 XVECTOR (new)->header.size = len;
7146af97
JB
5075 return new;
5076}
5077
34400008 5078
a7ca3326 5079DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
909e3b33 5080 doc: /* Make a copy of object OBJ in pure storage.
228299fa 5081Recursively copies contents of vectors and cons cells.
7ee72033 5082Does not copy symbols. Copies strings without text properties. */)
5842a27b 5083 (register Lisp_Object obj)
7146af97 5084{
265a9e55 5085 if (NILP (Vpurify_flag))
7146af97
JB
5086 return obj;
5087
1f0b3fd2 5088 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5089 return obj;
5090
e9515805
SM
5091 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5092 {
5093 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
5094 if (!NILP (tmp))
5095 return tmp;
5096 }
5097
d6dd74bb 5098 if (CONSP (obj))
e9515805 5099 obj = pure_cons (XCAR (obj), XCDR (obj));
d6dd74bb 5100 else if (FLOATP (obj))
e9515805 5101 obj = make_pure_float (XFLOAT_DATA (obj));
d6dd74bb 5102 else if (STRINGP (obj))
42a5b22f 5103 obj = make_pure_string (SSDATA (obj), SCHARS (obj),
e9515805
SM
5104 SBYTES (obj),
5105 STRING_MULTIBYTE (obj));
876c194c 5106 else if (COMPILEDP (obj) || VECTORP (obj))
d6dd74bb
KH
5107 {
5108 register struct Lisp_Vector *vec;
d311d28c
PE
5109 register ptrdiff_t i;
5110 ptrdiff_t size;
d6dd74bb 5111
77b37c05 5112 size = ASIZE (obj);
7d535c68
KH
5113 if (size & PSEUDOVECTOR_FLAG)
5114 size &= PSEUDOVECTOR_SIZE_MASK;
6b61353c 5115 vec = XVECTOR (make_pure_vector (size));
d6dd74bb 5116 for (i = 0; i < size; i++)
28be1ada 5117 vec->contents[i] = Fpurecopy (AREF (obj, i));
876c194c 5118 if (COMPILEDP (obj))
985773c9 5119 {
876c194c
SM
5120 XSETPVECTYPE (vec, PVEC_COMPILED);
5121 XSETCOMPILED (obj, vec);
985773c9 5122 }
d6dd74bb
KH
5123 else
5124 XSETVECTOR (obj, vec);
7146af97 5125 }
d6dd74bb
KH
5126 else if (MARKERP (obj))
5127 error ("Attempt to copy a marker to pure storage");
e9515805
SM
5128 else
5129 /* Not purified, don't hash-cons. */
5130 return obj;
5131
5132 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
5133 Fputhash (obj, obj, Vpurify_flag);
6bbd7a29
GM
5134
5135 return obj;
7146af97 5136}
2e471eb5 5137
34400008 5138
7146af97 5139\f
34400008
GM
5140/***********************************************************************
5141 Protection from GC
5142 ***********************************************************************/
5143
2e471eb5
GM
5144/* Put an entry in staticvec, pointing at the variable with address
5145 VARADDRESS. */
7146af97
JB
5146
5147void
971de7fb 5148staticpro (Lisp_Object *varaddress)
7146af97 5149{
7146af97 5150 if (staticidx >= NSTATICS)
afb8aa24 5151 fatal ("NSTATICS too small; try increasing and recompiling Emacs.");
4195afc3 5152 staticvec[staticidx++] = varaddress;
7146af97
JB
5153}
5154
7146af97 5155\f
34400008
GM
5156/***********************************************************************
5157 Protection from GC
5158 ***********************************************************************/
1a4f1e2c 5159
e8197642
RS
5160/* Temporarily prevent garbage collection. */
5161
d311d28c 5162ptrdiff_t
971de7fb 5163inhibit_garbage_collection (void)
e8197642 5164{
d311d28c 5165 ptrdiff_t count = SPECPDL_INDEX ();
54defd0d 5166
6349ae4d 5167 specbind (Qgc_cons_threshold, make_number (MOST_POSITIVE_FIXNUM));
e8197642
RS
5168 return count;
5169}
5170
3ab6e069
DA
5171/* Used to avoid possible overflows when
5172 converting from C to Lisp integers. */
5173
b0ab8123 5174static Lisp_Object
3ab6e069
DA
5175bounded_number (EMACS_INT number)
5176{
5177 return make_number (min (MOST_POSITIVE_FIXNUM, number));
5178}
34400008 5179
12b3895d
TM
5180/* Calculate total bytes of live objects. */
5181
5182static size_t
5183total_bytes_of_live_objects (void)
5184{
5185 size_t tot = 0;
5186 tot += total_conses * sizeof (struct Lisp_Cons);
5187 tot += total_symbols * sizeof (struct Lisp_Symbol);
5188 tot += total_markers * sizeof (union Lisp_Misc);
5189 tot += total_string_bytes;
5190 tot += total_vector_slots * word_size;
5191 tot += total_floats * sizeof (struct Lisp_Float);
5192 tot += total_intervals * sizeof (struct interval);
5193 tot += total_strings * sizeof (struct Lisp_String);
5194 return tot;
5195}
5196
a7ca3326 5197DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
7ee72033 5198 doc: /* Reclaim storage for Lisp objects no longer needed.
e1e37596
RS
5199Garbage collection happens automatically if you cons more than
5200`gc-cons-threshold' bytes of Lisp data since previous garbage collection.
5db81e33
SM
5201`garbage-collect' normally returns a list with info on amount of space in use,
5202where each entry has the form (NAME SIZE USED FREE), where:
5203- NAME is a symbol describing the kind of objects this entry represents,
5204- SIZE is the number of bytes used by each one,
5205- USED is the number of those objects that were found live in the heap,
5206- FREE is the number of those objects that are not live but that Emacs
5207 keeps around for future allocations (maybe because it does not know how
5208 to return them to the OS).
e1e37596 5209However, if there was overflow in pure space, `garbage-collect'
999dd333
GM
5210returns nil, because real GC can't be done.
5211See Info node `(elisp)Garbage Collection'. */)
5842a27b 5212 (void)
7146af97 5213{
fce31d69 5214 struct buffer *nextb;
7146af97 5215 char stack_top_variable;
f66c7cf8 5216 ptrdiff_t i;
fce31d69 5217 bool message_p;
d311d28c 5218 ptrdiff_t count = SPECPDL_INDEX ();
dbcf001c 5219 EMACS_TIME start;
fecbd8ff 5220 Lisp_Object retval = Qnil;
12b3895d 5221 size_t tot_before = 0;
2c5bd608 5222
3de0effb 5223 if (abort_on_gc)
1088b922 5224 emacs_abort ();
3de0effb 5225
9e713715
GM
5226 /* Can't GC if pure storage overflowed because we can't determine
5227 if something is a pure object or not. */
5228 if (pure_bytes_used_before_overflow)
5229 return Qnil;
5230
3d80c99f 5231 /* Record this function, so it appears on the profiler's backtraces. */
2f592f95 5232 record_in_backtrace (Qautomatic_gc, &Qnil, 0);
3d80c99f 5233
7e63e0c3 5234 check_cons_list ();
bbc012e0 5235
3c7e66a8
RS
5236 /* Don't keep undo information around forever.
5237 Do this early on, so it is no problem if the user quits. */
52b852c7 5238 FOR_EACH_BUFFER (nextb)
9cd47b72 5239 compact_buffer (nextb);
3c7e66a8 5240
6521894d 5241 if (profiler_memory_running)
12b3895d
TM
5242 tot_before = total_bytes_of_live_objects ();
5243
dbcf001c 5244 start = current_emacs_time ();
3c7e66a8 5245
58595309
KH
5246 /* In case user calls debug_print during GC,
5247 don't let that cause a recursive GC. */
5248 consing_since_gc = 0;
5249
6efc7df7
GM
5250 /* Save what's currently displayed in the echo area. */
5251 message_p = push_message ();
27e498e6 5252 record_unwind_protect_void (pop_message_unwind);
41c28a37 5253
7146af97
JB
5254 /* Save a copy of the contents of the stack, for debugging. */
5255#if MAX_SAVE_STACK > 0
265a9e55 5256 if (NILP (Vpurify_flag))
7146af97 5257 {
dd3f25f7 5258 char *stack;
903fe15d 5259 ptrdiff_t stack_size;
dd3f25f7 5260 if (&stack_top_variable < stack_bottom)
7146af97 5261 {
dd3f25f7
PE
5262 stack = &stack_top_variable;
5263 stack_size = stack_bottom - &stack_top_variable;
5264 }
5265 else
5266 {
5267 stack = stack_bottom;
5268 stack_size = &stack_top_variable - stack_bottom;
5269 }
5270 if (stack_size <= MAX_SAVE_STACK)
7146af97 5271 {
dd3f25f7 5272 if (stack_copy_size < stack_size)
7146af97 5273 {
38182d90 5274 stack_copy = xrealloc (stack_copy, stack_size);
dd3f25f7 5275 stack_copy_size = stack_size;
7146af97 5276 }
dd3f25f7 5277 memcpy (stack_copy, stack, stack_size);
7146af97
JB
5278 }
5279 }
5280#endif /* MAX_SAVE_STACK > 0 */
5281
299585ee 5282 if (garbage_collection_messages)
691c4285 5283 message1_nolog ("Garbage collecting...");
7146af97 5284
4d7e6e51 5285 block_input ();
6e0fca1d 5286
eec7b73d
RS
5287 shrink_regexp_cache ();
5288
7146af97
JB
5289 gc_in_progress = 1;
5290
005ca5c7 5291 /* Mark all the special slots that serve as the roots of accessibility. */
7146af97 5292
c752cfa9
DA
5293 mark_buffer (&buffer_defaults);
5294 mark_buffer (&buffer_local_symbols);
5295
7146af97 5296 for (i = 0; i < staticidx; i++)
49723c04 5297 mark_object (*staticvec[i]);
34400008 5298
2f592f95 5299 mark_specpdl ();
6ed8eeff 5300 mark_terminals ();
126f9c02
SM
5301 mark_kboards ();
5302
5303#ifdef USE_GTK
a411ac43 5304 xg_mark_data ();
126f9c02
SM
5305#endif
5306
34400008
GM
5307#if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
5308 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
5309 mark_stack ();
5310#else
acf5f7d3
SM
5311 {
5312 register struct gcpro *tail;
5313 for (tail = gcprolist; tail; tail = tail->next)
5314 for (i = 0; i < tail->nvars; i++)
005ca5c7 5315 mark_object (tail->var[i]);
acf5f7d3 5316 }
3e21b6a7 5317 mark_byte_stack ();
b286858c
SM
5318 {
5319 struct catchtag *catch;
5320 struct handler *handler;
177c0ea7 5321
7146af97
JB
5322 for (catch = catchlist; catch; catch = catch->next)
5323 {
49723c04
SM
5324 mark_object (catch->tag);
5325 mark_object (catch->val);
177c0ea7 5326 }
7146af97
JB
5327 for (handler = handlerlist; handler; handler = handler->next)
5328 {
49723c04
SM
5329 mark_object (handler->handler);
5330 mark_object (handler->var);
177c0ea7 5331 }
b286858c 5332 }
b286858c 5333#endif
7146af97 5334
454d7973
KS
5335#ifdef HAVE_WINDOW_SYSTEM
5336 mark_fringe_data ();
5337#endif
5338
74c35a48
SM
5339#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5340 mark_stack ();
5341#endif
5342
c37adf23
SM
5343 /* Everything is now marked, except for the things that require special
5344 finalization, i.e. the undo_list.
5345 Look thru every buffer's undo list
4c315bda
RS
5346 for elements that update markers that were not marked,
5347 and delete them. */
52b852c7 5348 FOR_EACH_BUFFER (nextb)
d17337e5
DA
5349 {
5350 /* If a buffer's undo list is Qt, that means that undo is
5351 turned off in that buffer. Calling truncate_undo_list on
5352 Qt tends to return NULL, which effectively turns undo back on.
5353 So don't call truncate_undo_list if undo_list is Qt. */
e34f7f79 5354 if (! EQ (nextb->INTERNAL_FIELD (undo_list), Qt))
d17337e5
DA
5355 {
5356 Lisp_Object tail, prev;
e34f7f79 5357 tail = nextb->INTERNAL_FIELD (undo_list);
d17337e5
DA
5358 prev = Qnil;
5359 while (CONSP (tail))
5360 {
5361 if (CONSP (XCAR (tail))
5362 && MARKERP (XCAR (XCAR (tail)))
5363 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
5364 {
5365 if (NILP (prev))
e34f7f79 5366 nextb->INTERNAL_FIELD (undo_list) = tail = XCDR (tail);
d17337e5
DA
5367 else
5368 {
5369 tail = XCDR (tail);
5370 XSETCDR (prev, tail);
5371 }
5372 }
5373 else
5374 {
5375 prev = tail;
5376 tail = XCDR (tail);
5377 }
5378 }
5379 }
5380 /* Now that we have stripped the elements that need not be in the
5381 undo_list any more, we can finally mark the list. */
e34f7f79 5382 mark_object (nextb->INTERNAL_FIELD (undo_list));
d17337e5 5383 }
4c315bda 5384
7146af97
JB
5385 gc_sweep ();
5386
5387 /* Clear the mark bits that we set in certain root slots. */
5388
033a5fa3 5389 unmark_byte_stack ();
3ef06d12
SM
5390 VECTOR_UNMARK (&buffer_defaults);
5391 VECTOR_UNMARK (&buffer_local_symbols);
7146af97 5392
34400008
GM
5393#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
5394 dump_zombies ();
5395#endif
5396
7e63e0c3 5397 check_cons_list ();
bbc012e0 5398
7146af97
JB
5399 gc_in_progress = 0;
5400
5c747675
DA
5401 unblock_input ();
5402
7146af97 5403 consing_since_gc = 0;
0dd6d66d
DA
5404 if (gc_cons_threshold < GC_DEFAULT_THRESHOLD / 10)
5405 gc_cons_threshold = GC_DEFAULT_THRESHOLD / 10;
7146af97 5406
c0c5c8ae 5407 gc_relative_threshold = 0;
96f077ad
SM
5408 if (FLOATP (Vgc_cons_percentage))
5409 { /* Set gc_cons_combined_threshold. */
12b3895d 5410 double tot = total_bytes_of_live_objects ();
ae35e756 5411
c0c5c8ae 5412 tot *= XFLOAT_DATA (Vgc_cons_percentage);
7216e43b 5413 if (0 < tot)
c0c5c8ae
PE
5414 {
5415 if (tot < TYPE_MAXIMUM (EMACS_INT))
5416 gc_relative_threshold = tot;
5417 else
5418 gc_relative_threshold = TYPE_MAXIMUM (EMACS_INT);
5419 }
96f077ad
SM
5420 }
5421
299585ee
RS
5422 if (garbage_collection_messages)
5423 {
6efc7df7
GM
5424 if (message_p || minibuf_level > 0)
5425 restore_message ();
299585ee
RS
5426 else
5427 message1_nolog ("Garbage collecting...done");
5428 }
7146af97 5429
98edb5ff 5430 unbind_to (count, Qnil);
fecbd8ff
SM
5431 {
5432 Lisp_Object total[11];
5433 int total_size = 10;
2e471eb5 5434
fecbd8ff
SM
5435 total[0] = list4 (Qconses, make_number (sizeof (struct Lisp_Cons)),
5436 bounded_number (total_conses),
5437 bounded_number (total_free_conses));
3ab6e069 5438
fecbd8ff
SM
5439 total[1] = list4 (Qsymbols, make_number (sizeof (struct Lisp_Symbol)),
5440 bounded_number (total_symbols),
5441 bounded_number (total_free_symbols));
3ab6e069 5442
fecbd8ff
SM
5443 total[2] = list4 (Qmiscs, make_number (sizeof (union Lisp_Misc)),
5444 bounded_number (total_markers),
5445 bounded_number (total_free_markers));
3ab6e069 5446
fecbd8ff
SM
5447 total[3] = list4 (Qstrings, make_number (sizeof (struct Lisp_String)),
5448 bounded_number (total_strings),
5449 bounded_number (total_free_strings));
3ab6e069 5450
fecbd8ff
SM
5451 total[4] = list3 (Qstring_bytes, make_number (1),
5452 bounded_number (total_string_bytes));
3ab6e069 5453
fbe9e0b9
PE
5454 total[5] = list3 (Qvectors,
5455 make_number (header_size + sizeof (Lisp_Object)),
fecbd8ff 5456 bounded_number (total_vectors));
5b835e1d 5457
fecbd8ff
SM
5458 total[6] = list4 (Qvector_slots, make_number (word_size),
5459 bounded_number (total_vector_slots),
5460 bounded_number (total_free_vector_slots));
5b835e1d 5461
fecbd8ff
SM
5462 total[7] = list4 (Qfloats, make_number (sizeof (struct Lisp_Float)),
5463 bounded_number (total_floats),
5464 bounded_number (total_free_floats));
3ab6e069 5465
fecbd8ff
SM
5466 total[8] = list4 (Qintervals, make_number (sizeof (struct interval)),
5467 bounded_number (total_intervals),
5468 bounded_number (total_free_intervals));
3ab6e069 5469
fecbd8ff
SM
5470 total[9] = list3 (Qbuffers, make_number (sizeof (struct buffer)),
5471 bounded_number (total_buffers));
2e471eb5 5472
f8643a6b 5473#ifdef DOUG_LEA_MALLOC
fecbd8ff
SM
5474 total_size++;
5475 total[10] = list4 (Qheap, make_number (1024),
5476 bounded_number ((mallinfo ().uordblks + 1023) >> 10),
5477 bounded_number ((mallinfo ().fordblks + 1023) >> 10));
f8643a6b 5478#endif
fecbd8ff
SM
5479 retval = Flist (total_size, total);
5480 }
f8643a6b 5481
34400008 5482#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
7146af97 5483 {
34400008 5484 /* Compute average percentage of zombies. */
fecbd8ff
SM
5485 double nlive
5486 = (total_conses + total_symbols + total_markers + total_strings
5487 + total_vectors + total_floats + total_intervals + total_buffers);
34400008
GM
5488
5489 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
5490 max_live = max (nlive, max_live);
5491 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
5492 max_zombies = max (nzombies, max_zombies);
5493 ++ngcs;
dbcf001c 5494 }
34400008 5495#endif
7146af97 5496
9e713715
GM
5497 if (!NILP (Vpost_gc_hook))
5498 {
d311d28c 5499 ptrdiff_t gc_count = inhibit_garbage_collection ();
9e713715 5500 safe_run_hooks (Qpost_gc_hook);
ae35e756 5501 unbind_to (gc_count, Qnil);
9e713715 5502 }
2c5bd608
DL
5503
5504 /* Accumulate statistics. */
2c5bd608 5505 if (FLOATP (Vgc_elapsed))
387d4d92
PE
5506 {
5507 EMACS_TIME since_start = sub_emacs_time (current_emacs_time (), start);
5508 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed)
5509 + EMACS_TIME_TO_DOUBLE (since_start));
5510 }
d35af63c 5511
2c5bd608
DL
5512 gcs_done++;
5513
12b3895d 5514 /* Collect profiling data. */
6521894d 5515 if (profiler_memory_running)
12b3895d
TM
5516 {
5517 size_t swept = 0;
6521894d
SM
5518 size_t tot_after = total_bytes_of_live_objects ();
5519 if (tot_before > tot_after)
5520 swept = tot_before - tot_after;
3d80c99f 5521 malloc_probe (swept);
12b3895d
TM
5522 }
5523
fecbd8ff 5524 return retval;
7146af97 5525}
34400008 5526
41c28a37 5527
3770920e
GM
5528/* Mark Lisp objects in glyph matrix MATRIX. Currently the
5529 only interesting objects referenced from glyphs are strings. */
41c28a37
GM
5530
5531static void
971de7fb 5532mark_glyph_matrix (struct glyph_matrix *matrix)
41c28a37
GM
5533{
5534 struct glyph_row *row = matrix->rows;
5535 struct glyph_row *end = row + matrix->nrows;
5536
2e471eb5
GM
5537 for (; row < end; ++row)
5538 if (row->enabled_p)
5539 {
5540 int area;
5541 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
5542 {
5543 struct glyph *glyph = row->glyphs[area];
5544 struct glyph *end_glyph = glyph + row->used[area];
177c0ea7 5545
2e471eb5 5546 for (; glyph < end_glyph; ++glyph)
8e50cc2d 5547 if (STRINGP (glyph->object)
2e471eb5 5548 && !STRING_MARKED_P (XSTRING (glyph->object)))
49723c04 5549 mark_object (glyph->object);
2e471eb5
GM
5550 }
5551 }
41c28a37
GM
5552}
5553
34400008 5554
41c28a37
GM
5555/* Mark Lisp faces in the face cache C. */
5556
5557static void
971de7fb 5558mark_face_cache (struct face_cache *c)
41c28a37
GM
5559{
5560 if (c)
5561 {
5562 int i, j;
5563 for (i = 0; i < c->used; ++i)
5564 {
5565 struct face *face = FACE_FROM_ID (c->f, i);
5566
5567 if (face)
5568 {
5569 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
49723c04 5570 mark_object (face->lface[j]);
41c28a37
GM
5571 }
5572 }
5573 }
5574}
5575
5576
7146af97 5577\f
1a4f1e2c 5578/* Mark reference to a Lisp_Object.
2e471eb5
GM
5579 If the object referred to has not been seen yet, recursively mark
5580 all the references contained in it. */
7146af97 5581
785cd37f 5582#define LAST_MARKED_SIZE 500
d3d47262 5583static Lisp_Object last_marked[LAST_MARKED_SIZE];
244ed907 5584static int last_marked_index;
785cd37f 5585
1342fc6f
RS
5586/* For debugging--call abort when we cdr down this many
5587 links of a list, in mark_object. In debugging,
5588 the call to abort will hit a breakpoint.
5589 Normally this is zero and the check never goes off. */
903fe15d 5590ptrdiff_t mark_object_loop_halt EXTERNALLY_VISIBLE;
1342fc6f 5591
8f11f7ec 5592static void
971de7fb 5593mark_vectorlike (struct Lisp_Vector *ptr)
d2029e5b 5594{
d311d28c
PE
5595 ptrdiff_t size = ptr->header.size;
5596 ptrdiff_t i;
d2029e5b 5597
8f11f7ec 5598 eassert (!VECTOR_MARKED_P (ptr));
7555c33f 5599 VECTOR_MARK (ptr); /* Else mark it. */
d2029e5b
SM
5600 if (size & PSEUDOVECTOR_FLAG)
5601 size &= PSEUDOVECTOR_SIZE_MASK;
d3d47262 5602
d2029e5b
SM
5603 /* Note that this size is not the memory-footprint size, but only
5604 the number of Lisp_Object fields that we should trace.
5605 The distinction is used e.g. by Lisp_Process which places extra
7555c33f
SM
5606 non-Lisp_Object fields at the end of the structure... */
5607 for (i = 0; i < size; i++) /* ...and then mark its elements. */
d2029e5b 5608 mark_object (ptr->contents[i]);
d2029e5b
SM
5609}
5610
58026347
KH
5611/* Like mark_vectorlike but optimized for char-tables (and
5612 sub-char-tables) assuming that the contents are mostly integers or
5613 symbols. */
5614
5615static void
971de7fb 5616mark_char_table (struct Lisp_Vector *ptr)
58026347 5617{
b6439961
PE
5618 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5619 int i;
58026347 5620
8f11f7ec 5621 eassert (!VECTOR_MARKED_P (ptr));
58026347
KH
5622 VECTOR_MARK (ptr);
5623 for (i = 0; i < size; i++)
5624 {
5625 Lisp_Object val = ptr->contents[i];
5626
ef1b0ba7 5627 if (INTEGERP (val) || (SYMBOLP (val) && XSYMBOL (val)->gcmarkbit))
58026347
KH
5628 continue;
5629 if (SUB_CHAR_TABLE_P (val))
5630 {
5631 if (! VECTOR_MARKED_P (XVECTOR (val)))
5632 mark_char_table (XVECTOR (val));
5633 }
5634 else
5635 mark_object (val);
5636 }
5637}
5638
36429c89
DA
5639/* Mark the chain of overlays starting at PTR. */
5640
5641static void
5642mark_overlay (struct Lisp_Overlay *ptr)
5643{
5644 for (; ptr && !ptr->gcmarkbit; ptr = ptr->next)
5645 {
5646 ptr->gcmarkbit = 1;
c644523b
DA
5647 mark_object (ptr->start);
5648 mark_object (ptr->end);
5649 mark_object (ptr->plist);
36429c89
DA
5650 }
5651}
5652
5653/* Mark Lisp_Objects and special pointers in BUFFER. */
cf5c0175
DA
5654
5655static void
5656mark_buffer (struct buffer *buffer)
5657{
b4fa72f2
DA
5658 /* This is handled much like other pseudovectors... */
5659 mark_vectorlike ((struct Lisp_Vector *) buffer);
cf5c0175 5660
b4fa72f2 5661 /* ...but there are some buffer-specific things. */
cf5c0175 5662
b4fa72f2 5663 MARK_INTERVAL_TREE (buffer_intervals (buffer));
cf5c0175 5664
b4fa72f2
DA
5665 /* For now, we just don't mark the undo_list. It's done later in
5666 a special way just before the sweep phase, and after stripping
5667 some of its elements that are not needed any more. */
cf5c0175 5668
b4fa72f2
DA
5669 mark_overlay (buffer->overlays_before);
5670 mark_overlay (buffer->overlays_after);
cf5c0175 5671
b4fa72f2
DA
5672 /* If this is an indirect buffer, mark its base buffer. */
5673 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
5674 mark_buffer (buffer->base_buffer);
cf5c0175
DA
5675}
5676
d59a1afb 5677/* Remove killed buffers or items whose car is a killed buffer from
e99f70c8 5678 LIST, and mark other items. Return changed LIST, which is marked. */
d73e321c 5679
5779a1dc 5680static Lisp_Object
d59a1afb 5681mark_discard_killed_buffers (Lisp_Object list)
d73e321c 5682{
d59a1afb 5683 Lisp_Object tail, *prev = &list;
d73e321c 5684
d59a1afb
DA
5685 for (tail = list; CONSP (tail) && !CONS_MARKED_P (XCONS (tail));
5686 tail = XCDR (tail))
d73e321c 5687 {
5779a1dc 5688 Lisp_Object tem = XCAR (tail);
d73e321c
DA
5689 if (CONSP (tem))
5690 tem = XCAR (tem);
5691 if (BUFFERP (tem) && !BUFFER_LIVE_P (XBUFFER (tem)))
5779a1dc 5692 *prev = XCDR (tail);
d73e321c 5693 else
d59a1afb
DA
5694 {
5695 CONS_MARK (XCONS (tail));
5696 mark_object (XCAR (tail));
84575e67 5697 prev = xcdr_addr (tail);
d59a1afb 5698 }
d73e321c 5699 }
e99f70c8 5700 mark_object (tail);
d73e321c
DA
5701 return list;
5702}
5703
cf5c0175
DA
5704/* Determine type of generic Lisp_Object and mark it accordingly. */
5705
41c28a37 5706void
971de7fb 5707mark_object (Lisp_Object arg)
7146af97 5708{
49723c04 5709 register Lisp_Object obj = arg;
4f5c1376
GM
5710#ifdef GC_CHECK_MARKED_OBJECTS
5711 void *po;
5712 struct mem_node *m;
5713#endif
903fe15d 5714 ptrdiff_t cdr_count = 0;
7146af97 5715
9149e743 5716 loop:
7146af97 5717
1f0b3fd2 5718 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5719 return;
5720
49723c04 5721 last_marked[last_marked_index++] = obj;
785cd37f
RS
5722 if (last_marked_index == LAST_MARKED_SIZE)
5723 last_marked_index = 0;
5724
4f5c1376
GM
5725 /* Perform some sanity checks on the objects marked here. Abort if
5726 we encounter an object we know is bogus. This increases GC time
5727 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
5728#ifdef GC_CHECK_MARKED_OBJECTS
5729
5730 po = (void *) XPNTR (obj);
5731
5732 /* Check that the object pointed to by PO is known to be a Lisp
5733 structure allocated from the heap. */
5734#define CHECK_ALLOCATED() \
5735 do { \
5736 m = mem_find (po); \
5737 if (m == MEM_NIL) \
1088b922 5738 emacs_abort (); \
4f5c1376
GM
5739 } while (0)
5740
5741 /* Check that the object pointed to by PO is live, using predicate
5742 function LIVEP. */
5743#define CHECK_LIVE(LIVEP) \
5744 do { \
5745 if (!LIVEP (m, po)) \
1088b922 5746 emacs_abort (); \
4f5c1376
GM
5747 } while (0)
5748
5749 /* Check both of the above conditions. */
5750#define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
5751 do { \
5752 CHECK_ALLOCATED (); \
5753 CHECK_LIVE (LIVEP); \
5754 } while (0) \
177c0ea7 5755
4f5c1376 5756#else /* not GC_CHECK_MARKED_OBJECTS */
177c0ea7 5757
4f5c1376
GM
5758#define CHECK_LIVE(LIVEP) (void) 0
5759#define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
177c0ea7 5760
4f5c1376
GM
5761#endif /* not GC_CHECK_MARKED_OBJECTS */
5762
7393bcbb 5763 switch (XTYPE (obj))
7146af97
JB
5764 {
5765 case Lisp_String:
5766 {
5767 register struct Lisp_String *ptr = XSTRING (obj);
8f11f7ec
SM
5768 if (STRING_MARKED_P (ptr))
5769 break;
4f5c1376 5770 CHECK_ALLOCATED_AND_LIVE (live_string_p);
2e471eb5 5771 MARK_STRING (ptr);
7555c33f 5772 MARK_INTERVAL_TREE (ptr->intervals);
361b097f 5773#ifdef GC_CHECK_STRING_BYTES
676a7251 5774 /* Check that the string size recorded in the string is the
7555c33f 5775 same as the one recorded in the sdata structure. */
e499d0ee 5776 string_bytes (ptr);
361b097f 5777#endif /* GC_CHECK_STRING_BYTES */
7146af97
JB
5778 }
5779 break;
5780
76437631 5781 case Lisp_Vectorlike:
cf5c0175
DA
5782 {
5783 register struct Lisp_Vector *ptr = XVECTOR (obj);
5784 register ptrdiff_t pvectype;
5785
5786 if (VECTOR_MARKED_P (ptr))
5787 break;
5788
4f5c1376 5789#ifdef GC_CHECK_MARKED_OBJECTS
cf5c0175 5790 m = mem_find (po);
c752cfa9 5791 if (m == MEM_NIL && !SUBRP (obj))
1088b922 5792 emacs_abort ();
4f5c1376 5793#endif /* GC_CHECK_MARKED_OBJECTS */
177c0ea7 5794
cf5c0175 5795 if (ptr->header.size & PSEUDOVECTOR_FLAG)
ee28be33 5796 pvectype = ((ptr->header.size & PVEC_TYPE_MASK)
914adc42 5797 >> PSEUDOVECTOR_AREA_BITS);
cf5c0175 5798 else
6aea7528 5799 pvectype = PVEC_NORMAL_VECTOR;
cf5c0175 5800
cf5c0175
DA
5801 if (pvectype != PVEC_SUBR && pvectype != PVEC_BUFFER)
5802 CHECK_LIVE (live_vector_p);
169ee243 5803
ee28be33 5804 switch (pvectype)
cf5c0175 5805 {
ee28be33 5806 case PVEC_BUFFER:
cf5c0175 5807#ifdef GC_CHECK_MARKED_OBJECTS
c752cfa9
DA
5808 {
5809 struct buffer *b;
5810 FOR_EACH_BUFFER (b)
5811 if (b == po)
5812 break;
5813 if (b == NULL)
5814 emacs_abort ();
5815 }
cf5c0175
DA
5816#endif /* GC_CHECK_MARKED_OBJECTS */
5817 mark_buffer ((struct buffer *) ptr);
ee28be33
SM
5818 break;
5819
5820 case PVEC_COMPILED:
5821 { /* We could treat this just like a vector, but it is better
5822 to save the COMPILED_CONSTANTS element for last and avoid
5823 recursion there. */
5824 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5825 int i;
5826
5827 VECTOR_MARK (ptr);
5828 for (i = 0; i < size; i++)
5829 if (i != COMPILED_CONSTANTS)
5830 mark_object (ptr->contents[i]);
5831 if (size > COMPILED_CONSTANTS)
5832 {
5833 obj = ptr->contents[COMPILED_CONSTANTS];
5834 goto loop;
5835 }
5836 }
5837 break;
cf5c0175 5838
ee28be33 5839 case PVEC_FRAME:
d59a1afb
DA
5840 mark_vectorlike (ptr);
5841 mark_face_cache (((struct frame *) ptr)->face_cache);
ee28be33 5842 break;
cf5c0175 5843
ee28be33
SM
5844 case PVEC_WINDOW:
5845 {
5846 struct window *w = (struct window *) ptr;
5779a1dc 5847
0699fc18 5848 mark_vectorlike (ptr);
e99f70c8 5849
e74aeda8 5850 /* Mark glyph matrices, if any. Marking window
0699fc18
DA
5851 matrices is sufficient because frame matrices
5852 use the same glyph memory. */
e74aeda8 5853 if (w->current_matrix)
ee28be33 5854 {
0699fc18
DA
5855 mark_glyph_matrix (w->current_matrix);
5856 mark_glyph_matrix (w->desired_matrix);
ee28be33 5857 }
e99f70c8
SM
5858
5859 /* Filter out killed buffers from both buffer lists
5860 in attempt to help GC to reclaim killed buffers faster.
5861 We can do it elsewhere for live windows, but this is the
5862 best place to do it for dead windows. */
5863 wset_prev_buffers
5864 (w, mark_discard_killed_buffers (w->prev_buffers));
5865 wset_next_buffers
5866 (w, mark_discard_killed_buffers (w->next_buffers));
ee28be33
SM
5867 }
5868 break;
cf5c0175 5869
ee28be33
SM
5870 case PVEC_HASH_TABLE:
5871 {
5872 struct Lisp_Hash_Table *h = (struct Lisp_Hash_Table *) ptr;
cf5c0175 5873
ee28be33 5874 mark_vectorlike (ptr);
b7432bb2
SM
5875 mark_object (h->test.name);
5876 mark_object (h->test.user_hash_function);
5877 mark_object (h->test.user_cmp_function);
ee28be33
SM
5878 /* If hash table is not weak, mark all keys and values.
5879 For weak tables, mark only the vector. */
5880 if (NILP (h->weak))
5881 mark_object (h->key_and_value);
5882 else
5883 VECTOR_MARK (XVECTOR (h->key_and_value));
5884 }
5885 break;
cf5c0175 5886
ee28be33
SM
5887 case PVEC_CHAR_TABLE:
5888 mark_char_table (ptr);
5889 break;
cf5c0175 5890
ee28be33
SM
5891 case PVEC_BOOL_VECTOR:
5892 /* No Lisp_Objects to mark in a bool vector. */
5893 VECTOR_MARK (ptr);
5894 break;
cf5c0175 5895
ee28be33
SM
5896 case PVEC_SUBR:
5897 break;
cf5c0175 5898
ee28be33 5899 case PVEC_FREE:
1088b922 5900 emacs_abort ();
cf5c0175 5901
ee28be33
SM
5902 default:
5903 mark_vectorlike (ptr);
5904 }
cf5c0175 5905 }
169ee243 5906 break;
7146af97 5907
7146af97
JB
5908 case Lisp_Symbol:
5909 {
c70bbf06 5910 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
7146af97
JB
5911 struct Lisp_Symbol *ptrx;
5912
8f11f7ec
SM
5913 if (ptr->gcmarkbit)
5914 break;
4f5c1376 5915 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
2336fe58 5916 ptr->gcmarkbit = 1;
c644523b
DA
5917 mark_object (ptr->function);
5918 mark_object (ptr->plist);
ce5b453a
SM
5919 switch (ptr->redirect)
5920 {
5921 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
5922 case SYMBOL_VARALIAS:
5923 {
5924 Lisp_Object tem;
5925 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
5926 mark_object (tem);
5927 break;
5928 }
5929 case SYMBOL_LOCALIZED:
5930 {
5931 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
d73e321c
DA
5932 Lisp_Object where = blv->where;
5933 /* If the value is set up for a killed buffer or deleted
5934 frame, restore it's global binding. If the value is
5935 forwarded to a C variable, either it's not a Lisp_Object
5936 var, or it's staticpro'd already. */
5937 if ((BUFFERP (where) && !BUFFER_LIVE_P (XBUFFER (where)))
5938 || (FRAMEP (where) && !FRAME_LIVE_P (XFRAME (where))))
5939 swap_in_global_binding (ptr);
ce5b453a
SM
5940 mark_object (blv->where);
5941 mark_object (blv->valcell);
5942 mark_object (blv->defcell);
5943 break;
5944 }
5945 case SYMBOL_FORWARDED:
5946 /* If the value is forwarded to a buffer or keyboard field,
5947 these are marked when we see the corresponding object.
5948 And if it's forwarded to a C variable, either it's not
5949 a Lisp_Object var, or it's staticpro'd already. */
5950 break;
1088b922 5951 default: emacs_abort ();
ce5b453a 5952 }
c644523b
DA
5953 if (!PURE_POINTER_P (XSTRING (ptr->name)))
5954 MARK_STRING (XSTRING (ptr->name));
0c94c8d6 5955 MARK_INTERVAL_TREE (string_intervals (ptr->name));
177c0ea7 5956
7146af97
JB
5957 ptr = ptr->next;
5958 if (ptr)
5959 {
7555c33f 5960 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun. */
7146af97 5961 XSETSYMBOL (obj, ptrx);
49723c04 5962 goto loop;
7146af97
JB
5963 }
5964 }
5965 break;
5966
a0a38eb7 5967 case Lisp_Misc:
4f5c1376 5968 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
b766f870 5969
7555c33f
SM
5970 if (XMISCANY (obj)->gcmarkbit)
5971 break;
5972
5973 switch (XMISCTYPE (obj))
a0a38eb7 5974 {
7555c33f
SM
5975 case Lisp_Misc_Marker:
5976 /* DO NOT mark thru the marker's chain.
5977 The buffer's markers chain does not preserve markers from gc;
5978 instead, markers are removed from the chain when freed by gc. */
36429c89 5979 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 5980 break;
465edf35 5981
7555c33f
SM
5982 case Lisp_Misc_Save_Value:
5983 XMISCANY (obj)->gcmarkbit = 1;
7555c33f 5984 {
7b1123d8
PE
5985 struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
5986 /* If `save_type' is zero, `data[0].pointer' is the address
73ebd38f
DA
5987 of a memory area containing `data[1].integer' potential
5988 Lisp_Objects. */
7b1123d8 5989 if (GC_MARK_STACK && ptr->save_type == SAVE_TYPE_MEMORY)
7555c33f 5990 {
c50cf2ea 5991 Lisp_Object *p = ptr->data[0].pointer;
7555c33f 5992 ptrdiff_t nelt;
73ebd38f 5993 for (nelt = ptr->data[1].integer; nelt > 0; nelt--, p++)
7555c33f
SM
5994 mark_maybe_object (*p);
5995 }
73ebd38f 5996 else
73ebd38f
DA
5997 {
5998 /* Find Lisp_Objects in `data[N]' slots and mark them. */
7b1123d8
PE
5999 int i;
6000 for (i = 0; i < SAVE_VALUE_SLOTS; i++)
6001 if (save_type (ptr, i) == SAVE_OBJECT)
6002 mark_object (ptr->data[i].object);
73ebd38f 6003 }
7555c33f 6004 }
7555c33f
SM
6005 break;
6006
6007 case Lisp_Misc_Overlay:
6008 mark_overlay (XOVERLAY (obj));
6009 break;
6010
6011 default:
1088b922 6012 emacs_abort ();
a0a38eb7 6013 }
7146af97
JB
6014 break;
6015
6016 case Lisp_Cons:
7146af97
JB
6017 {
6018 register struct Lisp_Cons *ptr = XCONS (obj);
8f11f7ec
SM
6019 if (CONS_MARKED_P (ptr))
6020 break;
4f5c1376 6021 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
08b7c2cb 6022 CONS_MARK (ptr);
c54ca951 6023 /* If the cdr is nil, avoid recursion for the car. */
c644523b 6024 if (EQ (ptr->u.cdr, Qnil))
c54ca951 6025 {
c644523b 6026 obj = ptr->car;
1342fc6f 6027 cdr_count = 0;
c54ca951
RS
6028 goto loop;
6029 }
c644523b
DA
6030 mark_object (ptr->car);
6031 obj = ptr->u.cdr;
1342fc6f
RS
6032 cdr_count++;
6033 if (cdr_count == mark_object_loop_halt)
1088b922 6034 emacs_abort ();
7146af97
JB
6035 goto loop;
6036 }
6037
7146af97 6038 case Lisp_Float:
4f5c1376 6039 CHECK_ALLOCATED_AND_LIVE (live_float_p);
ab6780cd 6040 FLOAT_MARK (XFLOAT (obj));
7146af97 6041 break;
7146af97 6042
2de9f71c 6043 case_Lisp_Int:
7146af97
JB
6044 break;
6045
6046 default:
1088b922 6047 emacs_abort ();
7146af97 6048 }
4f5c1376
GM
6049
6050#undef CHECK_LIVE
6051#undef CHECK_ALLOCATED
6052#undef CHECK_ALLOCATED_AND_LIVE
7146af97 6053}
4a729fd8 6054/* Mark the Lisp pointers in the terminal objects.
0ba2624f 6055 Called by Fgarbage_collect. */
4a729fd8 6056
4a729fd8
SM
6057static void
6058mark_terminals (void)
6059{
6060 struct terminal *t;
6061 for (t = terminal_list; t; t = t->next_terminal)
6062 {
6063 eassert (t->name != NULL);
354884c4 6064#ifdef HAVE_WINDOW_SYSTEM
96ad0af7
YM
6065 /* If a terminal object is reachable from a stacpro'ed object,
6066 it might have been marked already. Make sure the image cache
6067 gets marked. */
6068 mark_image_cache (t->image_cache);
354884c4 6069#endif /* HAVE_WINDOW_SYSTEM */
96ad0af7
YM
6070 if (!VECTOR_MARKED_P (t))
6071 mark_vectorlike ((struct Lisp_Vector *)t);
4a729fd8
SM
6072 }
6073}
6074
6075
084b1a0c 6076
41c28a37
GM
6077/* Value is non-zero if OBJ will survive the current GC because it's
6078 either marked or does not need to be marked to survive. */
6079
fce31d69 6080bool
971de7fb 6081survives_gc_p (Lisp_Object obj)
41c28a37 6082{
fce31d69 6083 bool survives_p;
177c0ea7 6084
8e50cc2d 6085 switch (XTYPE (obj))
41c28a37 6086 {
2de9f71c 6087 case_Lisp_Int:
41c28a37
GM
6088 survives_p = 1;
6089 break;
6090
6091 case Lisp_Symbol:
2336fe58 6092 survives_p = XSYMBOL (obj)->gcmarkbit;
41c28a37
GM
6093 break;
6094
6095 case Lisp_Misc:
67ee9f6e 6096 survives_p = XMISCANY (obj)->gcmarkbit;
41c28a37
GM
6097 break;
6098
6099 case Lisp_String:
08b7c2cb 6100 survives_p = STRING_MARKED_P (XSTRING (obj));
41c28a37
GM
6101 break;
6102
6103 case Lisp_Vectorlike:
8e50cc2d 6104 survives_p = SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
41c28a37
GM
6105 break;
6106
6107 case Lisp_Cons:
08b7c2cb 6108 survives_p = CONS_MARKED_P (XCONS (obj));
41c28a37
GM
6109 break;
6110
41c28a37 6111 case Lisp_Float:
ab6780cd 6112 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
41c28a37 6113 break;
41c28a37
GM
6114
6115 default:
1088b922 6116 emacs_abort ();
41c28a37
GM
6117 }
6118
34400008 6119 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
41c28a37
GM
6120}
6121
6122
7146af97 6123\f
1a4f1e2c 6124/* Sweep: find all structures not marked, and free them. */
7146af97
JB
6125
6126static void
971de7fb 6127gc_sweep (void)
7146af97 6128{
41c28a37
GM
6129 /* Remove or mark entries in weak hash tables.
6130 This must be done before any object is unmarked. */
6131 sweep_weak_hash_tables ();
6132
2e471eb5 6133 sweep_strings ();
e499d0ee 6134 check_string_bytes (!noninteractive);
7146af97
JB
6135
6136 /* Put all unmarked conses on free list */
6137 {
6138 register struct cons_block *cblk;
6ca94ac9 6139 struct cons_block **cprev = &cons_block;
7146af97 6140 register int lim = cons_block_index;
c0c5c8ae 6141 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6142
6143 cons_free_list = 0;
177c0ea7 6144
6ca94ac9 6145 for (cblk = cons_block; cblk; cblk = *cprev)
7146af97 6146 {
3ae2e3a3 6147 register int i = 0;
6ca94ac9 6148 int this_free = 0;
3ae2e3a3
RS
6149 int ilim = (lim + BITS_PER_INT - 1) / BITS_PER_INT;
6150
6151 /* Scan the mark bits an int at a time. */
47ea7f44 6152 for (i = 0; i < ilim; i++)
3ae2e3a3
RS
6153 {
6154 if (cblk->gcmarkbits[i] == -1)
6155 {
6156 /* Fast path - all cons cells for this int are marked. */
6157 cblk->gcmarkbits[i] = 0;
6158 num_used += BITS_PER_INT;
6159 }
6160 else
6161 {
6162 /* Some cons cells for this int are not marked.
6163 Find which ones, and free them. */
6164 int start, pos, stop;
6165
6166 start = i * BITS_PER_INT;
6167 stop = lim - start;
6168 if (stop > BITS_PER_INT)
6169 stop = BITS_PER_INT;
6170 stop += start;
6171
6172 for (pos = start; pos < stop; pos++)
6173 {
6174 if (!CONS_MARKED_P (&cblk->conses[pos]))
6175 {
6176 this_free++;
6177 cblk->conses[pos].u.chain = cons_free_list;
6178 cons_free_list = &cblk->conses[pos];
34400008 6179#if GC_MARK_STACK
c644523b 6180 cons_free_list->car = Vdead;
34400008 6181#endif
3ae2e3a3
RS
6182 }
6183 else
6184 {
6185 num_used++;
6186 CONS_UNMARK (&cblk->conses[pos]);
6187 }
6188 }
6189 }
6190 }
6191
7146af97 6192 lim = CONS_BLOCK_SIZE;
6ca94ac9
KH
6193 /* If this block contains only free conses and we have already
6194 seen more than two blocks worth of free conses then deallocate
6195 this block. */
6feef451 6196 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
6ca94ac9 6197 {
6ca94ac9
KH
6198 *cprev = cblk->next;
6199 /* Unhook from the free list. */
28a099a4 6200 cons_free_list = cblk->conses[0].u.chain;
08b7c2cb 6201 lisp_align_free (cblk);
6ca94ac9
KH
6202 }
6203 else
6feef451
AS
6204 {
6205 num_free += this_free;
6206 cprev = &cblk->next;
6207 }
7146af97
JB
6208 }
6209 total_conses = num_used;
6210 total_free_conses = num_free;
6211 }
6212
7146af97
JB
6213 /* Put all unmarked floats on free list */
6214 {
6215 register struct float_block *fblk;
6ca94ac9 6216 struct float_block **fprev = &float_block;
7146af97 6217 register int lim = float_block_index;
c0c5c8ae 6218 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6219
6220 float_free_list = 0;
177c0ea7 6221
6ca94ac9 6222 for (fblk = float_block; fblk; fblk = *fprev)
7146af97
JB
6223 {
6224 register int i;
6ca94ac9 6225 int this_free = 0;
7146af97 6226 for (i = 0; i < lim; i++)
ab6780cd 6227 if (!FLOAT_MARKED_P (&fblk->floats[i]))
7146af97 6228 {
6ca94ac9 6229 this_free++;
28a099a4 6230 fblk->floats[i].u.chain = float_free_list;
7146af97
JB
6231 float_free_list = &fblk->floats[i];
6232 }
6233 else
6234 {
6235 num_used++;
ab6780cd 6236 FLOAT_UNMARK (&fblk->floats[i]);
7146af97
JB
6237 }
6238 lim = FLOAT_BLOCK_SIZE;
6ca94ac9
KH
6239 /* If this block contains only free floats and we have already
6240 seen more than two blocks worth of free floats then deallocate
6241 this block. */
6feef451 6242 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
6ca94ac9 6243 {
6ca94ac9
KH
6244 *fprev = fblk->next;
6245 /* Unhook from the free list. */
28a099a4 6246 float_free_list = fblk->floats[0].u.chain;
ab6780cd 6247 lisp_align_free (fblk);
6ca94ac9
KH
6248 }
6249 else
6feef451
AS
6250 {
6251 num_free += this_free;
6252 fprev = &fblk->next;
6253 }
7146af97
JB
6254 }
6255 total_floats = num_used;
6256 total_free_floats = num_free;
6257 }
7146af97 6258
d5e35230
JA
6259 /* Put all unmarked intervals on free list */
6260 {
6261 register struct interval_block *iblk;
6ca94ac9 6262 struct interval_block **iprev = &interval_block;
d5e35230 6263 register int lim = interval_block_index;
c0c5c8ae 6264 EMACS_INT num_free = 0, num_used = 0;
d5e35230
JA
6265
6266 interval_free_list = 0;
6267
6ca94ac9 6268 for (iblk = interval_block; iblk; iblk = *iprev)
d5e35230
JA
6269 {
6270 register int i;
6ca94ac9 6271 int this_free = 0;
d5e35230
JA
6272
6273 for (i = 0; i < lim; i++)
6274 {
2336fe58 6275 if (!iblk->intervals[i].gcmarkbit)
d5e35230 6276 {
0c94c8d6 6277 set_interval_parent (&iblk->intervals[i], interval_free_list);
d5e35230 6278 interval_free_list = &iblk->intervals[i];
6ca94ac9 6279 this_free++;
d5e35230
JA
6280 }
6281 else
6282 {
6283 num_used++;
2336fe58 6284 iblk->intervals[i].gcmarkbit = 0;
d5e35230
JA
6285 }
6286 }
6287 lim = INTERVAL_BLOCK_SIZE;
6ca94ac9
KH
6288 /* If this block contains only free intervals and we have already
6289 seen more than two blocks worth of free intervals then
6290 deallocate this block. */
6feef451 6291 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
6ca94ac9 6292 {
6ca94ac9
KH
6293 *iprev = iblk->next;
6294 /* Unhook from the free list. */
439d5cb4 6295 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
c8099634 6296 lisp_free (iblk);
6ca94ac9
KH
6297 }
6298 else
6feef451
AS
6299 {
6300 num_free += this_free;
6301 iprev = &iblk->next;
6302 }
d5e35230
JA
6303 }
6304 total_intervals = num_used;
6305 total_free_intervals = num_free;
6306 }
d5e35230 6307
7146af97
JB
6308 /* Put all unmarked symbols on free list */
6309 {
6310 register struct symbol_block *sblk;
6ca94ac9 6311 struct symbol_block **sprev = &symbol_block;
7146af97 6312 register int lim = symbol_block_index;
c0c5c8ae 6313 EMACS_INT num_free = 0, num_used = 0;
7146af97 6314
d285b373 6315 symbol_free_list = NULL;
177c0ea7 6316
6ca94ac9 6317 for (sblk = symbol_block; sblk; sblk = *sprev)
7146af97 6318 {
6ca94ac9 6319 int this_free = 0;
d55c12ed
AS
6320 union aligned_Lisp_Symbol *sym = sblk->symbols;
6321 union aligned_Lisp_Symbol *end = sym + lim;
d285b373
GM
6322
6323 for (; sym < end; ++sym)
6324 {
20035321
SM
6325 /* Check if the symbol was created during loadup. In such a case
6326 it might be pointed to by pure bytecode which we don't trace,
6327 so we conservatively assume that it is live. */
fce31d69 6328 bool pure_p = PURE_POINTER_P (XSTRING (sym->s.name));
177c0ea7 6329
d55c12ed 6330 if (!sym->s.gcmarkbit && !pure_p)
d285b373 6331 {
d55c12ed
AS
6332 if (sym->s.redirect == SYMBOL_LOCALIZED)
6333 xfree (SYMBOL_BLV (&sym->s));
6334 sym->s.next = symbol_free_list;
6335 symbol_free_list = &sym->s;
34400008 6336#if GC_MARK_STACK
c644523b 6337 symbol_free_list->function = Vdead;
34400008 6338#endif
d285b373
GM
6339 ++this_free;
6340 }
6341 else
6342 {
6343 ++num_used;
6344 if (!pure_p)
c644523b 6345 UNMARK_STRING (XSTRING (sym->s.name));
d55c12ed 6346 sym->s.gcmarkbit = 0;
d285b373
GM
6347 }
6348 }
177c0ea7 6349
7146af97 6350 lim = SYMBOL_BLOCK_SIZE;
6ca94ac9
KH
6351 /* If this block contains only free symbols and we have already
6352 seen more than two blocks worth of free symbols then deallocate
6353 this block. */
6feef451 6354 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
6ca94ac9 6355 {
6ca94ac9
KH
6356 *sprev = sblk->next;
6357 /* Unhook from the free list. */
d55c12ed 6358 symbol_free_list = sblk->symbols[0].s.next;
c8099634 6359 lisp_free (sblk);
6ca94ac9
KH
6360 }
6361 else
6feef451
AS
6362 {
6363 num_free += this_free;
6364 sprev = &sblk->next;
6365 }
7146af97
JB
6366 }
6367 total_symbols = num_used;
6368 total_free_symbols = num_free;
6369 }
6370
a9faeabe
RS
6371 /* Put all unmarked misc's on free list.
6372 For a marker, first unchain it from the buffer it points into. */
7146af97
JB
6373 {
6374 register struct marker_block *mblk;
6ca94ac9 6375 struct marker_block **mprev = &marker_block;
7146af97 6376 register int lim = marker_block_index;
c0c5c8ae 6377 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
6378
6379 marker_free_list = 0;
177c0ea7 6380
6ca94ac9 6381 for (mblk = marker_block; mblk; mblk = *mprev)
7146af97
JB
6382 {
6383 register int i;
6ca94ac9 6384 int this_free = 0;
fa05e253 6385
7146af97 6386 for (i = 0; i < lim; i++)
465edf35 6387 {
d55c12ed 6388 if (!mblk->markers[i].m.u_any.gcmarkbit)
465edf35 6389 {
d55c12ed
AS
6390 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
6391 unchain_marker (&mblk->markers[i].m.u_marker);
fa05e253
RS
6392 /* Set the type of the freed object to Lisp_Misc_Free.
6393 We could leave the type alone, since nobody checks it,
465edf35 6394 but this might catch bugs faster. */
d55c12ed
AS
6395 mblk->markers[i].m.u_marker.type = Lisp_Misc_Free;
6396 mblk->markers[i].m.u_free.chain = marker_free_list;
6397 marker_free_list = &mblk->markers[i].m;
6ca94ac9 6398 this_free++;
465edf35
KH
6399 }
6400 else
6401 {
6402 num_used++;
d55c12ed 6403 mblk->markers[i].m.u_any.gcmarkbit = 0;
465edf35
KH
6404 }
6405 }
7146af97 6406 lim = MARKER_BLOCK_SIZE;
6ca94ac9
KH
6407 /* If this block contains only free markers and we have already
6408 seen more than two blocks worth of free markers then deallocate
6409 this block. */
6feef451 6410 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
6ca94ac9 6411 {
6ca94ac9
KH
6412 *mprev = mblk->next;
6413 /* Unhook from the free list. */
d55c12ed 6414 marker_free_list = mblk->markers[0].m.u_free.chain;
c8099634 6415 lisp_free (mblk);
6ca94ac9
KH
6416 }
6417 else
6feef451
AS
6418 {
6419 num_free += this_free;
6420 mprev = &mblk->next;
6421 }
7146af97
JB
6422 }
6423
6424 total_markers = num_used;
6425 total_free_markers = num_free;
6426 }
6427
6428 /* Free all unmarked buffers */
6429 {
3e98c68e 6430 register struct buffer *buffer, **bprev = &all_buffers;
7146af97 6431
3ab6e069 6432 total_buffers = 0;
3e98c68e 6433 for (buffer = all_buffers; buffer; buffer = *bprev)
3ef06d12 6434 if (!VECTOR_MARKED_P (buffer))
7146af97 6435 {
914adc42 6436 *bprev = buffer->next;
34400008 6437 lisp_free (buffer);
7146af97
JB
6438 }
6439 else
6440 {
3ef06d12 6441 VECTOR_UNMARK (buffer);
8707c1e5
DA
6442 /* Do not use buffer_(set|get)_intervals here. */
6443 buffer->text->intervals = balance_intervals (buffer->text->intervals);
3ab6e069 6444 total_buffers++;
914adc42 6445 bprev = &buffer->next;
7146af97
JB
6446 }
6447 }
6448
f3372c87 6449 sweep_vectors ();
e499d0ee 6450 check_string_bytes (!noninteractive);
7146af97 6451}
7146af97 6452
7146af97 6453
7146af97 6454
7146af97 6455\f
20d24714
JB
6456/* Debugging aids. */
6457
31ce1c91 6458DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
a6266d23 6459 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
228299fa 6460This may be helpful in debugging Emacs's memory usage.
7ee72033 6461We divide the value by 1024 to make sure it fits in a Lisp integer. */)
5842a27b 6462 (void)
20d24714
JB
6463{
6464 Lisp_Object end;
6465
d01a7826 6466 XSETINT (end, (intptr_t) (char *) sbrk (0) / 1024);
20d24714
JB
6467
6468 return end;
6469}
6470
310ea200 6471DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
a6266d23 6472 doc: /* Return a list of counters that measure how much consing there has been.
228299fa
GM
6473Each of these counters increments for a certain kind of object.
6474The counters wrap around from the largest positive integer to zero.
6475Garbage collection does not decrease them.
6476The elements of the value are as follows:
6477 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
6478All are in units of 1 = one object consed
6479except for VECTOR-CELLS and STRING-CHARS, which count the total length of
6480objects consed.
6481MISCS include overlays, markers, and some internal types.
6482Frames, windows, buffers, and subprocesses count as vectors
7ee72033 6483 (but the contents of a buffer's text do not count here). */)
5842a27b 6484 (void)
310ea200 6485{
3438fe21 6486 return listn (CONSTYPE_HEAP, 8,
694b6c97
DA
6487 bounded_number (cons_cells_consed),
6488 bounded_number (floats_consed),
6489 bounded_number (vector_cells_consed),
6490 bounded_number (symbols_consed),
6491 bounded_number (string_chars_consed),
6492 bounded_number (misc_objects_consed),
6493 bounded_number (intervals_consed),
6494 bounded_number (strings_consed));
310ea200 6495}
e0b8c689 6496
8b058d44
EZ
6497/* Find at most FIND_MAX symbols which have OBJ as their value or
6498 function. This is used in gdbinit's `xwhichsymbols' command. */
6499
6500Lisp_Object
196e41e4 6501which_symbols (Lisp_Object obj, EMACS_INT find_max)
8b058d44
EZ
6502{
6503 struct symbol_block *sblk;
8d0eb4c2 6504 ptrdiff_t gc_count = inhibit_garbage_collection ();
8b058d44
EZ
6505 Lisp_Object found = Qnil;
6506
ca78dc43 6507 if (! DEADP (obj))
8b058d44
EZ
6508 {
6509 for (sblk = symbol_block; sblk; sblk = sblk->next)
6510 {
9426aba4 6511 union aligned_Lisp_Symbol *aligned_sym = sblk->symbols;
8b058d44
EZ
6512 int bn;
6513
9426aba4 6514 for (bn = 0; bn < SYMBOL_BLOCK_SIZE; bn++, aligned_sym++)
8b058d44 6515 {
9426aba4 6516 struct Lisp_Symbol *sym = &aligned_sym->s;
8b058d44
EZ
6517 Lisp_Object val;
6518 Lisp_Object tem;
6519
6520 if (sblk == symbol_block && bn >= symbol_block_index)
6521 break;
6522
6523 XSETSYMBOL (tem, sym);
6524 val = find_symbol_value (tem);
6525 if (EQ (val, obj)
c644523b
DA
6526 || EQ (sym->function, obj)
6527 || (!NILP (sym->function)
6528 && COMPILEDP (sym->function)
6529 && EQ (AREF (sym->function, COMPILED_BYTECODE), obj))
8b058d44
EZ
6530 || (!NILP (val)
6531 && COMPILEDP (val)
6532 && EQ (AREF (val, COMPILED_BYTECODE), obj)))
6533 {
6534 found = Fcons (tem, found);
6535 if (--find_max == 0)
6536 goto out;
6537 }
6538 }
6539 }
6540 }
6541
6542 out:
6543 unbind_to (gc_count, Qnil);
6544 return found;
6545}
6546
244ed907 6547#ifdef ENABLE_CHECKING
f4a681b0 6548
fce31d69 6549bool suppress_checking;
d3d47262 6550
e0b8c689 6551void
971de7fb 6552die (const char *msg, const char *file, int line)
e0b8c689 6553{
5013fc08 6554 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: assertion failed: %s\r\n",
e0b8c689 6555 file, line, msg);
4d7e6e51 6556 terminate_due_to_signal (SIGABRT, INT_MAX);
e0b8c689 6557}
244ed907 6558#endif
20d24714 6559\f
b09cca6a 6560/* Initialization. */
7146af97 6561
dfcf069d 6562void
971de7fb 6563init_alloc_once (void)
7146af97
JB
6564{
6565 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
9e713715
GM
6566 purebeg = PUREBEG;
6567 pure_size = PURESIZE;
ab6780cd 6568
877935b1 6569#if GC_MARK_STACK || defined GC_MALLOC_CHECK
34400008
GM
6570 mem_init ();
6571 Vdead = make_pure_string ("DEAD", 4, 4, 0);
6572#endif
9e713715 6573
d1658221 6574#ifdef DOUG_LEA_MALLOC
b09cca6a
SM
6575 mallopt (M_TRIM_THRESHOLD, 128 * 1024); /* Trim threshold. */
6576 mallopt (M_MMAP_THRESHOLD, 64 * 1024); /* Mmap threshold. */
6577 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* Max. number of mmap'ed areas. */
d1658221 6578#endif
7146af97 6579 init_strings ();
f3372c87 6580 init_vectors ();
d5e35230 6581
24d8a105 6582 refill_memory_reserve ();
0dd6d66d 6583 gc_cons_threshold = GC_DEFAULT_THRESHOLD;
7146af97
JB
6584}
6585
dfcf069d 6586void
971de7fb 6587init_alloc (void)
7146af97
JB
6588{
6589 gcprolist = 0;
630686c8 6590 byte_stack_list = 0;
182ff242
GM
6591#if GC_MARK_STACK
6592#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
6593 setjmp_tested_p = longjmps_done = 0;
6594#endif
6595#endif
2c5bd608
DL
6596 Vgc_elapsed = make_float (0.0);
6597 gcs_done = 0;
7146af97
JB
6598}
6599
6600void
971de7fb 6601syms_of_alloc (void)
7146af97 6602{
29208e82 6603 DEFVAR_INT ("gc-cons-threshold", gc_cons_threshold,
fb7ada5f 6604 doc: /* Number of bytes of consing between garbage collections.
228299fa
GM
6605Garbage collection can happen automatically once this many bytes have been
6606allocated since the last garbage collection. All data types count.
7146af97 6607
228299fa 6608Garbage collection happens automatically only when `eval' is called.
7146af97 6609
228299fa 6610By binding this temporarily to a large number, you can effectively
96f077ad
SM
6611prevent garbage collection during a part of the program.
6612See also `gc-cons-percentage'. */);
6613
29208e82 6614 DEFVAR_LISP ("gc-cons-percentage", Vgc_cons_percentage,
fb7ada5f 6615 doc: /* Portion of the heap used for allocation.
96f077ad
SM
6616Garbage collection can happen automatically once this portion of the heap
6617has been allocated since the last garbage collection.
6618If this portion is smaller than `gc-cons-threshold', this is ignored. */);
6619 Vgc_cons_percentage = make_float (0.1);
0819585c 6620
29208e82 6621 DEFVAR_INT ("pure-bytes-used", pure_bytes_used,
333f9019 6622 doc: /* Number of bytes of shareable Lisp data allocated so far. */);
0819585c 6623
29208e82 6624 DEFVAR_INT ("cons-cells-consed", cons_cells_consed,
a6266d23 6625 doc: /* Number of cons cells that have been consed so far. */);
0819585c 6626
29208e82 6627 DEFVAR_INT ("floats-consed", floats_consed,
a6266d23 6628 doc: /* Number of floats that have been consed so far. */);
0819585c 6629
29208e82 6630 DEFVAR_INT ("vector-cells-consed", vector_cells_consed,
a6266d23 6631 doc: /* Number of vector cells that have been consed so far. */);
0819585c 6632
29208e82 6633 DEFVAR_INT ("symbols-consed", symbols_consed,
a6266d23 6634 doc: /* Number of symbols that have been consed so far. */);
0819585c 6635
29208e82 6636 DEFVAR_INT ("string-chars-consed", string_chars_consed,
a6266d23 6637 doc: /* Number of string characters that have been consed so far. */);
0819585c 6638
29208e82 6639 DEFVAR_INT ("misc-objects-consed", misc_objects_consed,
01a6dcc8
GM
6640 doc: /* Number of miscellaneous objects that have been consed so far.
6641These include markers and overlays, plus certain objects not visible
6642to users. */);
2e471eb5 6643
29208e82 6644 DEFVAR_INT ("intervals-consed", intervals_consed,
a6266d23 6645 doc: /* Number of intervals that have been consed so far. */);
7146af97 6646
29208e82 6647 DEFVAR_INT ("strings-consed", strings_consed,
a6266d23 6648 doc: /* Number of strings that have been consed so far. */);
228299fa 6649
29208e82 6650 DEFVAR_LISP ("purify-flag", Vpurify_flag,
a6266d23 6651 doc: /* Non-nil means loading Lisp code in order to dump an executable.
e9515805
SM
6652This means that certain objects should be allocated in shared (pure) space.
6653It can also be set to a hash-table, in which case this table is used to
6654do hash-consing of the objects allocated to pure space. */);
228299fa 6655
29208e82 6656 DEFVAR_BOOL ("garbage-collection-messages", garbage_collection_messages,
a6266d23 6657 doc: /* Non-nil means display messages at start and end of garbage collection. */);
299585ee
RS
6658 garbage_collection_messages = 0;
6659
29208e82 6660 DEFVAR_LISP ("post-gc-hook", Vpost_gc_hook,
a6266d23 6661 doc: /* Hook run after garbage collection has finished. */);
9e713715 6662 Vpost_gc_hook = Qnil;
cd3520a4 6663 DEFSYM (Qpost_gc_hook, "post-gc-hook");
9e713715 6664
29208e82 6665 DEFVAR_LISP ("memory-signal-data", Vmemory_signal_data,
74a54b04 6666 doc: /* Precomputed `signal' argument for memory-full error. */);
bcb61d60
KH
6667 /* We build this in advance because if we wait until we need it, we might
6668 not be able to allocate the memory to hold it. */
74a54b04 6669 Vmemory_signal_data
3438fe21 6670 = listn (CONSTYPE_PURE, 2, Qerror,
694b6c97 6671 build_pure_c_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"));
74a54b04 6672
29208e82 6673 DEFVAR_LISP ("memory-full", Vmemory_full,
24d8a105 6674 doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);
74a54b04 6675 Vmemory_full = Qnil;
bcb61d60 6676
fecbd8ff
SM
6677 DEFSYM (Qconses, "conses");
6678 DEFSYM (Qsymbols, "symbols");
6679 DEFSYM (Qmiscs, "miscs");
6680 DEFSYM (Qstrings, "strings");
6681 DEFSYM (Qvectors, "vectors");
6682 DEFSYM (Qfloats, "floats");
6683 DEFSYM (Qintervals, "intervals");
6684 DEFSYM (Qbuffers, "buffers");
5b835e1d
DA
6685 DEFSYM (Qstring_bytes, "string-bytes");
6686 DEFSYM (Qvector_slots, "vector-slots");
f8643a6b 6687 DEFSYM (Qheap, "heap");
3d80c99f 6688 DEFSYM (Qautomatic_gc, "Automatic GC");
5b835e1d 6689
cd3520a4
JB
6690 DEFSYM (Qgc_cons_threshold, "gc-cons-threshold");
6691 DEFSYM (Qchar_table_extra_slots, "char-table-extra-slots");
a59de17b 6692
29208e82 6693 DEFVAR_LISP ("gc-elapsed", Vgc_elapsed,
2c5bd608 6694 doc: /* Accumulated time elapsed in garbage collections.
e7415487 6695The time is in seconds as a floating point value. */);
29208e82 6696 DEFVAR_INT ("gcs-done", gcs_done,
e7415487 6697 doc: /* Accumulated number of garbage collections done. */);
2c5bd608 6698
7146af97
JB
6699 defsubr (&Scons);
6700 defsubr (&Slist);
6701 defsubr (&Svector);
6702 defsubr (&Smake_byte_code);
6703 defsubr (&Smake_list);
6704 defsubr (&Smake_vector);
6705 defsubr (&Smake_string);
7b07587b 6706 defsubr (&Smake_bool_vector);
7146af97
JB
6707 defsubr (&Smake_symbol);
6708 defsubr (&Smake_marker);
6709 defsubr (&Spurecopy);
6710 defsubr (&Sgarbage_collect);
20d24714 6711 defsubr (&Smemory_limit);
310ea200 6712 defsubr (&Smemory_use_counts);
34400008
GM
6713
6714#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
6715 defsubr (&Sgc_status);
6716#endif
7146af97 6717}
5eceb8fb 6718
4706125e
PE
6719/* When compiled with GCC, GDB might say "No enum type named
6720 pvec_type" if we don't have at least one symbol with that type, and
6721 then xbacktrace could fail. Similarly for the other enums and
62aba0d4
FP
6722 their values. Some non-GCC compilers don't like these constructs. */
6723#ifdef __GNUC__
4706125e
PE
6724union
6725{
03a660a6
PE
6726 enum CHARTAB_SIZE_BITS CHARTAB_SIZE_BITS;
6727 enum CHAR_TABLE_STANDARD_SLOTS CHAR_TABLE_STANDARD_SLOTS;
6728 enum char_bits char_bits;
4706125e 6729 enum CHECK_LISP_OBJECT_TYPE CHECK_LISP_OBJECT_TYPE;
03a660a6 6730 enum DEFAULT_HASH_SIZE DEFAULT_HASH_SIZE;
4706125e 6731 enum enum_USE_LSB_TAG enum_USE_LSB_TAG;
03a660a6 6732 enum FLOAT_TO_STRING_BUFSIZE FLOAT_TO_STRING_BUFSIZE;
4706125e 6733 enum Lisp_Bits Lisp_Bits;
03a660a6
PE
6734 enum Lisp_Compiled Lisp_Compiled;
6735 enum maxargs maxargs;
6736 enum MAX_ALLOCA MAX_ALLOCA;
4706125e
PE
6737 enum More_Lisp_Bits More_Lisp_Bits;
6738 enum pvec_type pvec_type;
6739} const EXTERNALLY_VISIBLE gdb_make_enums_visible = {0};
62aba0d4 6740#endif /* __GNUC__ */