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