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