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