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