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