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