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