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