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