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