* fns.c (concat): Catch string overflow earlier.
[bpt/emacs.git] / src / alloc.c
CommitLineData
7146af97 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
73b0cd50 2 Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2011
8cabe764 3 Free Software Foundation, Inc.
7146af97
JB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
7146af97 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
7146af97
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
7146af97 19
18160b98 20#include <config.h>
e9b309ac 21#include <stdio.h>
ab6780cd 22#include <limits.h> /* For CHAR_BIT. */
d7306fe6 23#include <setjmp.h>
92939d31 24
68c45bf0 25#include <signal.h>
92939d31 26
aa477689
JD
27#ifdef HAVE_GTK_AND_PTHREAD
28#include <pthread.h>
29#endif
30
7539e11f
KR
31/* This file is part of the core Lisp implementation, and thus must
32 deal with the real data structures. If the Lisp implementation is
33 replaced, this file likely will not be used. */
2e471eb5 34
7539e11f 35#undef HIDE_LISP_IMPLEMENTATION
7146af97 36#include "lisp.h"
ece93c02 37#include "process.h"
d5e35230 38#include "intervals.h"
4c0be5f4 39#include "puresize.h"
7146af97
JB
40#include "buffer.h"
41#include "window.h"
2538fae4 42#include "keyboard.h"
502b9b64 43#include "frame.h"
9ac0d9e0 44#include "blockinput.h"
9d80e883 45#include "character.h"
e065a56e 46#include "syssignal.h"
4a729fd8 47#include "termhooks.h" /* For struct terminal. */
34400008 48#include <setjmp.h>
e065a56e 49
6b61353c
KH
50/* GC_MALLOC_CHECK defined means perform validity checks of malloc'd
51 memory. Can do this only if using gmalloc.c. */
52
53#if defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC
54#undef GC_MALLOC_CHECK
55#endif
56
bf952fb6 57#include <unistd.h>
4004364e 58#ifndef HAVE_UNISTD_H
bf952fb6
DL
59extern POINTER_TYPE *sbrk ();
60#endif
ee1eea5c 61
de7124a7 62#include <fcntl.h>
de7124a7 63
69666f77 64#ifdef WINDOWSNT
f892cf9c 65#include "w32.h"
69666f77
EZ
66#endif
67
d1658221 68#ifdef DOUG_LEA_MALLOC
2e471eb5 69
d1658221 70#include <malloc.h>
3e60b029
DL
71/* malloc.h #defines this as size_t, at least in glibc2. */
72#ifndef __malloc_size_t
d1658221 73#define __malloc_size_t int
3e60b029 74#endif
81d492d5 75
2e471eb5
GM
76/* Specify maximum number of areas to mmap. It would be nice to use a
77 value that explicitly means "no limit". */
78
81d492d5
RS
79#define MMAP_MAX_AREAS 100000000
80
2e471eb5
GM
81#else /* not DOUG_LEA_MALLOC */
82
276cbe5a
RS
83/* The following come from gmalloc.c. */
84
276cbe5a 85#define __malloc_size_t size_t
276cbe5a 86extern __malloc_size_t _bytes_used;
3e60b029 87extern __malloc_size_t __malloc_extra_blocks;
2e471eb5
GM
88
89#endif /* not DOUG_LEA_MALLOC */
276cbe5a 90
7bc26fdb
PE
91#if ! defined SYSTEM_MALLOC && ! defined SYNC_INPUT
92#ifdef HAVE_GTK_AND_PTHREAD
aa477689 93
f415cacd
JD
94/* When GTK uses the file chooser dialog, different backends can be loaded
95 dynamically. One such a backend is the Gnome VFS backend that gets loaded
96 if you run Gnome. That backend creates several threads and also allocates
97 memory with malloc.
98
99 If Emacs sets malloc hooks (! SYSTEM_MALLOC) and the emacs_blocked_*
100 functions below are called from malloc, there is a chance that one
101 of these threads preempts the Emacs main thread and the hook variables
333f1b6f 102 end up in an inconsistent state. So we have a mutex to prevent that (note
f415cacd
JD
103 that the backend handles concurrent access to malloc within its own threads
104 but Emacs code running in the main thread is not included in that control).
105
026cdede 106 When UNBLOCK_INPUT is called, reinvoke_input_signal may be called. If this
f415cacd
JD
107 happens in one of the backend threads we will have two threads that tries
108 to run Emacs code at once, and the code is not prepared for that.
109 To prevent that, we only call BLOCK/UNBLOCK from the main thread. */
110
aa477689 111static pthread_mutex_t alloc_mutex;
aa477689 112
959dc601
JD
113#define BLOCK_INPUT_ALLOC \
114 do \
115 { \
116 if (pthread_equal (pthread_self (), main_thread)) \
86302e37 117 BLOCK_INPUT; \
959dc601
JD
118 pthread_mutex_lock (&alloc_mutex); \
119 } \
aa477689 120 while (0)
959dc601
JD
121#define UNBLOCK_INPUT_ALLOC \
122 do \
123 { \
124 pthread_mutex_unlock (&alloc_mutex); \
125 if (pthread_equal (pthread_self (), main_thread)) \
86302e37 126 UNBLOCK_INPUT; \
959dc601 127 } \
aa477689
JD
128 while (0)
129
7bc26fdb 130#else /* ! defined HAVE_GTK_AND_PTHREAD */
aa477689
JD
131
132#define BLOCK_INPUT_ALLOC BLOCK_INPUT
133#define UNBLOCK_INPUT_ALLOC UNBLOCK_INPUT
134
7bc26fdb
PE
135#endif /* ! defined HAVE_GTK_AND_PTHREAD */
136#endif /* ! defined SYSTEM_MALLOC && ! defined SYNC_INPUT */
aa477689 137
2e471eb5
GM
138/* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
139 to a struct Lisp_String. */
140
7cdee936
SM
141#define MARK_STRING(S) ((S)->size |= ARRAY_MARK_FLAG)
142#define UNMARK_STRING(S) ((S)->size &= ~ARRAY_MARK_FLAG)
b059de99 143#define STRING_MARKED_P(S) (((S)->size & ARRAY_MARK_FLAG) != 0)
2e471eb5 144
eab3844f
PE
145#define VECTOR_MARK(V) ((V)->header.size |= ARRAY_MARK_FLAG)
146#define VECTOR_UNMARK(V) ((V)->header.size &= ~ARRAY_MARK_FLAG)
147#define VECTOR_MARKED_P(V) (((V)->header.size & ARRAY_MARK_FLAG) != 0)
3ef06d12 148
7bc26fdb
PE
149/* Value is the number of bytes of S, a pointer to a struct Lisp_String.
150 Be careful during GC, because S->size contains the mark bit for
2e471eb5
GM
151 strings. */
152
3ef06d12 153#define GC_STRING_BYTES(S) (STRING_BYTES (S))
2e471eb5 154
29208e82
TT
155/* Global variables. */
156struct emacs_globals globals;
157
2e471eb5
GM
158/* Number of bytes of consing done since the last gc. */
159
0de4bb68 160EMACS_INT consing_since_gc;
7146af97 161
974aae61
RS
162/* Similar minimum, computed from Vgc_cons_percentage. */
163
164EMACS_INT gc_relative_threshold;
310ea200 165
24d8a105
RS
166/* Minimum number of bytes of consing since GC before next GC,
167 when memory is full. */
168
169EMACS_INT memory_full_cons_threshold;
170
2e471eb5
GM
171/* Nonzero during GC. */
172
7146af97
JB
173int gc_in_progress;
174
3de0effb
RS
175/* Nonzero means abort if try to GC.
176 This is for code which is written on the assumption that
177 no GC will happen, so as to verify that assumption. */
178
179int abort_on_gc;
180
34400008
GM
181/* Number of live and free conses etc. */
182
c0c5c8ae
PE
183static EMACS_INT total_conses, total_markers, total_symbols, total_vector_size;
184static EMACS_INT total_free_conses, total_free_markers, total_free_symbols;
185static EMACS_INT total_free_floats, total_floats;
fd27a537 186
2e471eb5 187/* Points to memory space allocated as "spare", to be freed if we run
24d8a105
RS
188 out of memory. We keep one large block, four cons-blocks, and
189 two string blocks. */
2e471eb5 190
d3d47262 191static char *spare_memory[7];
276cbe5a 192
2b6148e4
PE
193/* Amount of spare memory to keep in large reserve block, or to see
194 whether this much is available when malloc fails on a larger request. */
2e471eb5 195
276cbe5a 196#define SPARE_MEMORY (1 << 14)
4d09bcf6 197
276cbe5a 198/* Number of extra blocks malloc should get when it needs more core. */
2e471eb5 199
276cbe5a
RS
200static int malloc_hysteresis;
201
1b8950e5
RS
202/* Initialize it to a nonzero value to force it into data space
203 (rather than bss space). That way unexec will remap it into text
204 space (pure), on some systems. We have not implemented the
205 remapping on more recent systems because this is less important
206 nowadays than in the days of small memories and timesharing. */
2e471eb5 207
244ed907
PE
208#ifndef VIRT_ADDR_VARIES
209static
210#endif
2c4685ee 211EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
7146af97 212#define PUREBEG (char *) pure
2e471eb5 213
9e713715 214/* Pointer to the pure area, and its size. */
2e471eb5 215
9e713715
GM
216static char *purebeg;
217static size_t pure_size;
218
219/* Number of bytes of pure storage used before pure storage overflowed.
220 If this is non-zero, this implies that an overflow occurred. */
221
222static size_t pure_bytes_used_before_overflow;
7146af97 223
34400008
GM
224/* Value is non-zero if P points into pure space. */
225
226#define PURE_POINTER_P(P) \
227 (((PNTR_COMPARISON_TYPE) (P) \
9e713715 228 < (PNTR_COMPARISON_TYPE) ((char *) purebeg + pure_size)) \
34400008 229 && ((PNTR_COMPARISON_TYPE) (P) \
9e713715 230 >= (PNTR_COMPARISON_TYPE) purebeg))
34400008 231
e5bc14d4
YM
232/* Index in pure at which next pure Lisp object will be allocated.. */
233
234static EMACS_INT pure_bytes_used_lisp;
235
236/* Number of bytes allocated for non-Lisp objects in pure storage. */
237
238static EMACS_INT pure_bytes_used_non_lisp;
239
2e471eb5
GM
240/* If nonzero, this is a warning delivered by malloc and not yet
241 displayed. */
242
a8fe7202 243const char *pending_malloc_warning;
7146af97
JB
244
245/* Maximum amount of C stack to save when a GC happens. */
246
247#ifndef MAX_SAVE_STACK
248#define MAX_SAVE_STACK 16000
249#endif
250
251/* Buffer in which we save a copy of the C stack at each GC. */
252
dd3f25f7 253#if MAX_SAVE_STACK > 0
d3d47262 254static char *stack_copy;
dd3f25f7
PE
255static size_t stack_copy_size;
256#endif
7146af97 257
2e471eb5
GM
258/* Non-zero means ignore malloc warnings. Set during initialization.
259 Currently not used. */
260
d3d47262 261static int ignore_warnings;
350273a4 262
955cbe7b
PE
263static Lisp_Object Qgc_cons_threshold;
264Lisp_Object Qchar_table_extra_slots;
e8197642 265
9e713715
GM
266/* Hook run after GC has finished. */
267
955cbe7b 268static Lisp_Object Qpost_gc_hook;
2c5bd608 269
f57e2426
J
270static void mark_buffer (Lisp_Object);
271static void mark_terminals (void);
f57e2426
J
272static void gc_sweep (void);
273static void mark_glyph_matrix (struct glyph_matrix *);
274static void mark_face_cache (struct face_cache *);
41c28a37 275
69003fd8
PE
276#if !defined REL_ALLOC || defined SYSTEM_MALLOC
277static void refill_memory_reserve (void);
278#endif
f57e2426
J
279static struct Lisp_String *allocate_string (void);
280static void compact_small_strings (void);
281static void free_large_strings (void);
282static void sweep_strings (void);
244ed907 283static void free_misc (Lisp_Object);
34400008 284
34400008
GM
285/* When scanning the C stack for live Lisp objects, Emacs keeps track
286 of what memory allocated via lisp_malloc is intended for what
287 purpose. This enumeration specifies the type of memory. */
288
289enum mem_type
290{
291 MEM_TYPE_NON_LISP,
292 MEM_TYPE_BUFFER,
293 MEM_TYPE_CONS,
294 MEM_TYPE_STRING,
295 MEM_TYPE_MISC,
296 MEM_TYPE_SYMBOL,
297 MEM_TYPE_FLOAT,
9c545a55
SM
298 /* We used to keep separate mem_types for subtypes of vectors such as
299 process, hash_table, frame, terminal, and window, but we never made
300 use of the distinction, so it only caused source-code complexity
301 and runtime slowdown. Minor but pointless. */
302 MEM_TYPE_VECTORLIKE
34400008
GM
303};
304
f57e2426
J
305static POINTER_TYPE *lisp_align_malloc (size_t, enum mem_type);
306static POINTER_TYPE *lisp_malloc (size_t, enum mem_type);
225ccad6 307
24d8a105 308
877935b1 309#if GC_MARK_STACK || defined GC_MALLOC_CHECK
0b378936
GM
310
311#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
312#include <stdio.h> /* For fprintf. */
313#endif
314
315/* A unique object in pure space used to make some Lisp objects
316 on free lists recognizable in O(1). */
317
d3d47262 318static Lisp_Object Vdead;
0b378936 319
877935b1
GM
320#ifdef GC_MALLOC_CHECK
321
322enum mem_type allocated_mem_type;
d3d47262 323static int dont_register_blocks;
877935b1
GM
324
325#endif /* GC_MALLOC_CHECK */
326
327/* A node in the red-black tree describing allocated memory containing
328 Lisp data. Each such block is recorded with its start and end
329 address when it is allocated, and removed from the tree when it
330 is freed.
331
332 A red-black tree is a balanced binary tree with the following
333 properties:
334
335 1. Every node is either red or black.
336 2. Every leaf is black.
337 3. If a node is red, then both of its children are black.
338 4. Every simple path from a node to a descendant leaf contains
339 the same number of black nodes.
340 5. The root is always black.
341
342 When nodes are inserted into the tree, or deleted from the tree,
343 the tree is "fixed" so that these properties are always true.
344
345 A red-black tree with N internal nodes has height at most 2
346 log(N+1). Searches, insertions and deletions are done in O(log N).
347 Please see a text book about data structures for a detailed
348 description of red-black trees. Any book worth its salt should
349 describe them. */
350
351struct mem_node
352{
9f7d9210
RS
353 /* Children of this node. These pointers are never NULL. When there
354 is no child, the value is MEM_NIL, which points to a dummy node. */
355 struct mem_node *left, *right;
356
357 /* The parent of this node. In the root node, this is NULL. */
358 struct mem_node *parent;
877935b1
GM
359
360 /* Start and end of allocated region. */
361 void *start, *end;
362
363 /* Node color. */
364 enum {MEM_BLACK, MEM_RED} color;
177c0ea7 365
877935b1
GM
366 /* Memory type. */
367 enum mem_type type;
368};
369
370/* Base address of stack. Set in main. */
371
372Lisp_Object *stack_base;
373
374/* Root of the tree describing allocated Lisp memory. */
375
376static struct mem_node *mem_root;
377
ece93c02
GM
378/* Lowest and highest known address in the heap. */
379
380static void *min_heap_address, *max_heap_address;
381
877935b1
GM
382/* Sentinel node of the tree. */
383
384static struct mem_node mem_z;
385#define MEM_NIL &mem_z
386
f57e2426
J
387static struct Lisp_Vector *allocate_vectorlike (EMACS_INT);
388static void lisp_free (POINTER_TYPE *);
389static void mark_stack (void);
390static int live_vector_p (struct mem_node *, void *);
391static int live_buffer_p (struct mem_node *, void *);
392static int live_string_p (struct mem_node *, void *);
393static int live_cons_p (struct mem_node *, void *);
394static int live_symbol_p (struct mem_node *, void *);
395static int live_float_p (struct mem_node *, void *);
396static int live_misc_p (struct mem_node *, void *);
397static void mark_maybe_object (Lisp_Object);
398static void mark_memory (void *, void *, int);
399static void mem_init (void);
400static struct mem_node *mem_insert (void *, void *, enum mem_type);
401static void mem_insert_fixup (struct mem_node *);
402static void mem_rotate_left (struct mem_node *);
403static void mem_rotate_right (struct mem_node *);
404static void mem_delete (struct mem_node *);
405static void mem_delete_fixup (struct mem_node *);
55d4c1b2 406static inline struct mem_node *mem_find (void *);
34400008 407
34400008
GM
408
409#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
f57e2426 410static void check_gcpros (void);
34400008
GM
411#endif
412
877935b1 413#endif /* GC_MARK_STACK || GC_MALLOC_CHECK */
34400008 414
1f0b3fd2
GM
415/* Recording what needs to be marked for gc. */
416
417struct gcpro *gcprolist;
418
379b98b1
PE
419/* Addresses of staticpro'd variables. Initialize it to a nonzero
420 value; otherwise some compilers put it into BSS. */
1f0b3fd2 421
0078170f 422#define NSTATICS 0x640
d3d47262 423static Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag};
1f0b3fd2
GM
424
425/* Index of next unused slot in staticvec. */
426
d3d47262 427static int staticidx = 0;
1f0b3fd2 428
f57e2426 429static POINTER_TYPE *pure_alloc (size_t, int);
1f0b3fd2
GM
430
431
432/* Value is SZ rounded up to the next multiple of ALIGNMENT.
433 ALIGNMENT must be a power of 2. */
434
ab6780cd 435#define ALIGN(ptr, ALIGNMENT) \
d01a7826 436 ((POINTER_TYPE *) ((((uintptr_t) (ptr)) + (ALIGNMENT) - 1) \
ab6780cd 437 & ~((ALIGNMENT) - 1)))
1f0b3fd2 438
ece93c02 439
7146af97 440\f
34400008
GM
441/************************************************************************
442 Malloc
443 ************************************************************************/
444
4455ad75 445/* Function malloc calls this if it finds we are near exhausting storage. */
d457598b
AS
446
447void
a8fe7202 448malloc_warning (const char *str)
7146af97
JB
449{
450 pending_malloc_warning = str;
451}
452
34400008 453
4455ad75 454/* Display an already-pending malloc warning. */
34400008 455
d457598b 456void
971de7fb 457display_malloc_warning (void)
7146af97 458{
4455ad75
RS
459 call3 (intern ("display-warning"),
460 intern ("alloc"),
461 build_string (pending_malloc_warning),
462 intern ("emergency"));
7146af97 463 pending_malloc_warning = 0;
7146af97 464}
49efed3a 465\f
276cbe5a
RS
466/* Called if we can't allocate relocatable space for a buffer. */
467
468void
531b0165 469buffer_memory_full (EMACS_INT nbytes)
276cbe5a 470{
2e471eb5
GM
471 /* If buffers use the relocating allocator, no need to free
472 spare_memory, because we may have plenty of malloc space left
473 that we could get, and if we don't, the malloc that fails will
474 itself cause spare_memory to be freed. If buffers don't use the
475 relocating allocator, treat this like any other failing
476 malloc. */
276cbe5a
RS
477
478#ifndef REL_ALLOC
531b0165 479 memory_full (nbytes);
276cbe5a
RS
480#endif
481
2e471eb5
GM
482 /* This used to call error, but if we've run out of memory, we could
483 get infinite recursion trying to build the string. */
9b306d37 484 xsignal (Qnil, Vmemory_signal_data);
7146af97
JB
485}
486
34400008 487
c9d624c6
PE
488#ifndef XMALLOC_OVERRUN_CHECK
489#define XMALLOC_OVERRUN_CHECK_SIZE 0
490#else
212f33f1 491
bdbed949
KS
492/* Check for overrun in malloc'ed buffers by wrapping a 16 byte header
493 and a 16 byte trailer around each block.
494
495 The header consists of 12 fixed bytes + a 4 byte integer contaning the
496 original block size, while the trailer consists of 16 fixed bytes.
497
498 The header is used to detect whether this block has been allocated
499 through these functions -- as it seems that some low-level libc
500 functions may bypass the malloc hooks.
501*/
502
503
212f33f1 504#define XMALLOC_OVERRUN_CHECK_SIZE 16
bdbed949 505
212f33f1
KS
506static char xmalloc_overrun_check_header[XMALLOC_OVERRUN_CHECK_SIZE-4] =
507 { 0x9a, 0x9b, 0xae, 0xaf,
508 0xbf, 0xbe, 0xce, 0xcf,
509 0xea, 0xeb, 0xec, 0xed };
510
511static char xmalloc_overrun_check_trailer[XMALLOC_OVERRUN_CHECK_SIZE] =
512 { 0xaa, 0xab, 0xac, 0xad,
513 0xba, 0xbb, 0xbc, 0xbd,
514 0xca, 0xcb, 0xcc, 0xcd,
515 0xda, 0xdb, 0xdc, 0xdd };
516
bdbed949
KS
517/* Macros to insert and extract the block size in the header. */
518
519#define XMALLOC_PUT_SIZE(ptr, size) \
520 (ptr[-1] = (size & 0xff), \
521 ptr[-2] = ((size >> 8) & 0xff), \
522 ptr[-3] = ((size >> 16) & 0xff), \
523 ptr[-4] = ((size >> 24) & 0xff))
524
525#define XMALLOC_GET_SIZE(ptr) \
526 (size_t)((unsigned)(ptr[-1]) | \
527 ((unsigned)(ptr[-2]) << 8) | \
528 ((unsigned)(ptr[-3]) << 16) | \
529 ((unsigned)(ptr[-4]) << 24))
530
531
d8f165a8
JD
532/* The call depth in overrun_check functions. For example, this might happen:
533 xmalloc()
534 overrun_check_malloc()
535 -> malloc -> (via hook)_-> emacs_blocked_malloc
536 -> overrun_check_malloc
537 call malloc (hooks are NULL, so real malloc is called).
538 malloc returns 10000.
539 add overhead, return 10016.
540 <- (back in overrun_check_malloc)
857ae68b 541 add overhead again, return 10032
d8f165a8 542 xmalloc returns 10032.
857ae68b
JD
543
544 (time passes).
545
d8f165a8
JD
546 xfree(10032)
547 overrun_check_free(10032)
548 decrease overhed
549 free(10016) <- crash, because 10000 is the original pointer. */
857ae68b
JD
550
551static int check_depth;
552
bdbed949
KS
553/* Like malloc, but wraps allocated block with header and trailer. */
554
2538aa2f 555static POINTER_TYPE *
e7974947 556overrun_check_malloc (size_t size)
212f33f1 557{
bdbed949 558 register unsigned char *val;
857ae68b 559 size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
212f33f1 560
857ae68b
JD
561 val = (unsigned char *) malloc (size + overhead);
562 if (val && check_depth == 1)
212f33f1 563 {
72af86bd
AS
564 memcpy (val, xmalloc_overrun_check_header,
565 XMALLOC_OVERRUN_CHECK_SIZE - 4);
212f33f1 566 val += XMALLOC_OVERRUN_CHECK_SIZE;
bdbed949 567 XMALLOC_PUT_SIZE(val, size);
72af86bd
AS
568 memcpy (val + size, xmalloc_overrun_check_trailer,
569 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 570 }
857ae68b 571 --check_depth;
212f33f1
KS
572 return (POINTER_TYPE *)val;
573}
574
bdbed949
KS
575
576/* Like realloc, but checks old block for overrun, and wraps new block
577 with header and trailer. */
578
2538aa2f 579static POINTER_TYPE *
e7974947 580overrun_check_realloc (POINTER_TYPE *block, size_t size)
212f33f1 581{
e7974947 582 register unsigned char *val = (unsigned char *) block;
857ae68b 583 size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
212f33f1
KS
584
585 if (val
857ae68b 586 && check_depth == 1
72af86bd
AS
587 && memcmp (xmalloc_overrun_check_header,
588 val - XMALLOC_OVERRUN_CHECK_SIZE,
589 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
212f33f1 590 {
bdbed949 591 size_t osize = XMALLOC_GET_SIZE (val);
72af86bd
AS
592 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
593 XMALLOC_OVERRUN_CHECK_SIZE))
212f33f1 594 abort ();
72af86bd 595 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 596 val -= XMALLOC_OVERRUN_CHECK_SIZE;
72af86bd 597 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1
KS
598 }
599
857ae68b 600 val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + overhead);
212f33f1 601
857ae68b 602 if (val && check_depth == 1)
212f33f1 603 {
72af86bd
AS
604 memcpy (val, xmalloc_overrun_check_header,
605 XMALLOC_OVERRUN_CHECK_SIZE - 4);
212f33f1 606 val += XMALLOC_OVERRUN_CHECK_SIZE;
bdbed949 607 XMALLOC_PUT_SIZE(val, size);
72af86bd
AS
608 memcpy (val + size, xmalloc_overrun_check_trailer,
609 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 610 }
857ae68b 611 --check_depth;
212f33f1
KS
612 return (POINTER_TYPE *)val;
613}
614
bdbed949
KS
615/* Like free, but checks block for overrun. */
616
2538aa2f 617static void
e7974947 618overrun_check_free (POINTER_TYPE *block)
212f33f1 619{
e7974947 620 unsigned char *val = (unsigned char *) block;
212f33f1 621
857ae68b 622 ++check_depth;
212f33f1 623 if (val
857ae68b 624 && check_depth == 1
72af86bd
AS
625 && memcmp (xmalloc_overrun_check_header,
626 val - XMALLOC_OVERRUN_CHECK_SIZE,
627 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
212f33f1 628 {
bdbed949 629 size_t osize = XMALLOC_GET_SIZE (val);
72af86bd
AS
630 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
631 XMALLOC_OVERRUN_CHECK_SIZE))
212f33f1 632 abort ();
454d7973
KS
633#ifdef XMALLOC_CLEAR_FREE_MEMORY
634 val -= XMALLOC_OVERRUN_CHECK_SIZE;
635 memset (val, 0xff, osize + XMALLOC_OVERRUN_CHECK_SIZE*2);
636#else
72af86bd 637 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 638 val -= XMALLOC_OVERRUN_CHECK_SIZE;
72af86bd 639 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE);
454d7973 640#endif
212f33f1
KS
641 }
642
643 free (val);
857ae68b 644 --check_depth;
212f33f1
KS
645}
646
647#undef malloc
648#undef realloc
649#undef free
650#define malloc overrun_check_malloc
651#define realloc overrun_check_realloc
652#define free overrun_check_free
653#endif
654
dafc79fa
SM
655#ifdef SYNC_INPUT
656/* When using SYNC_INPUT, we don't call malloc from a signal handler, so
657 there's no need to block input around malloc. */
658#define MALLOC_BLOCK_INPUT ((void)0)
659#define MALLOC_UNBLOCK_INPUT ((void)0)
660#else
661#define MALLOC_BLOCK_INPUT BLOCK_INPUT
662#define MALLOC_UNBLOCK_INPUT UNBLOCK_INPUT
663#endif
bdbed949 664
34400008 665/* Like malloc but check for no memory and block interrupt input.. */
7146af97 666
c971ff9a 667POINTER_TYPE *
971de7fb 668xmalloc (size_t size)
7146af97 669{
c971ff9a 670 register POINTER_TYPE *val;
7146af97 671
dafc79fa 672 MALLOC_BLOCK_INPUT;
c971ff9a 673 val = (POINTER_TYPE *) malloc (size);
dafc79fa 674 MALLOC_UNBLOCK_INPUT;
7146af97 675
2e471eb5 676 if (!val && size)
531b0165 677 memory_full (size);
7146af97
JB
678 return val;
679}
680
34400008
GM
681
682/* Like realloc but check for no memory and block interrupt input.. */
683
c971ff9a 684POINTER_TYPE *
971de7fb 685xrealloc (POINTER_TYPE *block, size_t size)
7146af97 686{
c971ff9a 687 register POINTER_TYPE *val;
7146af97 688
dafc79fa 689 MALLOC_BLOCK_INPUT;
56d2031b
JB
690 /* We must call malloc explicitly when BLOCK is 0, since some
691 reallocs don't do this. */
692 if (! block)
c971ff9a 693 val = (POINTER_TYPE *) malloc (size);
f048679d 694 else
c971ff9a 695 val = (POINTER_TYPE *) realloc (block, size);
dafc79fa 696 MALLOC_UNBLOCK_INPUT;
7146af97 697
531b0165
PE
698 if (!val && size)
699 memory_full (size);
7146af97
JB
700 return val;
701}
9ac0d9e0 702
34400008 703
005ca5c7 704/* Like free but block interrupt input. */
34400008 705
9ac0d9e0 706void
971de7fb 707xfree (POINTER_TYPE *block)
9ac0d9e0 708{
70fdbb46
JM
709 if (!block)
710 return;
dafc79fa 711 MALLOC_BLOCK_INPUT;
9ac0d9e0 712 free (block);
dafc79fa 713 MALLOC_UNBLOCK_INPUT;
24d8a105
RS
714 /* We don't call refill_memory_reserve here
715 because that duplicates doing so in emacs_blocked_free
716 and the criterion should go there. */
9ac0d9e0
JB
717}
718
c8099634 719
dca7c6a8
GM
720/* Like strdup, but uses xmalloc. */
721
722char *
971de7fb 723xstrdup (const char *s)
dca7c6a8 724{
675d5130 725 size_t len = strlen (s) + 1;
dca7c6a8 726 char *p = (char *) xmalloc (len);
72af86bd 727 memcpy (p, s, len);
dca7c6a8
GM
728 return p;
729}
730
731
f61bef8b
KS
732/* Unwind for SAFE_ALLOCA */
733
734Lisp_Object
971de7fb 735safe_alloca_unwind (Lisp_Object arg)
f61bef8b 736{
b766f870
KS
737 register struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
738
739 p->dogc = 0;
740 xfree (p->pointer);
741 p->pointer = 0;
7b7990cc 742 free_misc (arg);
f61bef8b
KS
743 return Qnil;
744}
745
746
34400008
GM
747/* Like malloc but used for allocating Lisp data. NBYTES is the
748 number of bytes to allocate, TYPE describes the intended use of the
749 allcated memory block (for strings, for conses, ...). */
750
212f33f1 751#ifndef USE_LSB_TAG
918a23a7 752static void *lisp_malloc_loser;
212f33f1 753#endif
918a23a7 754
675d5130 755static POINTER_TYPE *
971de7fb 756lisp_malloc (size_t nbytes, enum mem_type type)
c8099634 757{
34400008 758 register void *val;
c8099634 759
dafc79fa 760 MALLOC_BLOCK_INPUT;
877935b1
GM
761
762#ifdef GC_MALLOC_CHECK
763 allocated_mem_type = type;
764#endif
177c0ea7 765
34400008 766 val = (void *) malloc (nbytes);
c8099634 767
6b61353c 768#ifndef USE_LSB_TAG
918a23a7
RS
769 /* If the memory just allocated cannot be addressed thru a Lisp
770 object's pointer, and it needs to be,
771 that's equivalent to running out of memory. */
772 if (val && type != MEM_TYPE_NON_LISP)
773 {
774 Lisp_Object tem;
775 XSETCONS (tem, (char *) val + nbytes - 1);
776 if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
777 {
778 lisp_malloc_loser = val;
779 free (val);
780 val = 0;
781 }
782 }
6b61353c 783#endif
918a23a7 784
877935b1 785#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
dca7c6a8 786 if (val && type != MEM_TYPE_NON_LISP)
34400008
GM
787 mem_insert (val, (char *) val + nbytes, type);
788#endif
177c0ea7 789
dafc79fa 790 MALLOC_UNBLOCK_INPUT;
dca7c6a8 791 if (!val && nbytes)
531b0165 792 memory_full (nbytes);
c8099634
RS
793 return val;
794}
795
34400008
GM
796/* Free BLOCK. This must be called to free memory allocated with a
797 call to lisp_malloc. */
798
bf952fb6 799static void
971de7fb 800lisp_free (POINTER_TYPE *block)
c8099634 801{
dafc79fa 802 MALLOC_BLOCK_INPUT;
c8099634 803 free (block);
877935b1 804#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
34400008
GM
805 mem_delete (mem_find (block));
806#endif
dafc79fa 807 MALLOC_UNBLOCK_INPUT;
c8099634 808}
34400008 809
ab6780cd
SM
810/* Allocation of aligned blocks of memory to store Lisp data. */
811/* The entry point is lisp_align_malloc which returns blocks of at most */
812/* BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
813
349a4500
SM
814/* Use posix_memalloc if the system has it and we're using the system's
815 malloc (because our gmalloc.c routines don't have posix_memalign although
816 its memalloc could be used). */
b4181b01
KS
817#if defined (HAVE_POSIX_MEMALIGN) && defined (SYSTEM_MALLOC)
818#define USE_POSIX_MEMALIGN 1
819#endif
ab6780cd
SM
820
821/* BLOCK_ALIGN has to be a power of 2. */
822#define BLOCK_ALIGN (1 << 10)
ab6780cd
SM
823
824/* Padding to leave at the end of a malloc'd block. This is to give
825 malloc a chance to minimize the amount of memory wasted to alignment.
826 It should be tuned to the particular malloc library used.
19bcad1f
SM
827 On glibc-2.3.2, malloc never tries to align, so a padding of 0 is best.
828 posix_memalign on the other hand would ideally prefer a value of 4
829 because otherwise, there's 1020 bytes wasted between each ablocks.
f501ccb4
SM
830 In Emacs, testing shows that those 1020 can most of the time be
831 efficiently used by malloc to place other objects, so a value of 0 can
832 still preferable unless you have a lot of aligned blocks and virtually
833 nothing else. */
19bcad1f
SM
834#define BLOCK_PADDING 0
835#define BLOCK_BYTES \
0b432f21 836 (BLOCK_ALIGN - sizeof (struct ablocks *) - BLOCK_PADDING)
19bcad1f
SM
837
838/* Internal data structures and constants. */
839
ab6780cd
SM
840#define ABLOCKS_SIZE 16
841
842/* An aligned block of memory. */
843struct ablock
844{
845 union
846 {
847 char payload[BLOCK_BYTES];
848 struct ablock *next_free;
849 } x;
850 /* `abase' is the aligned base of the ablocks. */
851 /* It is overloaded to hold the virtual `busy' field that counts
852 the number of used ablock in the parent ablocks.
853 The first ablock has the `busy' field, the others have the `abase'
854 field. To tell the difference, we assume that pointers will have
855 integer values larger than 2 * ABLOCKS_SIZE. The lowest bit of `busy'
856 is used to tell whether the real base of the parent ablocks is `abase'
857 (if not, the word before the first ablock holds a pointer to the
858 real base). */
859 struct ablocks *abase;
860 /* The padding of all but the last ablock is unused. The padding of
861 the last ablock in an ablocks is not allocated. */
19bcad1f
SM
862#if BLOCK_PADDING
863 char padding[BLOCK_PADDING];
ebb8d410 864#endif
ab6780cd
SM
865};
866
867/* A bunch of consecutive aligned blocks. */
868struct ablocks
869{
870 struct ablock blocks[ABLOCKS_SIZE];
871};
872
873/* Size of the block requested from malloc or memalign. */
19bcad1f 874#define ABLOCKS_BYTES (sizeof (struct ablocks) - BLOCK_PADDING)
ab6780cd
SM
875
876#define ABLOCK_ABASE(block) \
d01a7826 877 (((uintptr_t) (block)->abase) <= (1 + 2 * ABLOCKS_SIZE) \
ab6780cd
SM
878 ? (struct ablocks *)(block) \
879 : (block)->abase)
880
881/* Virtual `busy' field. */
882#define ABLOCKS_BUSY(abase) ((abase)->blocks[0].abase)
883
884/* Pointer to the (not necessarily aligned) malloc block. */
349a4500 885#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
886#define ABLOCKS_BASE(abase) (abase)
887#else
ab6780cd 888#define ABLOCKS_BASE(abase) \
d01a7826 889 (1 & (intptr_t) ABLOCKS_BUSY (abase) ? abase : ((void**)abase)[-1])
19bcad1f 890#endif
ab6780cd
SM
891
892/* The list of free ablock. */
893static struct ablock *free_ablock;
894
895/* Allocate an aligned block of nbytes.
896 Alignment is on a multiple of BLOCK_ALIGN and `nbytes' has to be
897 smaller or equal to BLOCK_BYTES. */
898static POINTER_TYPE *
971de7fb 899lisp_align_malloc (size_t nbytes, enum mem_type type)
ab6780cd
SM
900{
901 void *base, *val;
902 struct ablocks *abase;
903
904 eassert (nbytes <= BLOCK_BYTES);
905
dafc79fa 906 MALLOC_BLOCK_INPUT;
ab6780cd
SM
907
908#ifdef GC_MALLOC_CHECK
909 allocated_mem_type = type;
910#endif
911
912 if (!free_ablock)
913 {
005ca5c7 914 int i;
d01a7826 915 intptr_t aligned; /* int gets warning casting to 64-bit pointer. */
ab6780cd
SM
916
917#ifdef DOUG_LEA_MALLOC
918 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
919 because mapped region contents are not preserved in
920 a dumped Emacs. */
921 mallopt (M_MMAP_MAX, 0);
922#endif
923
349a4500 924#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
925 {
926 int err = posix_memalign (&base, BLOCK_ALIGN, ABLOCKS_BYTES);
ab349c19
RS
927 if (err)
928 base = NULL;
929 abase = base;
19bcad1f
SM
930 }
931#else
ab6780cd
SM
932 base = malloc (ABLOCKS_BYTES);
933 abase = ALIGN (base, BLOCK_ALIGN);
ab349c19
RS
934#endif
935
6b61353c
KH
936 if (base == 0)
937 {
dafc79fa 938 MALLOC_UNBLOCK_INPUT;
531b0165 939 memory_full (ABLOCKS_BYTES);
6b61353c 940 }
ab6780cd
SM
941
942 aligned = (base == abase);
943 if (!aligned)
944 ((void**)abase)[-1] = base;
945
946#ifdef DOUG_LEA_MALLOC
947 /* Back to a reasonable maximum of mmap'ed areas. */
948 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
949#endif
950
6b61353c 951#ifndef USE_LSB_TAG
8f924df7
KH
952 /* If the memory just allocated cannot be addressed thru a Lisp
953 object's pointer, and it needs to be, that's equivalent to
954 running out of memory. */
955 if (type != MEM_TYPE_NON_LISP)
956 {
957 Lisp_Object tem;
958 char *end = (char *) base + ABLOCKS_BYTES - 1;
959 XSETCONS (tem, end);
960 if ((char *) XCONS (tem) != end)
961 {
962 lisp_malloc_loser = base;
963 free (base);
dafc79fa 964 MALLOC_UNBLOCK_INPUT;
531b0165 965 memory_full (SIZE_MAX);
8f924df7
KH
966 }
967 }
6b61353c 968#endif
8f924df7 969
ab6780cd
SM
970 /* Initialize the blocks and put them on the free list.
971 Is `base' was not properly aligned, we can't use the last block. */
972 for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
973 {
974 abase->blocks[i].abase = abase;
975 abase->blocks[i].x.next_free = free_ablock;
976 free_ablock = &abase->blocks[i];
977 }
8ac068ac 978 ABLOCKS_BUSY (abase) = (struct ablocks *) aligned;
ab6780cd 979
d01a7826 980 eassert (0 == ((uintptr_t) abase) % BLOCK_ALIGN);
ab6780cd
SM
981 eassert (ABLOCK_ABASE (&abase->blocks[3]) == abase); /* 3 is arbitrary */
982 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase);
983 eassert (ABLOCKS_BASE (abase) == base);
d01a7826 984 eassert (aligned == (intptr_t) ABLOCKS_BUSY (abase));
ab6780cd
SM
985 }
986
987 abase = ABLOCK_ABASE (free_ablock);
8ac068ac 988 ABLOCKS_BUSY (abase) =
d01a7826 989 (struct ablocks *) (2 + (intptr_t) ABLOCKS_BUSY (abase));
ab6780cd
SM
990 val = free_ablock;
991 free_ablock = free_ablock->x.next_free;
992
ab6780cd 993#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
3687c2ef 994 if (type != MEM_TYPE_NON_LISP)
ab6780cd
SM
995 mem_insert (val, (char *) val + nbytes, type);
996#endif
997
dafc79fa 998 MALLOC_UNBLOCK_INPUT;
ab6780cd 999
d01a7826 1000 eassert (0 == ((uintptr_t) val) % BLOCK_ALIGN);
ab6780cd
SM
1001 return val;
1002}
1003
1004static void
971de7fb 1005lisp_align_free (POINTER_TYPE *block)
ab6780cd
SM
1006{
1007 struct ablock *ablock = block;
1008 struct ablocks *abase = ABLOCK_ABASE (ablock);
1009
dafc79fa 1010 MALLOC_BLOCK_INPUT;
ab6780cd
SM
1011#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
1012 mem_delete (mem_find (block));
1013#endif
1014 /* Put on free list. */
1015 ablock->x.next_free = free_ablock;
1016 free_ablock = ablock;
1017 /* Update busy count. */
8ac068ac 1018 ABLOCKS_BUSY (abase) =
d01a7826 1019 (struct ablocks *) (-2 + (intptr_t) ABLOCKS_BUSY (abase));
d2db1c32 1020
d01a7826 1021 if (2 > (intptr_t) ABLOCKS_BUSY (abase))
ab6780cd 1022 { /* All the blocks are free. */
d01a7826 1023 int i = 0, aligned = (intptr_t) ABLOCKS_BUSY (abase);
ab6780cd
SM
1024 struct ablock **tem = &free_ablock;
1025 struct ablock *atop = &abase->blocks[aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1];
1026
1027 while (*tem)
1028 {
1029 if (*tem >= (struct ablock *) abase && *tem < atop)
1030 {
1031 i++;
1032 *tem = (*tem)->x.next_free;
1033 }
1034 else
1035 tem = &(*tem)->x.next_free;
1036 }
1037 eassert ((aligned & 1) == aligned);
1038 eassert (i == (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1));
349a4500 1039#ifdef USE_POSIX_MEMALIGN
d01a7826 1040 eassert ((uintptr_t) ABLOCKS_BASE (abase) % BLOCK_ALIGN == 0);
cfb2f32e 1041#endif
ab6780cd
SM
1042 free (ABLOCKS_BASE (abase));
1043 }
dafc79fa 1044 MALLOC_UNBLOCK_INPUT;
ab6780cd 1045}
3ef06d12
SM
1046
1047/* Return a new buffer structure allocated from the heap with
1048 a call to lisp_malloc. */
1049
1050struct buffer *
971de7fb 1051allocate_buffer (void)
3ef06d12
SM
1052{
1053 struct buffer *b
1054 = (struct buffer *) lisp_malloc (sizeof (struct buffer),
1055 MEM_TYPE_BUFFER);
eab3844f
PE
1056 XSETPVECTYPESIZE (b, PVEC_BUFFER,
1057 ((sizeof (struct buffer) + sizeof (EMACS_INT) - 1)
1058 / sizeof (EMACS_INT)));
3ef06d12
SM
1059 return b;
1060}
1061
9ac0d9e0 1062\f
026cdede
SM
1063#ifndef SYSTEM_MALLOC
1064
9ac0d9e0
JB
1065/* Arranging to disable input signals while we're in malloc.
1066
1067 This only works with GNU malloc. To help out systems which can't
1068 use GNU malloc, all the calls to malloc, realloc, and free
1069 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
026cdede 1070 pair; unfortunately, we have no idea what C library functions
9ac0d9e0 1071 might call malloc, so we can't really protect them unless you're
2c5bd608
DL
1072 using GNU malloc. Fortunately, most of the major operating systems
1073 can use GNU malloc. */
9ac0d9e0 1074
026cdede 1075#ifndef SYNC_INPUT
dafc79fa
SM
1076/* When using SYNC_INPUT, we don't call malloc from a signal handler, so
1077 there's no need to block input around malloc. */
026cdede 1078
b3303f74 1079#ifndef DOUG_LEA_MALLOC
f57e2426
J
1080extern void * (*__malloc_hook) (size_t, const void *);
1081extern void * (*__realloc_hook) (void *, size_t, const void *);
1082extern void (*__free_hook) (void *, const void *);
b3303f74
DL
1083/* Else declared in malloc.h, perhaps with an extra arg. */
1084#endif /* DOUG_LEA_MALLOC */
f57e2426
J
1085static void * (*old_malloc_hook) (size_t, const void *);
1086static void * (*old_realloc_hook) (void *, size_t, const void*);
1087static void (*old_free_hook) (void*, const void*);
9ac0d9e0 1088
4e75f29d
PE
1089#ifdef DOUG_LEA_MALLOC
1090# define BYTES_USED (mallinfo ().uordblks)
1091#else
1092# define BYTES_USED _bytes_used
1093#endif
1094
ef1b0ba7
SM
1095static __malloc_size_t bytes_used_when_reconsidered;
1096
4e75f29d
PE
1097/* Value of _bytes_used, when spare_memory was freed. */
1098
1099static __malloc_size_t bytes_used_when_full;
1100
276cbe5a
RS
1101/* This function is used as the hook for free to call. */
1102
9ac0d9e0 1103static void
7c3320d8 1104emacs_blocked_free (void *ptr, const void *ptr2)
9ac0d9e0 1105{
aa477689 1106 BLOCK_INPUT_ALLOC;
877935b1
GM
1107
1108#ifdef GC_MALLOC_CHECK
a83fee2c
GM
1109 if (ptr)
1110 {
1111 struct mem_node *m;
177c0ea7 1112
a83fee2c
GM
1113 m = mem_find (ptr);
1114 if (m == MEM_NIL || m->start != ptr)
1115 {
1116 fprintf (stderr,
1117 "Freeing `%p' which wasn't allocated with malloc\n", ptr);
1118 abort ();
1119 }
1120 else
1121 {
1122 /* fprintf (stderr, "free %p...%p (%p)\n", m->start, m->end, ptr); */
1123 mem_delete (m);
1124 }
1125 }
877935b1 1126#endif /* GC_MALLOC_CHECK */
177c0ea7 1127
9ac0d9e0
JB
1128 __free_hook = old_free_hook;
1129 free (ptr);
177c0ea7 1130
276cbe5a
RS
1131 /* If we released our reserve (due to running out of memory),
1132 and we have a fair amount free once again,
1133 try to set aside another reserve in case we run out once more. */
24d8a105 1134 if (! NILP (Vmemory_full)
276cbe5a
RS
1135 /* Verify there is enough space that even with the malloc
1136 hysteresis this call won't run out again.
1137 The code here is correct as long as SPARE_MEMORY
1138 is substantially larger than the block size malloc uses. */
1139 && (bytes_used_when_full
4d74a5fc 1140 > ((bytes_used_when_reconsidered = BYTES_USED)
bccfb310 1141 + max (malloc_hysteresis, 4) * SPARE_MEMORY)))
24d8a105 1142 refill_memory_reserve ();
276cbe5a 1143
b0846f52 1144 __free_hook = emacs_blocked_free;
aa477689 1145 UNBLOCK_INPUT_ALLOC;
9ac0d9e0
JB
1146}
1147
34400008 1148
276cbe5a
RS
1149/* This function is the malloc hook that Emacs uses. */
1150
9ac0d9e0 1151static void *
7c3320d8 1152emacs_blocked_malloc (size_t size, const void *ptr)
9ac0d9e0
JB
1153{
1154 void *value;
1155
aa477689 1156 BLOCK_INPUT_ALLOC;
9ac0d9e0 1157 __malloc_hook = old_malloc_hook;
1177ecf6 1158#ifdef DOUG_LEA_MALLOC
5665a02f
KL
1159 /* Segfaults on my system. --lorentey */
1160 /* mallopt (M_TOP_PAD, malloc_hysteresis * 4096); */
1177ecf6 1161#else
d1658221 1162 __malloc_extra_blocks = malloc_hysteresis;
1177ecf6 1163#endif
877935b1 1164
2756d8ee 1165 value = (void *) malloc (size);
877935b1
GM
1166
1167#ifdef GC_MALLOC_CHECK
1168 {
1169 struct mem_node *m = mem_find (value);
1170 if (m != MEM_NIL)
1171 {
1172 fprintf (stderr, "Malloc returned %p which is already in use\n",
1173 value);
1174 fprintf (stderr, "Region in use is %p...%p, %u bytes, type %d\n",
1175 m->start, m->end, (char *) m->end - (char *) m->start,
1176 m->type);
1177 abort ();
1178 }
1179
1180 if (!dont_register_blocks)
1181 {
1182 mem_insert (value, (char *) value + max (1, size), allocated_mem_type);
1183 allocated_mem_type = MEM_TYPE_NON_LISP;
1184 }
1185 }
1186#endif /* GC_MALLOC_CHECK */
177c0ea7 1187
b0846f52 1188 __malloc_hook = emacs_blocked_malloc;
aa477689 1189 UNBLOCK_INPUT_ALLOC;
9ac0d9e0 1190
877935b1 1191 /* fprintf (stderr, "%p malloc\n", value); */
9ac0d9e0
JB
1192 return value;
1193}
1194
34400008
GM
1195
1196/* This function is the realloc hook that Emacs uses. */
1197
9ac0d9e0 1198static void *
7c3320d8 1199emacs_blocked_realloc (void *ptr, size_t size, const void *ptr2)
9ac0d9e0
JB
1200{
1201 void *value;
1202
aa477689 1203 BLOCK_INPUT_ALLOC;
9ac0d9e0 1204 __realloc_hook = old_realloc_hook;
877935b1
GM
1205
1206#ifdef GC_MALLOC_CHECK
1207 if (ptr)
1208 {
1209 struct mem_node *m = mem_find (ptr);
1210 if (m == MEM_NIL || m->start != ptr)
1211 {
1212 fprintf (stderr,
1213 "Realloc of %p which wasn't allocated with malloc\n",
1214 ptr);
1215 abort ();
1216 }
1217
1218 mem_delete (m);
1219 }
177c0ea7 1220
877935b1 1221 /* fprintf (stderr, "%p -> realloc\n", ptr); */
177c0ea7 1222
877935b1
GM
1223 /* Prevent malloc from registering blocks. */
1224 dont_register_blocks = 1;
1225#endif /* GC_MALLOC_CHECK */
1226
2756d8ee 1227 value = (void *) realloc (ptr, size);
877935b1
GM
1228
1229#ifdef GC_MALLOC_CHECK
1230 dont_register_blocks = 0;
1231
1232 {
1233 struct mem_node *m = mem_find (value);
1234 if (m != MEM_NIL)
1235 {
1236 fprintf (stderr, "Realloc returns memory that is already in use\n");
1237 abort ();
1238 }
1239
1240 /* Can't handle zero size regions in the red-black tree. */
1241 mem_insert (value, (char *) value + max (size, 1), MEM_TYPE_NON_LISP);
1242 }
177c0ea7 1243
877935b1
GM
1244 /* fprintf (stderr, "%p <- realloc\n", value); */
1245#endif /* GC_MALLOC_CHECK */
177c0ea7 1246
b0846f52 1247 __realloc_hook = emacs_blocked_realloc;
aa477689 1248 UNBLOCK_INPUT_ALLOC;
9ac0d9e0
JB
1249
1250 return value;
1251}
1252
34400008 1253
aa477689
JD
1254#ifdef HAVE_GTK_AND_PTHREAD
1255/* Called from Fdump_emacs so that when the dumped Emacs starts, it has a
1256 normal malloc. Some thread implementations need this as they call
1257 malloc before main. The pthread_self call in BLOCK_INPUT_ALLOC then
1258 calls malloc because it is the first call, and we have an endless loop. */
1259
1260void
1261reset_malloc_hooks ()
1262{
4d580af2
AS
1263 __free_hook = old_free_hook;
1264 __malloc_hook = old_malloc_hook;
1265 __realloc_hook = old_realloc_hook;
aa477689
JD
1266}
1267#endif /* HAVE_GTK_AND_PTHREAD */
1268
1269
34400008
GM
1270/* Called from main to set up malloc to use our hooks. */
1271
9ac0d9e0 1272void
7c3320d8 1273uninterrupt_malloc (void)
9ac0d9e0 1274{
aa477689 1275#ifdef HAVE_GTK_AND_PTHREAD
a1b41389 1276#ifdef DOUG_LEA_MALLOC
aa477689
JD
1277 pthread_mutexattr_t attr;
1278
1279 /* GLIBC has a faster way to do this, but lets keep it portable.
1280 This is according to the Single UNIX Specification. */
1281 pthread_mutexattr_init (&attr);
1282 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
1283 pthread_mutex_init (&alloc_mutex, &attr);
a1b41389 1284#else /* !DOUG_LEA_MALLOC */
ce5b453a 1285 /* Some systems such as Solaris 2.6 don't have a recursive mutex,
a1b41389
YM
1286 and the bundled gmalloc.c doesn't require it. */
1287 pthread_mutex_init (&alloc_mutex, NULL);
1288#endif /* !DOUG_LEA_MALLOC */
aa477689
JD
1289#endif /* HAVE_GTK_AND_PTHREAD */
1290
c8099634
RS
1291 if (__free_hook != emacs_blocked_free)
1292 old_free_hook = __free_hook;
b0846f52 1293 __free_hook = emacs_blocked_free;
9ac0d9e0 1294
c8099634
RS
1295 if (__malloc_hook != emacs_blocked_malloc)
1296 old_malloc_hook = __malloc_hook;
b0846f52 1297 __malloc_hook = emacs_blocked_malloc;
9ac0d9e0 1298
c8099634
RS
1299 if (__realloc_hook != emacs_blocked_realloc)
1300 old_realloc_hook = __realloc_hook;
b0846f52 1301 __realloc_hook = emacs_blocked_realloc;
9ac0d9e0 1302}
2e471eb5 1303
026cdede 1304#endif /* not SYNC_INPUT */
2e471eb5
GM
1305#endif /* not SYSTEM_MALLOC */
1306
1307
7146af97 1308\f
2e471eb5
GM
1309/***********************************************************************
1310 Interval Allocation
1311 ***********************************************************************/
1a4f1e2c 1312
34400008
GM
1313/* Number of intervals allocated in an interval_block structure.
1314 The 1020 is 1024 minus malloc overhead. */
1315
d5e35230
JA
1316#define INTERVAL_BLOCK_SIZE \
1317 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
1318
34400008
GM
1319/* Intervals are allocated in chunks in form of an interval_block
1320 structure. */
1321
d5e35230 1322struct interval_block
2e471eb5 1323{
6b61353c 1324 /* Place `intervals' first, to preserve alignment. */
2e471eb5 1325 struct interval intervals[INTERVAL_BLOCK_SIZE];
6b61353c 1326 struct interval_block *next;
2e471eb5 1327};
d5e35230 1328
34400008
GM
1329/* Current interval block. Its `next' pointer points to older
1330 blocks. */
1331
d3d47262 1332static struct interval_block *interval_block;
34400008
GM
1333
1334/* Index in interval_block above of the next unused interval
1335 structure. */
1336
d5e35230 1337static int interval_block_index;
34400008
GM
1338
1339/* Number of free and live intervals. */
1340
c0c5c8ae 1341static EMACS_INT total_free_intervals, total_intervals;
d5e35230 1342
34400008
GM
1343/* List of free intervals. */
1344
244ed907 1345static INTERVAL interval_free_list;
d5e35230 1346
34400008
GM
1347
1348/* Initialize interval allocation. */
1349
d5e35230 1350static void
971de7fb 1351init_intervals (void)
d5e35230 1352{
005ca5c7
DL
1353 interval_block = NULL;
1354 interval_block_index = INTERVAL_BLOCK_SIZE;
d5e35230
JA
1355 interval_free_list = 0;
1356}
1357
34400008
GM
1358
1359/* Return a new interval. */
d5e35230
JA
1360
1361INTERVAL
971de7fb 1362make_interval (void)
d5e35230
JA
1363{
1364 INTERVAL val;
1365
e2984df0
CY
1366 /* eassert (!handling_signal); */
1367
dafc79fa 1368 MALLOC_BLOCK_INPUT;
cfb2f32e 1369
d5e35230
JA
1370 if (interval_free_list)
1371 {
1372 val = interval_free_list;
439d5cb4 1373 interval_free_list = INTERVAL_PARENT (interval_free_list);
d5e35230
JA
1374 }
1375 else
1376 {
1377 if (interval_block_index == INTERVAL_BLOCK_SIZE)
1378 {
3c06d205
KH
1379 register struct interval_block *newi;
1380
34400008
GM
1381 newi = (struct interval_block *) lisp_malloc (sizeof *newi,
1382 MEM_TYPE_NON_LISP);
d5e35230 1383
d5e35230
JA
1384 newi->next = interval_block;
1385 interval_block = newi;
1386 interval_block_index = 0;
1387 }
1388 val = &interval_block->intervals[interval_block_index++];
1389 }
e2984df0 1390
dafc79fa 1391 MALLOC_UNBLOCK_INPUT;
e2984df0 1392
d5e35230 1393 consing_since_gc += sizeof (struct interval);
310ea200 1394 intervals_consed++;
d5e35230 1395 RESET_INTERVAL (val);
2336fe58 1396 val->gcmarkbit = 0;
d5e35230
JA
1397 return val;
1398}
1399
34400008
GM
1400
1401/* Mark Lisp objects in interval I. */
d5e35230
JA
1402
1403static void
971de7fb 1404mark_interval (register INTERVAL i, Lisp_Object dummy)
d5e35230 1405{
2336fe58
SM
1406 eassert (!i->gcmarkbit); /* Intervals are never shared. */
1407 i->gcmarkbit = 1;
49723c04 1408 mark_object (i->plist);
d5e35230
JA
1409}
1410
34400008
GM
1411
1412/* Mark the interval tree rooted in TREE. Don't call this directly;
1413 use the macro MARK_INTERVAL_TREE instead. */
1414
d5e35230 1415static void
971de7fb 1416mark_interval_tree (register INTERVAL tree)
d5e35230 1417{
e8720644
JB
1418 /* No need to test if this tree has been marked already; this
1419 function is always called through the MARK_INTERVAL_TREE macro,
1420 which takes care of that. */
1421
1e934989 1422 traverse_intervals_noorder (tree, mark_interval, Qnil);
d5e35230
JA
1423}
1424
34400008
GM
1425
1426/* Mark the interval tree rooted in I. */
1427
e8720644
JB
1428#define MARK_INTERVAL_TREE(i) \
1429 do { \
2336fe58 1430 if (!NULL_INTERVAL_P (i) && !i->gcmarkbit) \
e8720644
JB
1431 mark_interval_tree (i); \
1432 } while (0)
d5e35230 1433
34400008 1434
2e471eb5
GM
1435#define UNMARK_BALANCE_INTERVALS(i) \
1436 do { \
1437 if (! NULL_INTERVAL_P (i)) \
2336fe58 1438 (i) = balance_intervals (i); \
2e471eb5 1439 } while (0)
d5e35230 1440
cc2d8c6b 1441\f
6e5cb96f 1442/* Number support. If USE_LISP_UNION_TYPE is in effect, we
cc2d8c6b
KR
1443 can't create number objects in macros. */
1444#ifndef make_number
1445Lisp_Object
c566235d 1446make_number (EMACS_INT n)
cc2d8c6b
KR
1447{
1448 Lisp_Object obj;
1449 obj.s.val = n;
1450 obj.s.type = Lisp_Int;
1451 return obj;
1452}
1453#endif
d5e35230 1454\f
2e471eb5
GM
1455/***********************************************************************
1456 String Allocation
1457 ***********************************************************************/
1a4f1e2c 1458
2e471eb5
GM
1459/* Lisp_Strings are allocated in string_block structures. When a new
1460 string_block is allocated, all the Lisp_Strings it contains are
e0fead5d 1461 added to a free-list string_free_list. When a new Lisp_String is
2e471eb5
GM
1462 needed, it is taken from that list. During the sweep phase of GC,
1463 string_blocks that are entirely free are freed, except two which
1464 we keep.
7146af97 1465
2e471eb5
GM
1466 String data is allocated from sblock structures. Strings larger
1467 than LARGE_STRING_BYTES, get their own sblock, data for smaller
1468 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
7146af97 1469
2e471eb5
GM
1470 Sblocks consist internally of sdata structures, one for each
1471 Lisp_String. The sdata structure points to the Lisp_String it
1472 belongs to. The Lisp_String points back to the `u.data' member of
1473 its sdata structure.
7146af97 1474
2e471eb5
GM
1475 When a Lisp_String is freed during GC, it is put back on
1476 string_free_list, and its `data' member and its sdata's `string'
1477 pointer is set to null. The size of the string is recorded in the
1478 `u.nbytes' member of the sdata. So, sdata structures that are no
1479 longer used, can be easily recognized, and it's easy to compact the
1480 sblocks of small strings which we do in compact_small_strings. */
7146af97 1481
2e471eb5
GM
1482/* Size in bytes of an sblock structure used for small strings. This
1483 is 8192 minus malloc overhead. */
7146af97 1484
2e471eb5 1485#define SBLOCK_SIZE 8188
c8099634 1486
2e471eb5
GM
1487/* Strings larger than this are considered large strings. String data
1488 for large strings is allocated from individual sblocks. */
7146af97 1489
2e471eb5
GM
1490#define LARGE_STRING_BYTES 1024
1491
1492/* Structure describing string memory sub-allocated from an sblock.
1493 This is where the contents of Lisp strings are stored. */
1494
1495struct sdata
7146af97 1496{
2e471eb5
GM
1497 /* Back-pointer to the string this sdata belongs to. If null, this
1498 structure is free, and the NBYTES member of the union below
34400008 1499 contains the string's byte size (the same value that STRING_BYTES
2e471eb5
GM
1500 would return if STRING were non-null). If non-null, STRING_BYTES
1501 (STRING) is the size of the data, and DATA contains the string's
1502 contents. */
1503 struct Lisp_String *string;
7146af97 1504
31d929e5 1505#ifdef GC_CHECK_STRING_BYTES
177c0ea7 1506
31d929e5
GM
1507 EMACS_INT nbytes;
1508 unsigned char data[1];
177c0ea7 1509
31d929e5
GM
1510#define SDATA_NBYTES(S) (S)->nbytes
1511#define SDATA_DATA(S) (S)->data
36372bf9 1512#define SDATA_SELECTOR(member) member
177c0ea7 1513
31d929e5
GM
1514#else /* not GC_CHECK_STRING_BYTES */
1515
2e471eb5
GM
1516 union
1517 {
83998b7a 1518 /* When STRING is non-null. */
2e471eb5
GM
1519 unsigned char data[1];
1520
1521 /* When STRING is null. */
1522 EMACS_INT nbytes;
1523 } u;
177c0ea7 1524
31d929e5
GM
1525#define SDATA_NBYTES(S) (S)->u.nbytes
1526#define SDATA_DATA(S) (S)->u.data
36372bf9 1527#define SDATA_SELECTOR(member) u.member
31d929e5
GM
1528
1529#endif /* not GC_CHECK_STRING_BYTES */
36372bf9
PE
1530
1531#define SDATA_DATA_OFFSET offsetof (struct sdata, SDATA_SELECTOR (data))
2e471eb5
GM
1532};
1533
31d929e5 1534
2e471eb5
GM
1535/* Structure describing a block of memory which is sub-allocated to
1536 obtain string data memory for strings. Blocks for small strings
1537 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
1538 as large as needed. */
1539
1540struct sblock
7146af97 1541{
2e471eb5
GM
1542 /* Next in list. */
1543 struct sblock *next;
7146af97 1544
2e471eb5
GM
1545 /* Pointer to the next free sdata block. This points past the end
1546 of the sblock if there isn't any space left in this block. */
1547 struct sdata *next_free;
1548
1549 /* Start of data. */
1550 struct sdata first_data;
1551};
1552
1553/* Number of Lisp strings in a string_block structure. The 1020 is
1554 1024 minus malloc overhead. */
1555
19bcad1f 1556#define STRING_BLOCK_SIZE \
2e471eb5
GM
1557 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
1558
1559/* Structure describing a block from which Lisp_String structures
1560 are allocated. */
1561
1562struct string_block
7146af97 1563{
6b61353c 1564 /* Place `strings' first, to preserve alignment. */
19bcad1f 1565 struct Lisp_String strings[STRING_BLOCK_SIZE];
6b61353c 1566 struct string_block *next;
2e471eb5 1567};
7146af97 1568
2e471eb5
GM
1569/* Head and tail of the list of sblock structures holding Lisp string
1570 data. We always allocate from current_sblock. The NEXT pointers
1571 in the sblock structures go from oldest_sblock to current_sblock. */
3c06d205 1572
2e471eb5 1573static struct sblock *oldest_sblock, *current_sblock;
7146af97 1574
2e471eb5 1575/* List of sblocks for large strings. */
7146af97 1576
2e471eb5 1577static struct sblock *large_sblocks;
7146af97 1578
5a25e253 1579/* List of string_block structures. */
7146af97 1580
2e471eb5 1581static struct string_block *string_blocks;
7146af97 1582
2e471eb5 1583/* Free-list of Lisp_Strings. */
7146af97 1584
2e471eb5 1585static struct Lisp_String *string_free_list;
7146af97 1586
2e471eb5 1587/* Number of live and free Lisp_Strings. */
c8099634 1588
c0c5c8ae 1589static EMACS_INT total_strings, total_free_strings;
7146af97 1590
2e471eb5
GM
1591/* Number of bytes used by live strings. */
1592
14162469 1593static EMACS_INT total_string_size;
2e471eb5
GM
1594
1595/* Given a pointer to a Lisp_String S which is on the free-list
1596 string_free_list, return a pointer to its successor in the
1597 free-list. */
1598
1599#define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
1600
1601/* Return a pointer to the sdata structure belonging to Lisp string S.
1602 S must be live, i.e. S->data must not be null. S->data is actually
1603 a pointer to the `u.data' member of its sdata structure; the
1604 structure starts at a constant offset in front of that. */
177c0ea7 1605
36372bf9 1606#define SDATA_OF_STRING(S) ((struct sdata *) ((S)->data - SDATA_DATA_OFFSET))
31d929e5 1607
212f33f1
KS
1608
1609#ifdef GC_CHECK_STRING_OVERRUN
bdbed949
KS
1610
1611/* We check for overrun in string data blocks by appending a small
1612 "cookie" after each allocated string data block, and check for the
8349069c 1613 presence of this cookie during GC. */
bdbed949
KS
1614
1615#define GC_STRING_OVERRUN_COOKIE_SIZE 4
bfd1c781
PE
1616static char const string_overrun_cookie[GC_STRING_OVERRUN_COOKIE_SIZE] =
1617 { '\xde', '\xad', '\xbe', '\xef' };
bdbed949 1618
212f33f1 1619#else
bdbed949 1620#define GC_STRING_OVERRUN_COOKIE_SIZE 0
212f33f1
KS
1621#endif
1622
2e471eb5
GM
1623/* Value is the size of an sdata structure large enough to hold NBYTES
1624 bytes of string data. The value returned includes a terminating
1625 NUL byte, the size of the sdata structure, and padding. */
1626
31d929e5
GM
1627#ifdef GC_CHECK_STRING_BYTES
1628
2e471eb5 1629#define SDATA_SIZE(NBYTES) \
36372bf9 1630 ((SDATA_DATA_OFFSET \
2e471eb5
GM
1631 + (NBYTES) + 1 \
1632 + sizeof (EMACS_INT) - 1) \
1633 & ~(sizeof (EMACS_INT) - 1))
1634
31d929e5
GM
1635#else /* not GC_CHECK_STRING_BYTES */
1636
f2d3008d
PE
1637/* The 'max' reserves space for the nbytes union member even when NBYTES + 1 is
1638 less than the size of that member. The 'max' is not needed when
1639 SDATA_DATA_OFFSET is a multiple of sizeof (EMACS_INT), because then the
1640 alignment code reserves enough space. */
1641
1642#define SDATA_SIZE(NBYTES) \
1643 ((SDATA_DATA_OFFSET \
1644 + (SDATA_DATA_OFFSET % sizeof (EMACS_INT) == 0 \
1645 ? NBYTES \
1646 : max (NBYTES, sizeof (EMACS_INT) - 1)) \
1647 + 1 \
1648 + sizeof (EMACS_INT) - 1) \
31d929e5
GM
1649 & ~(sizeof (EMACS_INT) - 1))
1650
1651#endif /* not GC_CHECK_STRING_BYTES */
2e471eb5 1652
bdbed949
KS
1653/* Extra bytes to allocate for each string. */
1654
1655#define GC_STRING_EXTRA (GC_STRING_OVERRUN_COOKIE_SIZE)
1656
c9d624c6
PE
1657/* Exact bound on the number of bytes in a string, not counting the
1658 terminating null. A string cannot contain more bytes than
1659 STRING_BYTES_BOUND, nor can it be so long that the size_t
1660 arithmetic in allocate_string_data would overflow while it is
1661 calculating a value to be passed to malloc. */
1662#define STRING_BYTES_MAX \
1663 min (STRING_BYTES_BOUND, \
1664 ((SIZE_MAX - XMALLOC_OVERRUN_CHECK_SIZE - GC_STRING_EXTRA \
1665 - offsetof (struct sblock, first_data) \
1666 - SDATA_DATA_OFFSET) \
1667 & ~(sizeof (EMACS_INT) - 1)))
1668
2e471eb5 1669/* Initialize string allocation. Called from init_alloc_once. */
d457598b 1670
d3d47262 1671static void
971de7fb 1672init_strings (void)
7146af97 1673{
2e471eb5
GM
1674 total_strings = total_free_strings = total_string_size = 0;
1675 oldest_sblock = current_sblock = large_sblocks = NULL;
1676 string_blocks = NULL;
2e471eb5 1677 string_free_list = NULL;
4d774b0f
JB
1678 empty_unibyte_string = make_pure_string ("", 0, 0, 0);
1679 empty_multibyte_string = make_pure_string ("", 0, 0, 1);
7146af97
JB
1680}
1681
2e471eb5 1682
361b097f
GM
1683#ifdef GC_CHECK_STRING_BYTES
1684
361b097f
GM
1685static int check_string_bytes_count;
1686
676a7251
GM
1687#define CHECK_STRING_BYTES(S) STRING_BYTES (S)
1688
1689
1690/* Like GC_STRING_BYTES, but with debugging check. */
1691
14162469
EZ
1692EMACS_INT
1693string_bytes (struct Lisp_String *s)
676a7251 1694{
14162469
EZ
1695 EMACS_INT nbytes =
1696 (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte);
1697
676a7251
GM
1698 if (!PURE_POINTER_P (s)
1699 && s->data
1700 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1701 abort ();
1702 return nbytes;
1703}
177c0ea7 1704
2c5bd608 1705/* Check validity of Lisp strings' string_bytes member in B. */
676a7251 1706
d3d47262 1707static void
d0f4e1f5 1708check_sblock (struct sblock *b)
361b097f 1709{
676a7251 1710 struct sdata *from, *end, *from_end;
177c0ea7 1711
676a7251 1712 end = b->next_free;
177c0ea7 1713
676a7251 1714 for (from = &b->first_data; from < end; from = from_end)
361b097f 1715 {
676a7251
GM
1716 /* Compute the next FROM here because copying below may
1717 overwrite data we need to compute it. */
14162469 1718 EMACS_INT nbytes;
177c0ea7 1719
676a7251
GM
1720 /* Check that the string size recorded in the string is the
1721 same as the one recorded in the sdata structure. */
1722 if (from->string)
1723 CHECK_STRING_BYTES (from->string);
177c0ea7 1724
676a7251
GM
1725 if (from->string)
1726 nbytes = GC_STRING_BYTES (from->string);
1727 else
1728 nbytes = SDATA_NBYTES (from);
177c0ea7 1729
676a7251 1730 nbytes = SDATA_SIZE (nbytes);
212f33f1 1731 from_end = (struct sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
676a7251
GM
1732 }
1733}
361b097f 1734
676a7251
GM
1735
1736/* Check validity of Lisp strings' string_bytes member. ALL_P
1737 non-zero means check all strings, otherwise check only most
1738 recently allocated strings. Used for hunting a bug. */
1739
d3d47262 1740static void
d0f4e1f5 1741check_string_bytes (int all_p)
676a7251
GM
1742{
1743 if (all_p)
1744 {
1745 struct sblock *b;
1746
1747 for (b = large_sblocks; b; b = b->next)
1748 {
1749 struct Lisp_String *s = b->first_data.string;
1750 if (s)
1751 CHECK_STRING_BYTES (s);
361b097f 1752 }
177c0ea7 1753
676a7251
GM
1754 for (b = oldest_sblock; b; b = b->next)
1755 check_sblock (b);
361b097f 1756 }
676a7251
GM
1757 else
1758 check_sblock (current_sblock);
361b097f
GM
1759}
1760
1761#endif /* GC_CHECK_STRING_BYTES */
1762
212f33f1
KS
1763#ifdef GC_CHECK_STRING_FREE_LIST
1764
bdbed949
KS
1765/* Walk through the string free list looking for bogus next pointers.
1766 This may catch buffer overrun from a previous string. */
1767
212f33f1 1768static void
d0f4e1f5 1769check_string_free_list (void)
212f33f1
KS
1770{
1771 struct Lisp_String *s;
1772
1773 /* Pop a Lisp_String off the free-list. */
1774 s = string_free_list;
1775 while (s != NULL)
1776 {
d01a7826 1777 if ((uintptr_t) s < 1024)
212f33f1
KS
1778 abort();
1779 s = NEXT_FREE_LISP_STRING (s);
1780 }
1781}
1782#else
1783#define check_string_free_list()
1784#endif
361b097f 1785
2e471eb5
GM
1786/* Return a new Lisp_String. */
1787
1788static struct Lisp_String *
971de7fb 1789allocate_string (void)
7146af97 1790{
2e471eb5 1791 struct Lisp_String *s;
7146af97 1792
e2984df0
CY
1793 /* eassert (!handling_signal); */
1794
dafc79fa 1795 MALLOC_BLOCK_INPUT;
cfb2f32e 1796
2e471eb5
GM
1797 /* If the free-list is empty, allocate a new string_block, and
1798 add all the Lisp_Strings in it to the free-list. */
1799 if (string_free_list == NULL)
7146af97 1800 {
2e471eb5
GM
1801 struct string_block *b;
1802 int i;
1803
34400008 1804 b = (struct string_block *) lisp_malloc (sizeof *b, MEM_TYPE_STRING);
72af86bd 1805 memset (b, 0, sizeof *b);
2e471eb5
GM
1806 b->next = string_blocks;
1807 string_blocks = b;
2e471eb5 1808
19bcad1f 1809 for (i = STRING_BLOCK_SIZE - 1; i >= 0; --i)
7146af97 1810 {
2e471eb5
GM
1811 s = b->strings + i;
1812 NEXT_FREE_LISP_STRING (s) = string_free_list;
1813 string_free_list = s;
7146af97 1814 }
2e471eb5 1815
19bcad1f 1816 total_free_strings += STRING_BLOCK_SIZE;
7146af97 1817 }
c0f51373 1818
bdbed949 1819 check_string_free_list ();
212f33f1 1820
2e471eb5
GM
1821 /* Pop a Lisp_String off the free-list. */
1822 s = string_free_list;
1823 string_free_list = NEXT_FREE_LISP_STRING (s);
c0f51373 1824
dafc79fa 1825 MALLOC_UNBLOCK_INPUT;
e2984df0 1826
2e471eb5 1827 /* Probably not strictly necessary, but play it safe. */
72af86bd 1828 memset (s, 0, sizeof *s);
c0f51373 1829
2e471eb5
GM
1830 --total_free_strings;
1831 ++total_strings;
1832 ++strings_consed;
1833 consing_since_gc += sizeof *s;
c0f51373 1834
361b097f 1835#ifdef GC_CHECK_STRING_BYTES
e39a993c 1836 if (!noninteractive)
361b097f 1837 {
676a7251
GM
1838 if (++check_string_bytes_count == 200)
1839 {
1840 check_string_bytes_count = 0;
1841 check_string_bytes (1);
1842 }
1843 else
1844 check_string_bytes (0);
361b097f 1845 }
676a7251 1846#endif /* GC_CHECK_STRING_BYTES */
361b097f 1847
2e471eb5 1848 return s;
c0f51373 1849}
7146af97 1850
7146af97 1851
2e471eb5
GM
1852/* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
1853 plus a NUL byte at the end. Allocate an sdata structure for S, and
1854 set S->data to its `u.data' member. Store a NUL byte at the end of
1855 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
1856 S->data if it was initially non-null. */
7146af97 1857
2e471eb5 1858void
413d18e7
EZ
1859allocate_string_data (struct Lisp_String *s,
1860 EMACS_INT nchars, EMACS_INT nbytes)
7146af97 1861{
5c5fecb3 1862 struct sdata *data, *old_data;
2e471eb5 1863 struct sblock *b;
14162469 1864 EMACS_INT needed, old_nbytes;
7146af97 1865
c9d624c6
PE
1866 if (STRING_BYTES_MAX < nbytes)
1867 string_overflow ();
1868
2e471eb5
GM
1869 /* Determine the number of bytes needed to store NBYTES bytes
1870 of string data. */
1871 needed = SDATA_SIZE (nbytes);
e2984df0
CY
1872 old_data = s->data ? SDATA_OF_STRING (s) : NULL;
1873 old_nbytes = GC_STRING_BYTES (s);
1874
dafc79fa 1875 MALLOC_BLOCK_INPUT;
7146af97 1876
2e471eb5
GM
1877 if (nbytes > LARGE_STRING_BYTES)
1878 {
36372bf9 1879 size_t size = offsetof (struct sblock, first_data) + needed;
2e471eb5
GM
1880
1881#ifdef DOUG_LEA_MALLOC
f8608968
GM
1882 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
1883 because mapped region contents are not preserved in
d36b182f
DL
1884 a dumped Emacs.
1885
1886 In case you think of allowing it in a dumped Emacs at the
1887 cost of not being able to re-dump, there's another reason:
1888 mmap'ed data typically have an address towards the top of the
1889 address space, which won't fit into an EMACS_INT (at least on
1890 32-bit systems with the current tagging scheme). --fx */
2e471eb5
GM
1891 mallopt (M_MMAP_MAX, 0);
1892#endif
1893
212f33f1 1894 b = (struct sblock *) lisp_malloc (size + GC_STRING_EXTRA, MEM_TYPE_NON_LISP);
177c0ea7 1895
2e471eb5
GM
1896#ifdef DOUG_LEA_MALLOC
1897 /* Back to a reasonable maximum of mmap'ed areas. */
1898 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1899#endif
177c0ea7 1900
2e471eb5
GM
1901 b->next_free = &b->first_data;
1902 b->first_data.string = NULL;
1903 b->next = large_sblocks;
1904 large_sblocks = b;
1905 }
1906 else if (current_sblock == NULL
1907 || (((char *) current_sblock + SBLOCK_SIZE
1908 - (char *) current_sblock->next_free)
212f33f1 1909 < (needed + GC_STRING_EXTRA)))
2e471eb5
GM
1910 {
1911 /* Not enough room in the current sblock. */
34400008 1912 b = (struct sblock *) lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP);
2e471eb5
GM
1913 b->next_free = &b->first_data;
1914 b->first_data.string = NULL;
1915 b->next = NULL;
1916
1917 if (current_sblock)
1918 current_sblock->next = b;
1919 else
1920 oldest_sblock = b;
1921 current_sblock = b;
1922 }
1923 else
1924 b = current_sblock;
5c5fecb3 1925
2e471eb5 1926 data = b->next_free;
a0b08700
CY
1927 b->next_free = (struct sdata *) ((char *) data + needed + GC_STRING_EXTRA);
1928
dafc79fa 1929 MALLOC_UNBLOCK_INPUT;
e2984df0 1930
2e471eb5 1931 data->string = s;
31d929e5
GM
1932 s->data = SDATA_DATA (data);
1933#ifdef GC_CHECK_STRING_BYTES
1934 SDATA_NBYTES (data) = nbytes;
1935#endif
2e471eb5
GM
1936 s->size = nchars;
1937 s->size_byte = nbytes;
1938 s->data[nbytes] = '\0';
212f33f1 1939#ifdef GC_CHECK_STRING_OVERRUN
000098c1
PE
1940 memcpy ((char *) data + needed, string_overrun_cookie,
1941 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);
2e471eb5
GM
2036 string_free_list = free_list_before;
2037 }
2038 else
2039 {
2040 total_free_strings += nfree;
2041 b->next = live_blocks;
2042 live_blocks = b;
2043 }
2044 }
2045
bdbed949 2046 check_string_free_list ();
212f33f1 2047
2e471eb5
GM
2048 string_blocks = live_blocks;
2049 free_large_strings ();
2050 compact_small_strings ();
212f33f1 2051
bdbed949 2052 check_string_free_list ();
2e471eb5
GM
2053}
2054
2055
2056/* Free dead large strings. */
2057
2058static void
971de7fb 2059free_large_strings (void)
2e471eb5
GM
2060{
2061 struct sblock *b, *next;
2062 struct sblock *live_blocks = NULL;
177c0ea7 2063
2e471eb5
GM
2064 for (b = large_sblocks; b; b = next)
2065 {
2066 next = b->next;
2067
2068 if (b->first_data.string == NULL)
2069 lisp_free (b);
2070 else
2071 {
2072 b->next = live_blocks;
2073 live_blocks = b;
2074 }
2075 }
2076
2077 large_sblocks = live_blocks;
2078}
2079
2080
2081/* Compact data of small strings. Free sblocks that don't contain
2082 data of live strings after compaction. */
2083
2084static void
971de7fb 2085compact_small_strings (void)
2e471eb5
GM
2086{
2087 struct sblock *b, *tb, *next;
2088 struct sdata *from, *to, *end, *tb_end;
2089 struct sdata *to_end, *from_end;
2090
2091 /* TB is the sblock we copy to, TO is the sdata within TB we copy
2092 to, and TB_END is the end of TB. */
2093 tb = oldest_sblock;
2094 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
2095 to = &tb->first_data;
2096
2097 /* Step through the blocks from the oldest to the youngest. We
2098 expect that old blocks will stabilize over time, so that less
2099 copying will happen this way. */
2100 for (b = oldest_sblock; b; b = b->next)
2101 {
2102 end = b->next_free;
2103 xassert ((char *) end <= (char *) b + SBLOCK_SIZE);
177c0ea7 2104
2e471eb5
GM
2105 for (from = &b->first_data; from < end; from = from_end)
2106 {
2107 /* Compute the next FROM here because copying below may
2108 overwrite data we need to compute it. */
14162469 2109 EMACS_INT nbytes;
2e471eb5 2110
31d929e5
GM
2111#ifdef GC_CHECK_STRING_BYTES
2112 /* Check that the string size recorded in the string is the
2113 same as the one recorded in the sdata structure. */
2114 if (from->string
2115 && GC_STRING_BYTES (from->string) != SDATA_NBYTES (from))
2116 abort ();
2117#endif /* GC_CHECK_STRING_BYTES */
177c0ea7 2118
2e471eb5
GM
2119 if (from->string)
2120 nbytes = GC_STRING_BYTES (from->string);
2121 else
31d929e5 2122 nbytes = SDATA_NBYTES (from);
177c0ea7 2123
212f33f1
KS
2124 if (nbytes > LARGE_STRING_BYTES)
2125 abort ();
212f33f1 2126
2e471eb5 2127 nbytes = SDATA_SIZE (nbytes);
212f33f1
KS
2128 from_end = (struct sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
2129
2130#ifdef GC_CHECK_STRING_OVERRUN
72af86bd
AS
2131 if (memcmp (string_overrun_cookie,
2132 (char *) from_end - GC_STRING_OVERRUN_COOKIE_SIZE,
2133 GC_STRING_OVERRUN_COOKIE_SIZE))
212f33f1
KS
2134 abort ();
2135#endif
177c0ea7 2136
2e471eb5
GM
2137 /* FROM->string non-null means it's alive. Copy its data. */
2138 if (from->string)
2139 {
2140 /* If TB is full, proceed with the next sblock. */
212f33f1 2141 to_end = (struct sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5
GM
2142 if (to_end > tb_end)
2143 {
2144 tb->next_free = to;
2145 tb = tb->next;
2146 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
2147 to = &tb->first_data;
212f33f1 2148 to_end = (struct sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5 2149 }
177c0ea7 2150
2e471eb5
GM
2151 /* Copy, and update the string's `data' pointer. */
2152 if (from != to)
2153 {
3c616cfa 2154 xassert (tb != b || to < from);
72af86bd 2155 memmove (to, from, nbytes + GC_STRING_EXTRA);
31d929e5 2156 to->string->data = SDATA_DATA (to);
2e471eb5
GM
2157 }
2158
2159 /* Advance past the sdata we copied to. */
2160 to = to_end;
2161 }
2162 }
2163 }
2164
2165 /* The rest of the sblocks following TB don't contain live data, so
2166 we can free them. */
2167 for (b = tb->next; b; b = next)
2168 {
2169 next = b->next;
2170 lisp_free (b);
2171 }
2172
2173 tb->next_free = to;
2174 tb->next = NULL;
2175 current_sblock = tb;
2176}
2177
cb93f9be
PE
2178void
2179string_overflow (void)
2180{
2181 error ("Maximum string size exceeded");
2182}
2e471eb5 2183
a7ca3326 2184DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
69623621
RS
2185 doc: /* Return a newly created string of length LENGTH, with INIT in each element.
2186LENGTH must be an integer.
2187INIT must be an integer that represents a character. */)
5842a27b 2188 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2189{
2190 register Lisp_Object val;
2191 register unsigned char *p, *end;
14162469
EZ
2192 int c;
2193 EMACS_INT nbytes;
2e471eb5 2194
b7826503 2195 CHECK_NATNUM (length);
2bccce07 2196 CHECK_CHARACTER (init);
2e471eb5 2197
2bccce07 2198 c = XFASTINT (init);
830ff83b 2199 if (ASCII_CHAR_P (c))
2e471eb5
GM
2200 {
2201 nbytes = XINT (length);
2202 val = make_uninit_string (nbytes);
d5db4077
KR
2203 p = SDATA (val);
2204 end = p + SCHARS (val);
2e471eb5
GM
2205 while (p != end)
2206 *p++ = c;
2207 }
2208 else
2209 {
d942b71c 2210 unsigned char str[MAX_MULTIBYTE_LENGTH];
2e471eb5 2211 int len = CHAR_STRING (c, str);
14162469 2212 EMACS_INT string_len = XINT (length);
2e471eb5 2213
d1f3d2af 2214 if (string_len > STRING_BYTES_MAX / len)
cb93f9be 2215 string_overflow ();
14162469
EZ
2216 nbytes = len * string_len;
2217 val = make_uninit_multibyte_string (string_len, nbytes);
d5db4077 2218 p = SDATA (val);
2e471eb5
GM
2219 end = p + nbytes;
2220 while (p != end)
2221 {
72af86bd 2222 memcpy (p, str, len);
2e471eb5
GM
2223 p += len;
2224 }
2225 }
177c0ea7 2226
2e471eb5
GM
2227 *p = 0;
2228 return val;
2229}
2230
2231
a7ca3326 2232DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
909e3b33 2233 doc: /* Return a new bool-vector of length LENGTH, using INIT for each element.
7ee72033 2234LENGTH must be a number. INIT matters only in whether it is t or nil. */)
5842a27b 2235 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2236{
2237 register Lisp_Object val;
2238 struct Lisp_Bool_Vector *p;
14162469
EZ
2239 EMACS_INT length_in_chars, length_in_elts;
2240 int bits_per_value;
2e471eb5 2241
b7826503 2242 CHECK_NATNUM (length);
2e471eb5 2243
a097329f 2244 bits_per_value = sizeof (EMACS_INT) * BOOL_VECTOR_BITS_PER_CHAR;
2e471eb5
GM
2245
2246 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
a097329f
AS
2247 length_in_chars = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
2248 / BOOL_VECTOR_BITS_PER_CHAR);
2e471eb5
GM
2249
2250 /* We must allocate one more elements than LENGTH_IN_ELTS for the
2251 slot `size' of the struct Lisp_Bool_Vector. */
2252 val = Fmake_vector (make_number (length_in_elts + 1), Qnil);
177c0ea7 2253
eab3844f
PE
2254 /* No Lisp_Object to trace in there. */
2255 XSETPVECTYPESIZE (XVECTOR (val), PVEC_BOOL_VECTOR, 0);
d2029e5b
SM
2256
2257 p = XBOOL_VECTOR (val);
2e471eb5 2258 p->size = XFASTINT (length);
177c0ea7 2259
c78baabf 2260 memset (p->data, NILP (init) ? 0 : -1, length_in_chars);
177c0ea7 2261
2e471eb5 2262 /* Clear the extraneous bits in the last byte. */
a097329f 2263 if (XINT (length) != length_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
d2029e5b 2264 p->data[length_in_chars - 1]
a097329f 2265 &= (1 << (XINT (length) % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
2e471eb5
GM
2266
2267 return val;
2268}
2269
2270
2271/* Make a string from NBYTES bytes at CONTENTS, and compute the number
2272 of characters from the contents. This string may be unibyte or
2273 multibyte, depending on the contents. */
2274
2275Lisp_Object
14162469 2276make_string (const char *contents, EMACS_INT nbytes)
2e471eb5
GM
2277{
2278 register Lisp_Object val;
14162469 2279 EMACS_INT nchars, multibyte_nbytes;
9eac9d59 2280
90256841
PE
2281 parse_str_as_multibyte ((const unsigned char *) contents, nbytes,
2282 &nchars, &multibyte_nbytes);
9eac9d59
KH
2283 if (nbytes == nchars || nbytes != multibyte_nbytes)
2284 /* CONTENTS contains no multibyte sequences or contains an invalid
2285 multibyte sequence. We must make unibyte string. */
495a6df3
KH
2286 val = make_unibyte_string (contents, nbytes);
2287 else
2288 val = make_multibyte_string (contents, nchars, nbytes);
2e471eb5
GM
2289 return val;
2290}
2291
2292
2293/* Make an unibyte string from LENGTH bytes at CONTENTS. */
2294
2295Lisp_Object
14162469 2296make_unibyte_string (const char *contents, EMACS_INT length)
2e471eb5
GM
2297{
2298 register Lisp_Object val;
2299 val = make_uninit_string (length);
72af86bd 2300 memcpy (SDATA (val), contents, length);
2e471eb5
GM
2301 return val;
2302}
2303
2304
2305/* Make a multibyte string from NCHARS characters occupying NBYTES
2306 bytes at CONTENTS. */
2307
2308Lisp_Object
14162469
EZ
2309make_multibyte_string (const char *contents,
2310 EMACS_INT nchars, EMACS_INT nbytes)
2e471eb5
GM
2311{
2312 register Lisp_Object val;
2313 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2314 memcpy (SDATA (val), contents, nbytes);
2e471eb5
GM
2315 return val;
2316}
2317
2318
2319/* Make a string from NCHARS characters occupying NBYTES bytes at
2320 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
2321
2322Lisp_Object
14162469
EZ
2323make_string_from_bytes (const char *contents,
2324 EMACS_INT nchars, EMACS_INT nbytes)
2e471eb5
GM
2325{
2326 register Lisp_Object val;
2327 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2328 memcpy (SDATA (val), contents, nbytes);
d5db4077
KR
2329 if (SBYTES (val) == SCHARS (val))
2330 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2331 return val;
2332}
2333
2334
2335/* Make a string from NCHARS characters occupying NBYTES bytes at
2336 CONTENTS. The argument MULTIBYTE controls whether to label the
229b28c4
KH
2337 string as multibyte. If NCHARS is negative, it counts the number of
2338 characters by itself. */
2e471eb5
GM
2339
2340Lisp_Object
14162469
EZ
2341make_specified_string (const char *contents,
2342 EMACS_INT nchars, EMACS_INT nbytes, int multibyte)
2e471eb5
GM
2343{
2344 register Lisp_Object val;
229b28c4
KH
2345
2346 if (nchars < 0)
2347 {
2348 if (multibyte)
90256841
PE
2349 nchars = multibyte_chars_in_text ((const unsigned char *) contents,
2350 nbytes);
229b28c4
KH
2351 else
2352 nchars = nbytes;
2353 }
2e471eb5 2354 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2355 memcpy (SDATA (val), contents, nbytes);
2e471eb5 2356 if (!multibyte)
d5db4077 2357 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2358 return val;
2359}
2360
2361
2362/* Make a string from the data at STR, treating it as multibyte if the
2363 data warrants. */
2364
2365Lisp_Object
971de7fb 2366build_string (const char *str)
2e471eb5
GM
2367{
2368 return make_string (str, strlen (str));
2369}
2370
2371
2372/* Return an unibyte Lisp_String set up to hold LENGTH characters
2373 occupying LENGTH bytes. */
2374
2375Lisp_Object
413d18e7 2376make_uninit_string (EMACS_INT length)
2e471eb5
GM
2377{
2378 Lisp_Object val;
4d774b0f
JB
2379
2380 if (!length)
2381 return empty_unibyte_string;
2e471eb5 2382 val = make_uninit_multibyte_string (length, length);
d5db4077 2383 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2384 return val;
2385}
2386
2387
2388/* Return a multibyte Lisp_String set up to hold NCHARS characters
2389 which occupy NBYTES bytes. */
2390
2391Lisp_Object
413d18e7 2392make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
2e471eb5
GM
2393{
2394 Lisp_Object string;
2395 struct Lisp_String *s;
2396
2397 if (nchars < 0)
2398 abort ();
4d774b0f
JB
2399 if (!nbytes)
2400 return empty_multibyte_string;
2e471eb5
GM
2401
2402 s = allocate_string ();
2403 allocate_string_data (s, nchars, nbytes);
2404 XSETSTRING (string, s);
2405 string_chars_consed += nbytes;
2406 return string;
2407}
2408
2409
2410\f
2411/***********************************************************************
2412 Float Allocation
2413 ***********************************************************************/
2414
2e471eb5
GM
2415/* We store float cells inside of float_blocks, allocating a new
2416 float_block with malloc whenever necessary. Float cells reclaimed
2417 by GC are put on a free list to be reallocated before allocating
ab6780cd 2418 any new float cells from the latest float_block. */
2e471eb5 2419
6b61353c
KH
2420#define FLOAT_BLOCK_SIZE \
2421 (((BLOCK_BYTES - sizeof (struct float_block *) \
2422 /* The compiler might add padding at the end. */ \
2423 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
ab6780cd
SM
2424 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2425
2426#define GETMARKBIT(block,n) \
2427 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2428 >> ((n) % (sizeof(int) * CHAR_BIT))) \
2429 & 1)
2430
2431#define SETMARKBIT(block,n) \
2432 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2433 |= 1 << ((n) % (sizeof(int) * CHAR_BIT))
2434
2435#define UNSETMARKBIT(block,n) \
2436 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2437 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT)))
2438
2439#define FLOAT_BLOCK(fptr) \
d01a7826 2440 ((struct float_block *) (((uintptr_t) (fptr)) & ~(BLOCK_ALIGN - 1)))
ab6780cd
SM
2441
2442#define FLOAT_INDEX(fptr) \
d01a7826 2443 ((((uintptr_t) (fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float))
2e471eb5
GM
2444
2445struct float_block
2446{
ab6780cd 2447 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */
2e471eb5 2448 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
ab6780cd
SM
2449 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
2450 struct float_block *next;
2e471eb5
GM
2451};
2452
ab6780cd
SM
2453#define FLOAT_MARKED_P(fptr) \
2454 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2455
2456#define FLOAT_MARK(fptr) \
2457 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2458
2459#define FLOAT_UNMARK(fptr) \
2460 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2461
34400008
GM
2462/* Current float_block. */
2463
244ed907 2464static struct float_block *float_block;
34400008
GM
2465
2466/* Index of first unused Lisp_Float in the current float_block. */
2467
244ed907 2468static int float_block_index;
2e471eb5 2469
34400008
GM
2470/* Free-list of Lisp_Floats. */
2471
244ed907 2472static struct Lisp_Float *float_free_list;
2e471eb5 2473
34400008 2474
966533c9 2475/* Initialize float allocation. */
34400008 2476
d3d47262 2477static void
971de7fb 2478init_float (void)
2e471eb5 2479{
08b7c2cb
SM
2480 float_block = NULL;
2481 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */
2e471eb5 2482 float_free_list = 0;
2e471eb5
GM
2483}
2484
34400008 2485
34400008
GM
2486/* Return a new float object with value FLOAT_VALUE. */
2487
2e471eb5 2488Lisp_Object
971de7fb 2489make_float (double float_value)
2e471eb5
GM
2490{
2491 register Lisp_Object val;
2492
e2984df0
CY
2493 /* eassert (!handling_signal); */
2494
dafc79fa 2495 MALLOC_BLOCK_INPUT;
cfb2f32e 2496
2e471eb5
GM
2497 if (float_free_list)
2498 {
2499 /* We use the data field for chaining the free list
2500 so that we won't use the same field that has the mark bit. */
2501 XSETFLOAT (val, float_free_list);
28a099a4 2502 float_free_list = float_free_list->u.chain;
2e471eb5
GM
2503 }
2504 else
2505 {
2506 if (float_block_index == FLOAT_BLOCK_SIZE)
2507 {
2508 register struct float_block *new;
2509
ab6780cd
SM
2510 new = (struct float_block *) lisp_align_malloc (sizeof *new,
2511 MEM_TYPE_FLOAT);
2e471eb5 2512 new->next = float_block;
72af86bd 2513 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2514 float_block = new;
2515 float_block_index = 0;
2e471eb5 2516 }
6b61353c
KH
2517 XSETFLOAT (val, &float_block->floats[float_block_index]);
2518 float_block_index++;
2e471eb5 2519 }
177c0ea7 2520
dafc79fa 2521 MALLOC_UNBLOCK_INPUT;
e2984df0 2522
f601cdf3 2523 XFLOAT_INIT (val, float_value);
6b61353c 2524 eassert (!FLOAT_MARKED_P (XFLOAT (val)));
2e471eb5
GM
2525 consing_since_gc += sizeof (struct Lisp_Float);
2526 floats_consed++;
2527 return val;
2528}
2529
2e471eb5
GM
2530
2531\f
2532/***********************************************************************
2533 Cons Allocation
2534 ***********************************************************************/
2535
2536/* We store cons cells inside of cons_blocks, allocating a new
2537 cons_block with malloc whenever necessary. Cons cells reclaimed by
2538 GC are put on a free list to be reallocated before allocating
08b7c2cb 2539 any new cons cells from the latest cons_block. */
2e471eb5
GM
2540
2541#define CONS_BLOCK_SIZE \
08b7c2cb
SM
2542 (((BLOCK_BYTES - sizeof (struct cons_block *)) * CHAR_BIT) \
2543 / (sizeof (struct Lisp_Cons) * CHAR_BIT + 1))
2544
2545#define CONS_BLOCK(fptr) \
d01a7826 2546 ((struct cons_block *) ((uintptr_t) (fptr) & ~(BLOCK_ALIGN - 1)))
08b7c2cb
SM
2547
2548#define CONS_INDEX(fptr) \
d01a7826 2549 (((uintptr_t) (fptr) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons))
2e471eb5
GM
2550
2551struct cons_block
2552{
08b7c2cb 2553 /* Place `conses' at the beginning, to ease up CONS_INDEX's job. */
2e471eb5 2554 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
08b7c2cb
SM
2555 int gcmarkbits[1 + CONS_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
2556 struct cons_block *next;
2e471eb5
GM
2557};
2558
08b7c2cb
SM
2559#define CONS_MARKED_P(fptr) \
2560 GETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2561
2562#define CONS_MARK(fptr) \
2563 SETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2564
2565#define CONS_UNMARK(fptr) \
2566 UNSETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2567
34400008
GM
2568/* Current cons_block. */
2569
244ed907 2570static struct cons_block *cons_block;
34400008
GM
2571
2572/* Index of first unused Lisp_Cons in the current block. */
2573
244ed907 2574static int cons_block_index;
2e471eb5 2575
34400008
GM
2576/* Free-list of Lisp_Cons structures. */
2577
244ed907 2578static struct Lisp_Cons *cons_free_list;
2e471eb5 2579
34400008
GM
2580
2581/* Initialize cons allocation. */
2582
d3d47262 2583static void
971de7fb 2584init_cons (void)
2e471eb5 2585{
08b7c2cb
SM
2586 cons_block = NULL;
2587 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */
2e471eb5 2588 cons_free_list = 0;
2e471eb5
GM
2589}
2590
34400008
GM
2591
2592/* Explicitly free a cons cell by putting it on the free-list. */
2e471eb5
GM
2593
2594void
971de7fb 2595free_cons (struct Lisp_Cons *ptr)
2e471eb5 2596{
28a099a4 2597 ptr->u.chain = cons_free_list;
34400008
GM
2598#if GC_MARK_STACK
2599 ptr->car = Vdead;
2600#endif
2e471eb5
GM
2601 cons_free_list = ptr;
2602}
2603
a7ca3326 2604DEFUN ("cons", Fcons, Scons, 2, 2, 0,
a6266d23 2605 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
5842a27b 2606 (Lisp_Object car, Lisp_Object cdr)
2e471eb5
GM
2607{
2608 register Lisp_Object val;
2609
e2984df0
CY
2610 /* eassert (!handling_signal); */
2611
dafc79fa 2612 MALLOC_BLOCK_INPUT;
cfb2f32e 2613
2e471eb5
GM
2614 if (cons_free_list)
2615 {
2616 /* We use the cdr for chaining the free list
2617 so that we won't use the same field that has the mark bit. */
2618 XSETCONS (val, cons_free_list);
28a099a4 2619 cons_free_list = cons_free_list->u.chain;
2e471eb5
GM
2620 }
2621 else
2622 {
2623 if (cons_block_index == CONS_BLOCK_SIZE)
2624 {
2625 register struct cons_block *new;
08b7c2cb
SM
2626 new = (struct cons_block *) lisp_align_malloc (sizeof *new,
2627 MEM_TYPE_CONS);
72af86bd 2628 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2629 new->next = cons_block;
2630 cons_block = new;
2631 cons_block_index = 0;
2e471eb5 2632 }
6b61353c
KH
2633 XSETCONS (val, &cons_block->conses[cons_block_index]);
2634 cons_block_index++;
2e471eb5 2635 }
177c0ea7 2636
dafc79fa 2637 MALLOC_UNBLOCK_INPUT;
e2984df0 2638
f3fbd155
KR
2639 XSETCAR (val, car);
2640 XSETCDR (val, cdr);
6b61353c 2641 eassert (!CONS_MARKED_P (XCONS (val)));
2e471eb5
GM
2642 consing_since_gc += sizeof (struct Lisp_Cons);
2643 cons_cells_consed++;
2644 return val;
2645}
2646
e5aab7e7 2647#ifdef GC_CHECK_CONS_LIST
e3e56238
RS
2648/* Get an error now if there's any junk in the cons free list. */
2649void
971de7fb 2650check_cons_list (void)
e3e56238
RS
2651{
2652 struct Lisp_Cons *tail = cons_free_list;
2653
e3e56238 2654 while (tail)
28a099a4 2655 tail = tail->u.chain;
e3e56238 2656}
e5aab7e7 2657#endif
34400008 2658
9b306d37
KS
2659/* Make a list of 1, 2, 3, 4 or 5 specified objects. */
2660
2661Lisp_Object
971de7fb 2662list1 (Lisp_Object arg1)
9b306d37
KS
2663{
2664 return Fcons (arg1, Qnil);
2665}
2e471eb5
GM
2666
2667Lisp_Object
971de7fb 2668list2 (Lisp_Object arg1, Lisp_Object arg2)
2e471eb5
GM
2669{
2670 return Fcons (arg1, Fcons (arg2, Qnil));
2671}
2672
34400008 2673
2e471eb5 2674Lisp_Object
971de7fb 2675list3 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
2e471eb5
GM
2676{
2677 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
2678}
2679
34400008 2680
2e471eb5 2681Lisp_Object
971de7fb 2682list4 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4)
2e471eb5
GM
2683{
2684 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
2685}
2686
34400008 2687
2e471eb5 2688Lisp_Object
971de7fb 2689list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
2e471eb5
GM
2690{
2691 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
2692 Fcons (arg5, Qnil)))));
2693}
2694
34400008 2695
a7ca3326 2696DEFUN ("list", Flist, Slist, 0, MANY, 0,
eae936e2 2697 doc: /* Return a newly created list with specified arguments as elements.
ae8e8122
MB
2698Any number of arguments, even zero arguments, are allowed.
2699usage: (list &rest OBJECTS) */)
f66c7cf8 2700 (ptrdiff_t nargs, Lisp_Object *args)
2e471eb5
GM
2701{
2702 register Lisp_Object val;
2703 val = Qnil;
2704
2705 while (nargs > 0)
2706 {
2707 nargs--;
2708 val = Fcons (args[nargs], val);
2709 }
2710 return val;
2711}
2712
34400008 2713
a7ca3326 2714DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
a6266d23 2715 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
5842a27b 2716 (register Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2717{
2718 register Lisp_Object val;
14162469 2719 register EMACS_INT size;
2e471eb5 2720
b7826503 2721 CHECK_NATNUM (length);
2e471eb5
GM
2722 size = XFASTINT (length);
2723
2724 val = Qnil;
ce070307
GM
2725 while (size > 0)
2726 {
2727 val = Fcons (init, val);
2728 --size;
2729
2730 if (size > 0)
2731 {
2732 val = Fcons (init, val);
2733 --size;
177c0ea7 2734
ce070307
GM
2735 if (size > 0)
2736 {
2737 val = Fcons (init, val);
2738 --size;
177c0ea7 2739
ce070307
GM
2740 if (size > 0)
2741 {
2742 val = Fcons (init, val);
2743 --size;
177c0ea7 2744
ce070307
GM
2745 if (size > 0)
2746 {
2747 val = Fcons (init, val);
2748 --size;
2749 }
2750 }
2751 }
2752 }
2753
2754 QUIT;
2755 }
177c0ea7 2756
7146af97
JB
2757 return val;
2758}
2e471eb5
GM
2759
2760
7146af97 2761\f
2e471eb5
GM
2762/***********************************************************************
2763 Vector Allocation
2764 ***********************************************************************/
7146af97 2765
34400008
GM
2766/* Singly-linked list of all vectors. */
2767
d3d47262 2768static struct Lisp_Vector *all_vectors;
7146af97 2769
dd0b0efb
PE
2770/* Handy constants for vectorlike objects. */
2771enum
2772 {
2773 header_size = offsetof (struct Lisp_Vector, contents),
2774 word_size = sizeof (Lisp_Object)
2775 };
34400008
GM
2776
2777/* Value is a pointer to a newly allocated Lisp_Vector structure
2778 with room for LEN Lisp_Objects. */
2779
ece93c02 2780static struct Lisp_Vector *
971de7fb 2781allocate_vectorlike (EMACS_INT len)
1825c68d
KH
2782{
2783 struct Lisp_Vector *p;
675d5130 2784 size_t nbytes;
1825c68d 2785
dafc79fa
SM
2786 MALLOC_BLOCK_INPUT;
2787
d1658221 2788#ifdef DOUG_LEA_MALLOC
f8608968
GM
2789 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
2790 because mapped region contents are not preserved in
2791 a dumped Emacs. */
d1658221
RS
2792 mallopt (M_MMAP_MAX, 0);
2793#endif
177c0ea7 2794
cfb2f32e
SM
2795 /* This gets triggered by code which I haven't bothered to fix. --Stef */
2796 /* eassert (!handling_signal); */
2797
0de4bb68 2798 nbytes = header_size + len * word_size;
9c545a55 2799 p = (struct Lisp_Vector *) lisp_malloc (nbytes, MEM_TYPE_VECTORLIKE);
177c0ea7 2800
d1658221 2801#ifdef DOUG_LEA_MALLOC
34400008 2802 /* Back to a reasonable maximum of mmap'ed areas. */
81d492d5 2803 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
d1658221 2804#endif
177c0ea7 2805
34400008 2806 consing_since_gc += nbytes;
310ea200 2807 vector_cells_consed += len;
1825c68d 2808
eab3844f 2809 p->header.next.vector = all_vectors;
1825c68d 2810 all_vectors = p;
e2984df0 2811
dafc79fa 2812 MALLOC_UNBLOCK_INPUT;
e2984df0 2813
1825c68d
KH
2814 return p;
2815}
2816
34400008 2817
dd0b0efb 2818/* Allocate a vector with LEN slots. */
ece93c02
GM
2819
2820struct Lisp_Vector *
dd0b0efb 2821allocate_vector (EMACS_INT len)
ece93c02 2822{
dd0b0efb
PE
2823 struct Lisp_Vector *v;
2824 ptrdiff_t nbytes_max = min (PTRDIFF_MAX, SIZE_MAX);
2825
2826 if (min ((nbytes_max - header_size) / word_size, MOST_POSITIVE_FIXNUM) < len)
2827 memory_full (SIZE_MAX);
2828 v = allocate_vectorlike (len);
2829 v->header.size = len;
ece93c02
GM
2830 return v;
2831}
2832
2833
2834/* Allocate other vector-like structures. */
2835
30f95089 2836struct Lisp_Vector *
971de7fb 2837allocate_pseudovector (int memlen, int lisplen, EMACS_INT tag)
ece93c02 2838{
d2029e5b 2839 struct Lisp_Vector *v = allocate_vectorlike (memlen);
e46bb31a 2840 int i;
177c0ea7 2841
d2029e5b 2842 /* Only the first lisplen slots will be traced normally by the GC. */
d2029e5b 2843 for (i = 0; i < lisplen; ++i)
ece93c02 2844 v->contents[i] = Qnil;
177c0ea7 2845
eab3844f 2846 XSETPVECTYPESIZE (v, tag, lisplen);
d2029e5b
SM
2847 return v;
2848}
d2029e5b 2849
ece93c02 2850struct Lisp_Hash_Table *
878f97ff 2851allocate_hash_table (void)
ece93c02 2852{
878f97ff 2853 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
ece93c02
GM
2854}
2855
2856
2857struct window *
971de7fb 2858allocate_window (void)
ece93c02 2859{
d2029e5b 2860 return ALLOCATE_PSEUDOVECTOR(struct window, current_matrix, PVEC_WINDOW);
ece93c02 2861}
177c0ea7 2862
177c0ea7 2863
4a729fd8 2864struct terminal *
971de7fb 2865allocate_terminal (void)
4a729fd8 2866{
d2029e5b
SM
2867 struct terminal *t = ALLOCATE_PSEUDOVECTOR (struct terminal,
2868 next_terminal, PVEC_TERMINAL);
2869 /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
72af86bd
AS
2870 memset (&t->next_terminal, 0,
2871 (char*) (t + 1) - (char*) &t->next_terminal);
ece93c02 2872
d2029e5b 2873 return t;
4a729fd8 2874}
ece93c02
GM
2875
2876struct frame *
971de7fb 2877allocate_frame (void)
ece93c02 2878{
d2029e5b
SM
2879 struct frame *f = ALLOCATE_PSEUDOVECTOR (struct frame,
2880 face_cache, PVEC_FRAME);
2881 /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
72af86bd
AS
2882 memset (&f->face_cache, 0,
2883 (char *) (f + 1) - (char *) &f->face_cache);
d2029e5b 2884 return f;
ece93c02
GM
2885}
2886
2887
2888struct Lisp_Process *
971de7fb 2889allocate_process (void)
ece93c02 2890{
d2029e5b 2891 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
ece93c02
GM
2892}
2893
2894
a7ca3326 2895DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
a6266d23 2896 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
7ee72033 2897See also the function `vector'. */)
5842a27b 2898 (register Lisp_Object length, Lisp_Object init)
7146af97 2899{
1825c68d
KH
2900 Lisp_Object vector;
2901 register EMACS_INT sizei;
ae35e756 2902 register EMACS_INT i;
7146af97
JB
2903 register struct Lisp_Vector *p;
2904
b7826503 2905 CHECK_NATNUM (length);
c9dad5ed 2906 sizei = XFASTINT (length);
7146af97 2907
ece93c02 2908 p = allocate_vector (sizei);
ae35e756
PE
2909 for (i = 0; i < sizei; i++)
2910 p->contents[i] = init;
7146af97 2911
1825c68d 2912 XSETVECTOR (vector, p);
7146af97
JB
2913 return vector;
2914}
2915
34400008 2916
a7ca3326 2917DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
eae936e2 2918 doc: /* Return a newly created vector with specified arguments as elements.
ae8e8122
MB
2919Any number of arguments, even zero arguments, are allowed.
2920usage: (vector &rest OBJECTS) */)
f66c7cf8 2921 (ptrdiff_t nargs, Lisp_Object *args)
7146af97
JB
2922{
2923 register Lisp_Object len, val;
f66c7cf8 2924 ptrdiff_t i;
7146af97
JB
2925 register struct Lisp_Vector *p;
2926
67ba9986 2927 XSETFASTINT (len, nargs);
7146af97
JB
2928 val = Fmake_vector (len, Qnil);
2929 p = XVECTOR (val);
ae35e756
PE
2930 for (i = 0; i < nargs; i++)
2931 p->contents[i] = args[i];
7146af97
JB
2932 return val;
2933}
2934
34400008 2935
a7ca3326 2936DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
a6266d23 2937 doc: /* Create a byte-code object with specified arguments as elements.
e2abe5a1
SM
2938The arguments should be the ARGLIST, bytecode-string BYTE-CODE, constant
2939vector CONSTANTS, maximum stack size DEPTH, (optional) DOCSTRING,
2940and (optional) INTERACTIVE-SPEC.
228299fa 2941The first four arguments are required; at most six have any
ae8e8122 2942significance.
e2abe5a1
SM
2943The ARGLIST can be either like the one of `lambda', in which case the arguments
2944will be dynamically bound before executing the byte code, or it can be an
2945integer of the form NNNNNNNRMMMMMMM where the 7bit MMMMMMM specifies the
2946minimum number of arguments, the 7-bit NNNNNNN specifies the maximum number
2947of arguments (ignoring &rest) and the R bit specifies whether there is a &rest
2948argument to catch the left-over arguments. If such an integer is used, the
2949arguments will not be dynamically bound but will be instead pushed on the
2950stack before executing the byte-code.
92cc28b2 2951usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
f66c7cf8 2952 (ptrdiff_t nargs, Lisp_Object *args)
7146af97
JB
2953{
2954 register Lisp_Object len, val;
f66c7cf8 2955 ptrdiff_t i;
7146af97
JB
2956 register struct Lisp_Vector *p;
2957
67ba9986 2958 XSETFASTINT (len, nargs);
265a9e55 2959 if (!NILP (Vpurify_flag))
f66c7cf8 2960 val = make_pure_vector (nargs);
7146af97
JB
2961 else
2962 val = Fmake_vector (len, Qnil);
9eac9d59 2963
b1feb9b4 2964 if (nargs > 1 && STRINGP (args[1]) && STRING_MULTIBYTE (args[1]))
9eac9d59
KH
2965 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
2966 earlier because they produced a raw 8-bit string for byte-code
2967 and now such a byte-code string is loaded as multibyte while
2968 raw 8-bit characters converted to multibyte form. Thus, now we
2969 must convert them back to the original unibyte form. */
2970 args[1] = Fstring_as_unibyte (args[1]);
2971
7146af97 2972 p = XVECTOR (val);
ae35e756 2973 for (i = 0; i < nargs; i++)
7146af97 2974 {
265a9e55 2975 if (!NILP (Vpurify_flag))
ae35e756
PE
2976 args[i] = Fpurecopy (args[i]);
2977 p->contents[i] = args[i];
7146af97 2978 }
876c194c
SM
2979 XSETPVECTYPE (p, PVEC_COMPILED);
2980 XSETCOMPILED (val, p);
7146af97
JB
2981 return val;
2982}
2e471eb5 2983
34400008 2984
7146af97 2985\f
2e471eb5
GM
2986/***********************************************************************
2987 Symbol Allocation
2988 ***********************************************************************/
7146af97 2989
2e471eb5
GM
2990/* Each symbol_block is just under 1020 bytes long, since malloc
2991 really allocates in units of powers of two and uses 4 bytes for its
2992 own overhead. */
7146af97
JB
2993
2994#define SYMBOL_BLOCK_SIZE \
2995 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
2996
2997struct symbol_block
2e471eb5 2998{
6b61353c 2999 /* Place `symbols' first, to preserve alignment. */
2e471eb5 3000 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
6b61353c 3001 struct symbol_block *next;
2e471eb5 3002};
7146af97 3003
34400008
GM
3004/* Current symbol block and index of first unused Lisp_Symbol
3005 structure in it. */
3006
d3d47262
JB
3007static struct symbol_block *symbol_block;
3008static int symbol_block_index;
7146af97 3009
34400008
GM
3010/* List of free symbols. */
3011
d3d47262 3012static struct Lisp_Symbol *symbol_free_list;
7146af97 3013
34400008
GM
3014
3015/* Initialize symbol allocation. */
3016
d3d47262 3017static void
971de7fb 3018init_symbol (void)
7146af97 3019{
005ca5c7
DL
3020 symbol_block = NULL;
3021 symbol_block_index = SYMBOL_BLOCK_SIZE;
7146af97
JB
3022 symbol_free_list = 0;
3023}
3024
34400008 3025
a7ca3326 3026DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
a6266d23 3027 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
7ee72033 3028Its value and function definition are void, and its property list is nil. */)
5842a27b 3029 (Lisp_Object name)
7146af97
JB
3030{
3031 register Lisp_Object val;
3032 register struct Lisp_Symbol *p;
3033
b7826503 3034 CHECK_STRING (name);
7146af97 3035
537407f0 3036 /* eassert (!handling_signal); */
cfb2f32e 3037
dafc79fa 3038 MALLOC_BLOCK_INPUT;
e2984df0 3039
7146af97
JB
3040 if (symbol_free_list)
3041 {
45d12a89 3042 XSETSYMBOL (val, symbol_free_list);
28a099a4 3043 symbol_free_list = symbol_free_list->next;
7146af97
JB
3044 }
3045 else
3046 {
3047 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
3048 {
3c06d205 3049 struct symbol_block *new;
34400008
GM
3050 new = (struct symbol_block *) lisp_malloc (sizeof *new,
3051 MEM_TYPE_SYMBOL);
7146af97
JB
3052 new->next = symbol_block;
3053 symbol_block = new;
3054 symbol_block_index = 0;
3055 }
6b61353c
KH
3056 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index]);
3057 symbol_block_index++;
7146af97 3058 }
177c0ea7 3059
dafc79fa 3060 MALLOC_UNBLOCK_INPUT;
e2984df0 3061
7146af97 3062 p = XSYMBOL (val);
8fe5665d 3063 p->xname = name;
7146af97 3064 p->plist = Qnil;
ce5b453a
SM
3065 p->redirect = SYMBOL_PLAINVAL;
3066 SET_SYMBOL_VAL (p, Qunbound);
2e471eb5 3067 p->function = Qunbound;
9e713715 3068 p->next = NULL;
2336fe58 3069 p->gcmarkbit = 0;
9e713715
GM
3070 p->interned = SYMBOL_UNINTERNED;
3071 p->constant = 0;
b9598260 3072 p->declared_special = 0;
2e471eb5
GM
3073 consing_since_gc += sizeof (struct Lisp_Symbol);
3074 symbols_consed++;
7146af97
JB
3075 return val;
3076}
3077
3f25e183 3078
2e471eb5
GM
3079\f
3080/***********************************************************************
34400008 3081 Marker (Misc) Allocation
2e471eb5 3082 ***********************************************************************/
3f25e183 3083
2e471eb5
GM
3084/* Allocation of markers and other objects that share that structure.
3085 Works like allocation of conses. */
c0696668 3086
2e471eb5
GM
3087#define MARKER_BLOCK_SIZE \
3088 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
3089
3090struct marker_block
c0696668 3091{
6b61353c 3092 /* Place `markers' first, to preserve alignment. */
2e471eb5 3093 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
6b61353c 3094 struct marker_block *next;
2e471eb5 3095};
c0696668 3096
d3d47262
JB
3097static struct marker_block *marker_block;
3098static int marker_block_index;
c0696668 3099
d3d47262 3100static union Lisp_Misc *marker_free_list;
c0696668 3101
d3d47262 3102static void
971de7fb 3103init_marker (void)
3f25e183 3104{
005ca5c7
DL
3105 marker_block = NULL;
3106 marker_block_index = MARKER_BLOCK_SIZE;
2e471eb5 3107 marker_free_list = 0;
3f25e183
RS
3108}
3109
2e471eb5
GM
3110/* Return a newly allocated Lisp_Misc object, with no substructure. */
3111
3f25e183 3112Lisp_Object
971de7fb 3113allocate_misc (void)
7146af97 3114{
2e471eb5 3115 Lisp_Object val;
7146af97 3116
e2984df0
CY
3117 /* eassert (!handling_signal); */
3118
dafc79fa 3119 MALLOC_BLOCK_INPUT;
cfb2f32e 3120
2e471eb5 3121 if (marker_free_list)
7146af97 3122 {
2e471eb5
GM
3123 XSETMISC (val, marker_free_list);
3124 marker_free_list = marker_free_list->u_free.chain;
7146af97
JB
3125 }
3126 else
7146af97 3127 {
2e471eb5
GM
3128 if (marker_block_index == MARKER_BLOCK_SIZE)
3129 {
3130 struct marker_block *new;
34400008
GM
3131 new = (struct marker_block *) lisp_malloc (sizeof *new,
3132 MEM_TYPE_MISC);
2e471eb5
GM
3133 new->next = marker_block;
3134 marker_block = new;
3135 marker_block_index = 0;
7b7990cc 3136 total_free_markers += MARKER_BLOCK_SIZE;
2e471eb5 3137 }
6b61353c
KH
3138 XSETMISC (val, &marker_block->markers[marker_block_index]);
3139 marker_block_index++;
7146af97 3140 }
177c0ea7 3141
dafc79fa 3142 MALLOC_UNBLOCK_INPUT;
e2984df0 3143
7b7990cc 3144 --total_free_markers;
2e471eb5
GM
3145 consing_since_gc += sizeof (union Lisp_Misc);
3146 misc_objects_consed++;
67ee9f6e 3147 XMISCANY (val)->gcmarkbit = 0;
2e471eb5
GM
3148 return val;
3149}
3150
7b7990cc
KS
3151/* Free a Lisp_Misc object */
3152
244ed907 3153static void
971de7fb 3154free_misc (Lisp_Object misc)
7b7990cc 3155{
d314756e 3156 XMISCTYPE (misc) = Lisp_Misc_Free;
7b7990cc
KS
3157 XMISC (misc)->u_free.chain = marker_free_list;
3158 marker_free_list = XMISC (misc);
3159
3160 total_free_markers++;
3161}
3162
42172a6b
RS
3163/* Return a Lisp_Misc_Save_Value object containing POINTER and
3164 INTEGER. This is used to package C values to call record_unwind_protect.
3165 The unwind function can get the C values back using XSAVE_VALUE. */
3166
3167Lisp_Object
9c4c5f81 3168make_save_value (void *pointer, ptrdiff_t integer)
42172a6b
RS
3169{
3170 register Lisp_Object val;
3171 register struct Lisp_Save_Value *p;
3172
3173 val = allocate_misc ();
3174 XMISCTYPE (val) = Lisp_Misc_Save_Value;
3175 p = XSAVE_VALUE (val);
3176 p->pointer = pointer;
3177 p->integer = integer;
b766f870 3178 p->dogc = 0;
42172a6b
RS
3179 return val;
3180}
3181
a7ca3326 3182DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
a6266d23 3183 doc: /* Return a newly allocated marker which does not point at any place. */)
5842a27b 3184 (void)
2e471eb5
GM
3185{
3186 register Lisp_Object val;
3187 register struct Lisp_Marker *p;
7146af97 3188
2e471eb5
GM
3189 val = allocate_misc ();
3190 XMISCTYPE (val) = Lisp_Misc_Marker;
3191 p = XMARKER (val);
3192 p->buffer = 0;
3193 p->bytepos = 0;
3194 p->charpos = 0;
ef89c2ce 3195 p->next = NULL;
2e471eb5 3196 p->insertion_type = 0;
7146af97
JB
3197 return val;
3198}
2e471eb5
GM
3199
3200/* Put MARKER back on the free list after using it temporarily. */
3201
3202void
971de7fb 3203free_marker (Lisp_Object marker)
2e471eb5 3204{
ef89c2ce 3205 unchain_marker (XMARKER (marker));
7b7990cc 3206 free_misc (marker);
2e471eb5
GM
3207}
3208
c0696668 3209\f
7146af97 3210/* Return a newly created vector or string with specified arguments as
736471d1
RS
3211 elements. If all the arguments are characters that can fit
3212 in a string of events, make a string; otherwise, make a vector.
3213
3214 Any number of arguments, even zero arguments, are allowed. */
7146af97
JB
3215
3216Lisp_Object
971de7fb 3217make_event_array (register int nargs, Lisp_Object *args)
7146af97
JB
3218{
3219 int i;
3220
3221 for (i = 0; i < nargs; i++)
736471d1 3222 /* The things that fit in a string
c9ca4659
RS
3223 are characters that are in 0...127,
3224 after discarding the meta bit and all the bits above it. */
e687453f 3225 if (!INTEGERP (args[i])
c11285dc 3226 || (XINT (args[i]) & ~(-CHAR_META)) >= 0200)
7146af97
JB
3227 return Fvector (nargs, args);
3228
3229 /* Since the loop exited, we know that all the things in it are
3230 characters, so we can make a string. */
3231 {
c13ccad2 3232 Lisp_Object result;
177c0ea7 3233
50aee051 3234 result = Fmake_string (make_number (nargs), make_number (0));
7146af97 3235 for (i = 0; i < nargs; i++)
736471d1 3236 {
46e7e6b0 3237 SSET (result, i, XINT (args[i]));
736471d1
RS
3238 /* Move the meta bit to the right place for a string char. */
3239 if (XINT (args[i]) & CHAR_META)
46e7e6b0 3240 SSET (result, i, SREF (result, i) | 0x80);
736471d1 3241 }
177c0ea7 3242
7146af97
JB
3243 return result;
3244 }
3245}
2e471eb5
GM
3246
3247
7146af97 3248\f
24d8a105
RS
3249/************************************************************************
3250 Memory Full Handling
3251 ************************************************************************/
3252
3253
531b0165
PE
3254/* Called if malloc (NBYTES) returns zero. If NBYTES == SIZE_MAX,
3255 there may have been size_t overflow so that malloc was never
3256 called, or perhaps malloc was invoked successfully but the
3257 resulting pointer had problems fitting into a tagged EMACS_INT. In
3258 either case this counts as memory being full even though malloc did
3259 not fail. */
24d8a105
RS
3260
3261void
531b0165 3262memory_full (size_t nbytes)
24d8a105 3263{
531b0165
PE
3264 /* Do not go into hysterics merely because a large request failed. */
3265 int enough_free_memory = 0;
2b6148e4 3266 if (SPARE_MEMORY < nbytes)
531b0165 3267 {
2b6148e4 3268 void *p = malloc (SPARE_MEMORY);
531b0165
PE
3269 if (p)
3270 {
4d09bcf6 3271 free (p);
531b0165
PE
3272 enough_free_memory = 1;
3273 }
3274 }
24d8a105 3275
531b0165
PE
3276 if (! enough_free_memory)
3277 {
3278 int i;
24d8a105 3279
531b0165
PE
3280 Vmemory_full = Qt;
3281
3282 memory_full_cons_threshold = sizeof (struct cons_block);
3283
3284 /* The first time we get here, free the spare memory. */
3285 for (i = 0; i < sizeof (spare_memory) / sizeof (char *); i++)
3286 if (spare_memory[i])
3287 {
3288 if (i == 0)
3289 free (spare_memory[i]);
3290 else if (i >= 1 && i <= 4)
3291 lisp_align_free (spare_memory[i]);
3292 else
3293 lisp_free (spare_memory[i]);
3294 spare_memory[i] = 0;
3295 }
3296
3297 /* Record the space now used. When it decreases substantially,
3298 we can refill the memory reserve. */
4e75f29d 3299#if !defined SYSTEM_MALLOC && !defined SYNC_INPUT
531b0165 3300 bytes_used_when_full = BYTES_USED;
24d8a105 3301#endif
531b0165 3302 }
24d8a105
RS
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
55d4c1b2 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
55d4c1b2 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
55d4c1b2 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
55d4c1b2 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
55d4c1b2 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
55d4c1b2 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
55d4c1b2 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
55d4c1b2 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
211a0b2a 3913static EMACS_INT nzombies;
34400008
GM
3914
3915/* Number of garbage collections. */
3916
211a0b2a 3917static EMACS_INT ngcs;
34400008
GM
3918
3919/* Average percentage of zombies per collection. */
3920
3921static double avg_zombies;
3922
3923/* Max. number of live and zombie objects. */
3924
211a0b2a 3925static EMACS_INT max_live, max_zombies;
34400008
GM
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 3935 Lisp_Object args[8], zombie_list = Qnil;
211a0b2a 3936 EMACS_INT i;
83fc9c63
DL
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
55d4c1b2 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
55d4c1b2 4024static inline void
971de7fb 4025mark_maybe_pointer (void *p)
ece93c02
GM
4026{
4027 struct mem_node *m;
4028
5045e68e 4029 /* Quickly rule out some values which can't point to Lisp data. */
d01a7826 4030 if ((intptr_t) p %
5045e68e
SM
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;
f66c7cf8 4246 ptrdiff_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
211a0b2a 4263 fprintf (stderr, "\nZombies kept alive = %"pI":\n", nzombies);
34400008
GM
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)
c2982e87
PE
4577 message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d"
4578 " bytes needed)"),
4579 pure_bytes_used + pure_bytes_used_before_overflow);
9e713715
GM
4580}
4581
4582
79fd0489
YM
4583/* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
4584 the non-Lisp data pool of the pure storage, and return its start
4585 address. Return NULL if not found. */
4586
4587static char *
14162469 4588find_string_data_in_pure (const char *data, EMACS_INT nbytes)
79fd0489 4589{
14162469
EZ
4590 int i;
4591 EMACS_INT skip, bm_skip[256], last_char_skip, infinity, start, start_max;
2aff7c53 4592 const unsigned char *p;
79fd0489
YM
4593 char *non_lisp_beg;
4594
4595 if (pure_bytes_used_non_lisp < nbytes + 1)
4596 return NULL;
4597
4598 /* Set up the Boyer-Moore table. */
4599 skip = nbytes + 1;
4600 for (i = 0; i < 256; i++)
4601 bm_skip[i] = skip;
4602
2aff7c53 4603 p = (const unsigned char *) data;
79fd0489
YM
4604 while (--skip > 0)
4605 bm_skip[*p++] = skip;
4606
4607 last_char_skip = bm_skip['\0'];
4608
4609 non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
4610 start_max = pure_bytes_used_non_lisp - (nbytes + 1);
4611
4612 /* See the comments in the function `boyer_moore' (search.c) for the
4613 use of `infinity'. */
4614 infinity = pure_bytes_used_non_lisp + 1;
4615 bm_skip['\0'] = infinity;
4616
2aff7c53 4617 p = (const unsigned char *) non_lisp_beg + nbytes;
79fd0489
YM
4618 start = 0;
4619 do
4620 {
4621 /* Check the last character (== '\0'). */
4622 do
4623 {
4624 start += bm_skip[*(p + start)];
4625 }
4626 while (start <= start_max);
4627
4628 if (start < infinity)
4629 /* Couldn't find the last character. */
4630 return NULL;
4631
4632 /* No less than `infinity' means we could find the last
4633 character at `p[start - infinity]'. */
4634 start -= infinity;
4635
4636 /* Check the remaining characters. */
4637 if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
4638 /* Found. */
4639 return non_lisp_beg + start;
4640
4641 start += last_char_skip;
4642 }
4643 while (start <= start_max);
4644
4645 return NULL;
4646}
4647
4648
2e471eb5
GM
4649/* Return a string allocated in pure space. DATA is a buffer holding
4650 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
4651 non-zero means make the result string multibyte.
1a4f1e2c 4652
2e471eb5
GM
4653 Must get an error if pure storage is full, since if it cannot hold
4654 a large string it may be able to hold conses that point to that
4655 string; then the string is not protected from gc. */
7146af97
JB
4656
4657Lisp_Object
14162469
EZ
4658make_pure_string (const char *data,
4659 EMACS_INT nchars, EMACS_INT nbytes, int multibyte)
7146af97 4660{
2e471eb5
GM
4661 Lisp_Object string;
4662 struct Lisp_String *s;
c0696668 4663
1f0b3fd2 4664 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
90256841 4665 s->data = (unsigned char *) find_string_data_in_pure (data, nbytes);
79fd0489
YM
4666 if (s->data == NULL)
4667 {
4668 s->data = (unsigned char *) pure_alloc (nbytes + 1, -1);
72af86bd 4669 memcpy (s->data, data, nbytes);
79fd0489
YM
4670 s->data[nbytes] = '\0';
4671 }
2e471eb5
GM
4672 s->size = nchars;
4673 s->size_byte = multibyte ? nbytes : -1;
2e471eb5 4674 s->intervals = NULL_INTERVAL;
2e471eb5
GM
4675 XSETSTRING (string, s);
4676 return string;
7146af97
JB
4677}
4678
a56eaaef
DN
4679/* Return a string a string allocated in pure space. Do not allocate
4680 the string data, just point to DATA. */
4681
4682Lisp_Object
4683make_pure_c_string (const char *data)
4684{
4685 Lisp_Object string;
4686 struct Lisp_String *s;
14162469 4687 EMACS_INT nchars = strlen (data);
a56eaaef
DN
4688
4689 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
4690 s->size = nchars;
4691 s->size_byte = -1;
323637a2 4692 s->data = (unsigned char *) data;
a56eaaef
DN
4693 s->intervals = NULL_INTERVAL;
4694 XSETSTRING (string, s);
4695 return string;
4696}
2e471eb5 4697
34400008
GM
4698/* Return a cons allocated from pure space. Give it pure copies
4699 of CAR as car and CDR as cdr. */
4700
7146af97 4701Lisp_Object
971de7fb 4702pure_cons (Lisp_Object car, Lisp_Object cdr)
7146af97
JB
4703{
4704 register Lisp_Object new;
1f0b3fd2 4705 struct Lisp_Cons *p;
7146af97 4706
1f0b3fd2
GM
4707 p = (struct Lisp_Cons *) pure_alloc (sizeof *p, Lisp_Cons);
4708 XSETCONS (new, p);
f3fbd155
KR
4709 XSETCAR (new, Fpurecopy (car));
4710 XSETCDR (new, Fpurecopy (cdr));
7146af97
JB
4711 return new;
4712}
4713
7146af97 4714
34400008
GM
4715/* Value is a float object with value NUM allocated from pure space. */
4716
d3d47262 4717static Lisp_Object
971de7fb 4718make_pure_float (double num)
7146af97
JB
4719{
4720 register Lisp_Object new;
1f0b3fd2 4721 struct Lisp_Float *p;
7146af97 4722
1f0b3fd2
GM
4723 p = (struct Lisp_Float *) pure_alloc (sizeof *p, Lisp_Float);
4724 XSETFLOAT (new, p);
f601cdf3 4725 XFLOAT_INIT (new, num);
7146af97
JB
4726 return new;
4727}
4728
34400008
GM
4729
4730/* Return a vector with room for LEN Lisp_Objects allocated from
4731 pure space. */
4732
7146af97 4733Lisp_Object
971de7fb 4734make_pure_vector (EMACS_INT len)
7146af97 4735{
1f0b3fd2
GM
4736 Lisp_Object new;
4737 struct Lisp_Vector *p;
36372bf9
PE
4738 size_t size = (offsetof (struct Lisp_Vector, contents)
4739 + len * sizeof (Lisp_Object));
7146af97 4740
1f0b3fd2
GM
4741 p = (struct Lisp_Vector *) pure_alloc (size, Lisp_Vectorlike);
4742 XSETVECTOR (new, p);
eab3844f 4743 XVECTOR (new)->header.size = len;
7146af97
JB
4744 return new;
4745}
4746
34400008 4747
a7ca3326 4748DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
909e3b33 4749 doc: /* Make a copy of object OBJ in pure storage.
228299fa 4750Recursively copies contents of vectors and cons cells.
7ee72033 4751Does not copy symbols. Copies strings without text properties. */)
5842a27b 4752 (register Lisp_Object obj)
7146af97 4753{
265a9e55 4754 if (NILP (Vpurify_flag))
7146af97
JB
4755 return obj;
4756
1f0b3fd2 4757 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
4758 return obj;
4759
e9515805
SM
4760 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
4761 {
4762 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
4763 if (!NILP (tmp))
4764 return tmp;
4765 }
4766
d6dd74bb 4767 if (CONSP (obj))
e9515805 4768 obj = pure_cons (XCAR (obj), XCDR (obj));
d6dd74bb 4769 else if (FLOATP (obj))
e9515805 4770 obj = make_pure_float (XFLOAT_DATA (obj));
d6dd74bb 4771 else if (STRINGP (obj))
42a5b22f 4772 obj = make_pure_string (SSDATA (obj), SCHARS (obj),
e9515805
SM
4773 SBYTES (obj),
4774 STRING_MULTIBYTE (obj));
876c194c 4775 else if (COMPILEDP (obj) || VECTORP (obj))
d6dd74bb
KH
4776 {
4777 register struct Lisp_Vector *vec;
14162469 4778 register EMACS_INT i;
6b61353c 4779 EMACS_INT size;
d6dd74bb 4780
77b37c05 4781 size = ASIZE (obj);
7d535c68
KH
4782 if (size & PSEUDOVECTOR_FLAG)
4783 size &= PSEUDOVECTOR_SIZE_MASK;
6b61353c 4784 vec = XVECTOR (make_pure_vector (size));
d6dd74bb
KH
4785 for (i = 0; i < size; i++)
4786 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]);
876c194c 4787 if (COMPILEDP (obj))
985773c9 4788 {
876c194c
SM
4789 XSETPVECTYPE (vec, PVEC_COMPILED);
4790 XSETCOMPILED (obj, vec);
985773c9 4791 }
d6dd74bb
KH
4792 else
4793 XSETVECTOR (obj, vec);
7146af97 4794 }
d6dd74bb
KH
4795 else if (MARKERP (obj))
4796 error ("Attempt to copy a marker to pure storage");
e9515805
SM
4797 else
4798 /* Not purified, don't hash-cons. */
4799 return obj;
4800
4801 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
4802 Fputhash (obj, obj, Vpurify_flag);
6bbd7a29
GM
4803
4804 return obj;
7146af97 4805}
2e471eb5 4806
34400008 4807
7146af97 4808\f
34400008
GM
4809/***********************************************************************
4810 Protection from GC
4811 ***********************************************************************/
4812
2e471eb5
GM
4813/* Put an entry in staticvec, pointing at the variable with address
4814 VARADDRESS. */
7146af97
JB
4815
4816void
971de7fb 4817staticpro (Lisp_Object *varaddress)
7146af97
JB
4818{
4819 staticvec[staticidx++] = varaddress;
4820 if (staticidx >= NSTATICS)
4821 abort ();
4822}
4823
7146af97 4824\f
34400008
GM
4825/***********************************************************************
4826 Protection from GC
4827 ***********************************************************************/
1a4f1e2c 4828
e8197642
RS
4829/* Temporarily prevent garbage collection. */
4830
4831int
971de7fb 4832inhibit_garbage_collection (void)
e8197642 4833{
aed13378 4834 int count = SPECPDL_INDEX ();
54defd0d 4835
6349ae4d 4836 specbind (Qgc_cons_threshold, make_number (MOST_POSITIVE_FIXNUM));
e8197642
RS
4837 return count;
4838}
4839
34400008 4840
a7ca3326 4841DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
7ee72033 4842 doc: /* Reclaim storage for Lisp objects no longer needed.
e1e37596
RS
4843Garbage collection happens automatically if you cons more than
4844`gc-cons-threshold' bytes of Lisp data since previous garbage collection.
4845`garbage-collect' normally returns a list with info on amount of space in use:
228299fa
GM
4846 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)
4847 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS
4848 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS)
4849 (USED-STRINGS . FREE-STRINGS))
e1e37596
RS
4850However, if there was overflow in pure space, `garbage-collect'
4851returns nil, because real GC can't be done. */)
5842a27b 4852 (void)
7146af97 4853{
7146af97 4854 register struct specbinding *bind;
7146af97 4855 char stack_top_variable;
f66c7cf8 4856 ptrdiff_t i;
6efc7df7 4857 int message_p;
96117bc7 4858 Lisp_Object total[8];
331379bf 4859 int count = SPECPDL_INDEX ();
2c5bd608
DL
4860 EMACS_TIME t1, t2, t3;
4861
3de0effb
RS
4862 if (abort_on_gc)
4863 abort ();
4864
9e713715
GM
4865 /* Can't GC if pure storage overflowed because we can't determine
4866 if something is a pure object or not. */
4867 if (pure_bytes_used_before_overflow)
4868 return Qnil;
4869
bbc012e0
KS
4870 CHECK_CONS_LIST ();
4871
3c7e66a8
RS
4872 /* Don't keep undo information around forever.
4873 Do this early on, so it is no problem if the user quits. */
4874 {
4875 register struct buffer *nextb = all_buffers;
4876
4877 while (nextb)
4878 {
4879 /* If a buffer's undo list is Qt, that means that undo is
4880 turned off in that buffer. Calling truncate_undo_list on
4881 Qt tends to return NULL, which effectively turns undo back on.
4882 So don't call truncate_undo_list if undo_list is Qt. */
5d8ea120 4883 if (! NILP (nextb->BUFFER_INTERNAL_FIELD (name)) && ! EQ (nextb->BUFFER_INTERNAL_FIELD (undo_list), Qt))
3c7e66a8
RS
4884 truncate_undo_list (nextb);
4885
4886 /* Shrink buffer gaps, but skip indirect and dead buffers. */
5d8ea120 4887 if (nextb->base_buffer == 0 && !NILP (nextb->BUFFER_INTERNAL_FIELD (name))
dc7b4525 4888 && ! nextb->text->inhibit_shrinking)
3c7e66a8
RS
4889 {
4890 /* If a buffer's gap size is more than 10% of the buffer
4891 size, or larger than 2000 bytes, then shrink it
4892 accordingly. Keep a minimum size of 20 bytes. */
4893 int size = min (2000, max (20, (nextb->text->z_byte / 10)));
4894
4895 if (nextb->text->gap_size > size)
4896 {
4897 struct buffer *save_current = current_buffer;
4898 current_buffer = nextb;
4899 make_gap (-(nextb->text->gap_size - size));
4900 current_buffer = save_current;
4901 }
4902 }
4903
eab3844f 4904 nextb = nextb->header.next.buffer;
3c7e66a8
RS
4905 }
4906 }
4907
4908 EMACS_GET_TIME (t1);
4909
58595309
KH
4910 /* In case user calls debug_print during GC,
4911 don't let that cause a recursive GC. */
4912 consing_since_gc = 0;
4913
6efc7df7
GM
4914 /* Save what's currently displayed in the echo area. */
4915 message_p = push_message ();
c55b0da6 4916 record_unwind_protect (pop_message_unwind, Qnil);
41c28a37 4917
7146af97
JB
4918 /* Save a copy of the contents of the stack, for debugging. */
4919#if MAX_SAVE_STACK > 0
265a9e55 4920 if (NILP (Vpurify_flag))
7146af97 4921 {
dd3f25f7
PE
4922 char *stack;
4923 size_t stack_size;
4924 if (&stack_top_variable < stack_bottom)
7146af97 4925 {
dd3f25f7
PE
4926 stack = &stack_top_variable;
4927 stack_size = stack_bottom - &stack_top_variable;
4928 }
4929 else
4930 {
4931 stack = stack_bottom;
4932 stack_size = &stack_top_variable - stack_bottom;
4933 }
4934 if (stack_size <= MAX_SAVE_STACK)
7146af97 4935 {
dd3f25f7 4936 if (stack_copy_size < stack_size)
7146af97 4937 {
dd3f25f7
PE
4938 stack_copy = (char *) xrealloc (stack_copy, stack_size);
4939 stack_copy_size = stack_size;
7146af97 4940 }
dd3f25f7 4941 memcpy (stack_copy, stack, stack_size);
7146af97
JB
4942 }
4943 }
4944#endif /* MAX_SAVE_STACK > 0 */
4945
299585ee 4946 if (garbage_collection_messages)
691c4285 4947 message1_nolog ("Garbage collecting...");
7146af97 4948
6e0fca1d
RS
4949 BLOCK_INPUT;
4950
eec7b73d
RS
4951 shrink_regexp_cache ();
4952
7146af97
JB
4953 gc_in_progress = 1;
4954
c23baf9f 4955 /* clear_marks (); */
7146af97 4956
005ca5c7 4957 /* Mark all the special slots that serve as the roots of accessibility. */
7146af97
JB
4958
4959 for (i = 0; i < staticidx; i++)
49723c04 4960 mark_object (*staticvec[i]);
34400008 4961
126f9c02
SM
4962 for (bind = specpdl; bind != specpdl_ptr; bind++)
4963 {
4964 mark_object (bind->symbol);
4965 mark_object (bind->old_value);
4966 }
6ed8eeff 4967 mark_terminals ();
126f9c02 4968 mark_kboards ();
98a92e2d 4969 mark_ttys ();
126f9c02
SM
4970
4971#ifdef USE_GTK
4972 {
dd4c5104 4973 extern void xg_mark_data (void);
126f9c02
SM
4974 xg_mark_data ();
4975 }
4976#endif
4977
34400008
GM
4978#if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
4979 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
4980 mark_stack ();
4981#else
acf5f7d3
SM
4982 {
4983 register struct gcpro *tail;
4984 for (tail = gcprolist; tail; tail = tail->next)
4985 for (i = 0; i < tail->nvars; i++)
005ca5c7 4986 mark_object (tail->var[i]);
acf5f7d3 4987 }
3e21b6a7 4988 mark_byte_stack ();
b286858c
SM
4989 {
4990 struct catchtag *catch;
4991 struct handler *handler;
177c0ea7 4992
7146af97
JB
4993 for (catch = catchlist; catch; catch = catch->next)
4994 {
49723c04
SM
4995 mark_object (catch->tag);
4996 mark_object (catch->val);
177c0ea7 4997 }
7146af97
JB
4998 for (handler = handlerlist; handler; handler = handler->next)
4999 {
49723c04
SM
5000 mark_object (handler->handler);
5001 mark_object (handler->var);
177c0ea7 5002 }
b286858c 5003 }
b40ea20a 5004 mark_backtrace ();
b286858c 5005#endif
7146af97 5006
454d7973
KS
5007#ifdef HAVE_WINDOW_SYSTEM
5008 mark_fringe_data ();
5009#endif
5010
74c35a48
SM
5011#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5012 mark_stack ();
5013#endif
5014
c37adf23
SM
5015 /* Everything is now marked, except for the things that require special
5016 finalization, i.e. the undo_list.
5017 Look thru every buffer's undo list
4c315bda
RS
5018 for elements that update markers that were not marked,
5019 and delete them. */
5020 {
5021 register struct buffer *nextb = all_buffers;
5022
5023 while (nextb)
5024 {
5025 /* If a buffer's undo list is Qt, that means that undo is
5026 turned off in that buffer. Calling truncate_undo_list on
5027 Qt tends to return NULL, which effectively turns undo back on.
5028 So don't call truncate_undo_list if undo_list is Qt. */
5d8ea120 5029 if (! EQ (nextb->BUFFER_INTERNAL_FIELD (undo_list), Qt))
4c315bda
RS
5030 {
5031 Lisp_Object tail, prev;
5d8ea120 5032 tail = nextb->BUFFER_INTERNAL_FIELD (undo_list);
4c315bda
RS
5033 prev = Qnil;
5034 while (CONSP (tail))
5035 {
8e50cc2d
SM
5036 if (CONSP (XCAR (tail))
5037 && MARKERP (XCAR (XCAR (tail)))
2336fe58 5038 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
4c315bda
RS
5039 {
5040 if (NILP (prev))
5d8ea120 5041 nextb->BUFFER_INTERNAL_FIELD (undo_list) = tail = XCDR (tail);
4c315bda 5042 else
f3fbd155
KR
5043 {
5044 tail = XCDR (tail);
5045 XSETCDR (prev, tail);
5046 }
4c315bda
RS
5047 }
5048 else
5049 {
5050 prev = tail;
70949dac 5051 tail = XCDR (tail);
4c315bda
RS
5052 }
5053 }
5054 }
c37adf23
SM
5055 /* Now that we have stripped the elements that need not be in the
5056 undo_list any more, we can finally mark the list. */
5d8ea120 5057 mark_object (nextb->BUFFER_INTERNAL_FIELD (undo_list));
4c315bda 5058
eab3844f 5059 nextb = nextb->header.next.buffer;
4c315bda
RS
5060 }
5061 }
5062
7146af97
JB
5063 gc_sweep ();
5064
5065 /* Clear the mark bits that we set in certain root slots. */
5066
033a5fa3 5067 unmark_byte_stack ();
3ef06d12
SM
5068 VECTOR_UNMARK (&buffer_defaults);
5069 VECTOR_UNMARK (&buffer_local_symbols);
7146af97 5070
34400008
GM
5071#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
5072 dump_zombies ();
5073#endif
5074
6e0fca1d
RS
5075 UNBLOCK_INPUT;
5076
bbc012e0
KS
5077 CHECK_CONS_LIST ();
5078
c23baf9f 5079 /* clear_marks (); */
7146af97
JB
5080 gc_in_progress = 0;
5081
5082 consing_since_gc = 0;
5083 if (gc_cons_threshold < 10000)
5084 gc_cons_threshold = 10000;
5085
c0c5c8ae 5086 gc_relative_threshold = 0;
96f077ad
SM
5087 if (FLOATP (Vgc_cons_percentage))
5088 { /* Set gc_cons_combined_threshold. */
c0c5c8ae 5089 double tot = 0;
ae35e756
PE
5090
5091 tot += total_conses * sizeof (struct Lisp_Cons);
5092 tot += total_symbols * sizeof (struct Lisp_Symbol);
5093 tot += total_markers * sizeof (union Lisp_Misc);
5094 tot += total_string_size;
5095 tot += total_vector_size * sizeof (Lisp_Object);
5096 tot += total_floats * sizeof (struct Lisp_Float);
5097 tot += total_intervals * sizeof (struct interval);
5098 tot += total_strings * sizeof (struct Lisp_String);
5099
c0c5c8ae
PE
5100 tot *= XFLOAT_DATA (Vgc_cons_percentage);
5101 if (0 < tot)
5102 {
5103 if (tot < TYPE_MAXIMUM (EMACS_INT))
5104 gc_relative_threshold = tot;
5105 else
5106 gc_relative_threshold = TYPE_MAXIMUM (EMACS_INT);
5107 }
96f077ad
SM
5108 }
5109
299585ee
RS
5110 if (garbage_collection_messages)
5111 {
6efc7df7
GM
5112 if (message_p || minibuf_level > 0)
5113 restore_message ();
299585ee
RS
5114 else
5115 message1_nolog ("Garbage collecting...done");
5116 }
7146af97 5117
98edb5ff 5118 unbind_to (count, Qnil);
2e471eb5
GM
5119
5120 total[0] = Fcons (make_number (total_conses),
5121 make_number (total_free_conses));
5122 total[1] = Fcons (make_number (total_symbols),
5123 make_number (total_free_symbols));
5124 total[2] = Fcons (make_number (total_markers),
5125 make_number (total_free_markers));
96117bc7
GM
5126 total[3] = make_number (total_string_size);
5127 total[4] = make_number (total_vector_size);
5128 total[5] = Fcons (make_number (total_floats),
2e471eb5 5129 make_number (total_free_floats));
96117bc7 5130 total[6] = Fcons (make_number (total_intervals),
2e471eb5 5131 make_number (total_free_intervals));
96117bc7 5132 total[7] = Fcons (make_number (total_strings),
2e471eb5
GM
5133 make_number (total_free_strings));
5134
34400008 5135#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
7146af97 5136 {
34400008
GM
5137 /* Compute average percentage of zombies. */
5138 double nlive = 0;
177c0ea7 5139
34400008 5140 for (i = 0; i < 7; ++i)
83fc9c63
DL
5141 if (CONSP (total[i]))
5142 nlive += XFASTINT (XCAR (total[i]));
34400008
GM
5143
5144 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
5145 max_live = max (nlive, max_live);
5146 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
5147 max_zombies = max (nzombies, max_zombies);
5148 ++ngcs;
5149 }
5150#endif
7146af97 5151
9e713715
GM
5152 if (!NILP (Vpost_gc_hook))
5153 {
ae35e756 5154 int gc_count = inhibit_garbage_collection ();
9e713715 5155 safe_run_hooks (Qpost_gc_hook);
ae35e756 5156 unbind_to (gc_count, Qnil);
9e713715 5157 }
2c5bd608
DL
5158
5159 /* Accumulate statistics. */
5160 EMACS_GET_TIME (t2);
5161 EMACS_SUB_TIME (t3, t2, t1);
5162 if (FLOATP (Vgc_elapsed))
69ab9f85
SM
5163 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed) +
5164 EMACS_SECS (t3) +
5165 EMACS_USECS (t3) * 1.0e-6);
2c5bd608
DL
5166 gcs_done++;
5167
96117bc7 5168 return Flist (sizeof total / sizeof *total, total);
7146af97 5169}
34400008 5170
41c28a37 5171
3770920e
GM
5172/* Mark Lisp objects in glyph matrix MATRIX. Currently the
5173 only interesting objects referenced from glyphs are strings. */
41c28a37
GM
5174
5175static void
971de7fb 5176mark_glyph_matrix (struct glyph_matrix *matrix)
41c28a37
GM
5177{
5178 struct glyph_row *row = matrix->rows;
5179 struct glyph_row *end = row + matrix->nrows;
5180
2e471eb5
GM
5181 for (; row < end; ++row)
5182 if (row->enabled_p)
5183 {
5184 int area;
5185 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
5186 {
5187 struct glyph *glyph = row->glyphs[area];
5188 struct glyph *end_glyph = glyph + row->used[area];
177c0ea7 5189
2e471eb5 5190 for (; glyph < end_glyph; ++glyph)
8e50cc2d 5191 if (STRINGP (glyph->object)
2e471eb5 5192 && !STRING_MARKED_P (XSTRING (glyph->object)))
49723c04 5193 mark_object (glyph->object);
2e471eb5
GM
5194 }
5195 }
41c28a37
GM
5196}
5197
34400008 5198
41c28a37
GM
5199/* Mark Lisp faces in the face cache C. */
5200
5201static void
971de7fb 5202mark_face_cache (struct face_cache *c)
41c28a37
GM
5203{
5204 if (c)
5205 {
5206 int i, j;
5207 for (i = 0; i < c->used; ++i)
5208 {
5209 struct face *face = FACE_FROM_ID (c->f, i);
5210
5211 if (face)
5212 {
5213 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
49723c04 5214 mark_object (face->lface[j]);
41c28a37
GM
5215 }
5216 }
5217 }
5218}
5219
5220
7146af97 5221\f
1a4f1e2c 5222/* Mark reference to a Lisp_Object.
2e471eb5
GM
5223 If the object referred to has not been seen yet, recursively mark
5224 all the references contained in it. */
7146af97 5225
785cd37f 5226#define LAST_MARKED_SIZE 500
d3d47262 5227static Lisp_Object last_marked[LAST_MARKED_SIZE];
244ed907 5228static int last_marked_index;
785cd37f 5229
1342fc6f
RS
5230/* For debugging--call abort when we cdr down this many
5231 links of a list, in mark_object. In debugging,
5232 the call to abort will hit a breakpoint.
5233 Normally this is zero and the check never goes off. */
b895abce 5234static size_t mark_object_loop_halt;
1342fc6f 5235
8f11f7ec 5236static void
971de7fb 5237mark_vectorlike (struct Lisp_Vector *ptr)
d2029e5b 5238{
b6439961
PE
5239 EMACS_INT size = ptr->header.size;
5240 EMACS_INT i;
d2029e5b 5241
8f11f7ec 5242 eassert (!VECTOR_MARKED_P (ptr));
d2029e5b
SM
5243 VECTOR_MARK (ptr); /* Else mark it */
5244 if (size & PSEUDOVECTOR_FLAG)
5245 size &= PSEUDOVECTOR_SIZE_MASK;
d3d47262 5246
d2029e5b
SM
5247 /* Note that this size is not the memory-footprint size, but only
5248 the number of Lisp_Object fields that we should trace.
5249 The distinction is used e.g. by Lisp_Process which places extra
5250 non-Lisp_Object fields at the end of the structure. */
5251 for (i = 0; i < size; i++) /* and then mark its elements */
5252 mark_object (ptr->contents[i]);
d2029e5b
SM
5253}
5254
58026347
KH
5255/* Like mark_vectorlike but optimized for char-tables (and
5256 sub-char-tables) assuming that the contents are mostly integers or
5257 symbols. */
5258
5259static void
971de7fb 5260mark_char_table (struct Lisp_Vector *ptr)
58026347 5261{
b6439961
PE
5262 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5263 int i;
58026347 5264
8f11f7ec 5265 eassert (!VECTOR_MARKED_P (ptr));
58026347
KH
5266 VECTOR_MARK (ptr);
5267 for (i = 0; i < size; i++)
5268 {
5269 Lisp_Object val = ptr->contents[i];
5270
ef1b0ba7 5271 if (INTEGERP (val) || (SYMBOLP (val) && XSYMBOL (val)->gcmarkbit))
58026347
KH
5272 continue;
5273 if (SUB_CHAR_TABLE_P (val))
5274 {
5275 if (! VECTOR_MARKED_P (XVECTOR (val)))
5276 mark_char_table (XVECTOR (val));
5277 }
5278 else
5279 mark_object (val);
5280 }
5281}
5282
41c28a37 5283void
971de7fb 5284mark_object (Lisp_Object arg)
7146af97 5285{
49723c04 5286 register Lisp_Object obj = arg;
4f5c1376
GM
5287#ifdef GC_CHECK_MARKED_OBJECTS
5288 void *po;
5289 struct mem_node *m;
5290#endif
b895abce 5291 size_t cdr_count = 0;
7146af97 5292
9149e743 5293 loop:
7146af97 5294
1f0b3fd2 5295 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5296 return;
5297
49723c04 5298 last_marked[last_marked_index++] = obj;
785cd37f
RS
5299 if (last_marked_index == LAST_MARKED_SIZE)
5300 last_marked_index = 0;
5301
4f5c1376
GM
5302 /* Perform some sanity checks on the objects marked here. Abort if
5303 we encounter an object we know is bogus. This increases GC time
5304 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
5305#ifdef GC_CHECK_MARKED_OBJECTS
5306
5307 po = (void *) XPNTR (obj);
5308
5309 /* Check that the object pointed to by PO is known to be a Lisp
5310 structure allocated from the heap. */
5311#define CHECK_ALLOCATED() \
5312 do { \
5313 m = mem_find (po); \
5314 if (m == MEM_NIL) \
5315 abort (); \
5316 } while (0)
5317
5318 /* Check that the object pointed to by PO is live, using predicate
5319 function LIVEP. */
5320#define CHECK_LIVE(LIVEP) \
5321 do { \
5322 if (!LIVEP (m, po)) \
5323 abort (); \
5324 } while (0)
5325
5326 /* Check both of the above conditions. */
5327#define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
5328 do { \
5329 CHECK_ALLOCATED (); \
5330 CHECK_LIVE (LIVEP); \
5331 } while (0) \
177c0ea7 5332
4f5c1376 5333#else /* not GC_CHECK_MARKED_OBJECTS */
177c0ea7 5334
4f5c1376
GM
5335#define CHECK_LIVE(LIVEP) (void) 0
5336#define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
177c0ea7 5337
4f5c1376
GM
5338#endif /* not GC_CHECK_MARKED_OBJECTS */
5339
8e50cc2d 5340 switch (SWITCH_ENUM_CAST (XTYPE (obj)))
7146af97
JB
5341 {
5342 case Lisp_String:
5343 {
5344 register struct Lisp_String *ptr = XSTRING (obj);
8f11f7ec
SM
5345 if (STRING_MARKED_P (ptr))
5346 break;
4f5c1376 5347 CHECK_ALLOCATED_AND_LIVE (live_string_p);
d5e35230 5348 MARK_INTERVAL_TREE (ptr->intervals);
2e471eb5 5349 MARK_STRING (ptr);
361b097f 5350#ifdef GC_CHECK_STRING_BYTES
676a7251
GM
5351 /* Check that the string size recorded in the string is the
5352 same as the one recorded in the sdata structure. */
5353 CHECK_STRING_BYTES (ptr);
361b097f 5354#endif /* GC_CHECK_STRING_BYTES */
7146af97
JB
5355 }
5356 break;
5357
76437631 5358 case Lisp_Vectorlike:
8f11f7ec
SM
5359 if (VECTOR_MARKED_P (XVECTOR (obj)))
5360 break;
4f5c1376
GM
5361#ifdef GC_CHECK_MARKED_OBJECTS
5362 m = mem_find (po);
8e50cc2d 5363 if (m == MEM_NIL && !SUBRP (obj)
4f5c1376
GM
5364 && po != &buffer_defaults
5365 && po != &buffer_local_symbols)
5366 abort ();
5367#endif /* GC_CHECK_MARKED_OBJECTS */
177c0ea7 5368
8e50cc2d 5369 if (BUFFERP (obj))
6b552283 5370 {
4f5c1376 5371#ifdef GC_CHECK_MARKED_OBJECTS
8f11f7ec
SM
5372 if (po != &buffer_defaults && po != &buffer_local_symbols)
5373 {
5374 struct buffer *b;
179dade4 5375 for (b = all_buffers; b && b != po; b = b->header.next.buffer)
8f11f7ec
SM
5376 ;
5377 if (b == NULL)
5378 abort ();
4f5c1376 5379 }
8f11f7ec
SM
5380#endif /* GC_CHECK_MARKED_OBJECTS */
5381 mark_buffer (obj);
6b552283 5382 }
8e50cc2d 5383 else if (SUBRP (obj))
169ee243 5384 break;
876c194c 5385 else if (COMPILEDP (obj))
2e471eb5
GM
5386 /* We could treat this just like a vector, but it is better to
5387 save the COMPILED_CONSTANTS element for last and avoid
5388 recursion there. */
169ee243
RS
5389 {
5390 register struct Lisp_Vector *ptr = XVECTOR (obj);
b6439961
PE
5391 int size = ptr->header.size & PSEUDOVECTOR_SIZE_MASK;
5392 int i;
169ee243 5393
4f5c1376 5394 CHECK_LIVE (live_vector_p);
3ef06d12 5395 VECTOR_MARK (ptr); /* Else mark it */
169ee243
RS
5396 for (i = 0; i < size; i++) /* and then mark its elements */
5397 {
5398 if (i != COMPILED_CONSTANTS)
49723c04 5399 mark_object (ptr->contents[i]);
169ee243 5400 }
49723c04 5401 obj = ptr->contents[COMPILED_CONSTANTS];
169ee243
RS
5402 goto loop;
5403 }
8e50cc2d 5404 else if (FRAMEP (obj))
169ee243 5405 {
c70bbf06 5406 register struct frame *ptr = XFRAME (obj);
8f11f7ec
SM
5407 mark_vectorlike (XVECTOR (obj));
5408 mark_face_cache (ptr->face_cache);
707788bd 5409 }
8e50cc2d 5410 else if (WINDOWP (obj))
41c28a37
GM
5411 {
5412 register struct Lisp_Vector *ptr = XVECTOR (obj);
5413 struct window *w = XWINDOW (obj);
8f11f7ec
SM
5414 mark_vectorlike (ptr);
5415 /* Mark glyphs for leaf windows. Marking window matrices is
5416 sufficient because frame matrices use the same glyph
5417 memory. */
5418 if (NILP (w->hchild)
5419 && NILP (w->vchild)
5420 && w->current_matrix)
41c28a37 5421 {
8f11f7ec
SM
5422 mark_glyph_matrix (w->current_matrix);
5423 mark_glyph_matrix (w->desired_matrix);
41c28a37
GM
5424 }
5425 }
8e50cc2d 5426 else if (HASH_TABLE_P (obj))
41c28a37
GM
5427 {
5428 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
8f11f7ec
SM
5429 mark_vectorlike ((struct Lisp_Vector *)h);
5430 /* If hash table is not weak, mark all keys and values.
5431 For weak tables, mark only the vector. */
5432 if (NILP (h->weak))
5433 mark_object (h->key_and_value);
5434 else
5435 VECTOR_MARK (XVECTOR (h->key_and_value));
41c28a37 5436 }
58026347 5437 else if (CHAR_TABLE_P (obj))
8f11f7ec 5438 mark_char_table (XVECTOR (obj));
04ff9756 5439 else
d2029e5b 5440 mark_vectorlike (XVECTOR (obj));
169ee243 5441 break;
7146af97 5442
7146af97
JB
5443 case Lisp_Symbol:
5444 {
c70bbf06 5445 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
7146af97
JB
5446 struct Lisp_Symbol *ptrx;
5447
8f11f7ec
SM
5448 if (ptr->gcmarkbit)
5449 break;
4f5c1376 5450 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
2336fe58 5451 ptr->gcmarkbit = 1;
49723c04
SM
5452 mark_object (ptr->function);
5453 mark_object (ptr->plist);
ce5b453a
SM
5454 switch (ptr->redirect)
5455 {
5456 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
5457 case SYMBOL_VARALIAS:
5458 {
5459 Lisp_Object tem;
5460 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
5461 mark_object (tem);
5462 break;
5463 }
5464 case SYMBOL_LOCALIZED:
5465 {
5466 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
5467 /* If the value is forwarded to a buffer or keyboard field,
5468 these are marked when we see the corresponding object.
5469 And if it's forwarded to a C variable, either it's not
5470 a Lisp_Object var, or it's staticpro'd already. */
5471 mark_object (blv->where);
5472 mark_object (blv->valcell);
5473 mark_object (blv->defcell);
5474 break;
5475 }
5476 case SYMBOL_FORWARDED:
5477 /* If the value is forwarded to a buffer or keyboard field,
5478 these are marked when we see the corresponding object.
5479 And if it's forwarded to a C variable, either it's not
5480 a Lisp_Object var, or it's staticpro'd already. */
5481 break;
5482 default: abort ();
5483 }
8fe5665d
KR
5484 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
5485 MARK_STRING (XSTRING (ptr->xname));
d5db4077 5486 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
177c0ea7 5487
7146af97
JB
5488 ptr = ptr->next;
5489 if (ptr)
5490 {
b0846f52 5491 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
7146af97 5492 XSETSYMBOL (obj, ptrx);
49723c04 5493 goto loop;
7146af97
JB
5494 }
5495 }
5496 break;
5497
a0a38eb7 5498 case Lisp_Misc:
4f5c1376 5499 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
67ee9f6e 5500 if (XMISCANY (obj)->gcmarkbit)
2336fe58 5501 break;
67ee9f6e 5502 XMISCANY (obj)->gcmarkbit = 1;
b766f870 5503
a5da44fe 5504 switch (XMISCTYPE (obj))
a0a38eb7 5505 {
465edf35 5506
2336fe58
SM
5507 case Lisp_Misc_Marker:
5508 /* DO NOT mark thru the marker's chain.
5509 The buffer's markers chain does not preserve markers from gc;
5510 instead, markers are removed from the chain when freed by gc. */
b766f870
KS
5511 break;
5512
8f924df7 5513 case Lisp_Misc_Save_Value:
9ea306d1 5514#if GC_MARK_STACK
b766f870
KS
5515 {
5516 register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
5517 /* If DOGC is set, POINTER is the address of a memory
5518 area containing INTEGER potential Lisp_Objects. */
5519 if (ptr->dogc)
5520 {
5521 Lisp_Object *p = (Lisp_Object *) ptr->pointer;
9c4c5f81 5522 ptrdiff_t nelt;
b766f870
KS
5523 for (nelt = ptr->integer; nelt > 0; nelt--, p++)
5524 mark_maybe_object (*p);
5525 }
5526 }
9ea306d1 5527#endif
c8616056
KH
5528 break;
5529
e202fa34
KH
5530 case Lisp_Misc_Overlay:
5531 {
5532 struct Lisp_Overlay *ptr = XOVERLAY (obj);
49723c04
SM
5533 mark_object (ptr->start);
5534 mark_object (ptr->end);
f54253ec
SM
5535 mark_object (ptr->plist);
5536 if (ptr->next)
5537 {
5538 XSETMISC (obj, ptr->next);
5539 goto loop;
5540 }
e202fa34
KH
5541 }
5542 break;
5543
a0a38eb7
KH
5544 default:
5545 abort ();
5546 }
7146af97
JB
5547 break;
5548
5549 case Lisp_Cons:
7146af97
JB
5550 {
5551 register struct Lisp_Cons *ptr = XCONS (obj);
8f11f7ec
SM
5552 if (CONS_MARKED_P (ptr))
5553 break;
4f5c1376 5554 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
08b7c2cb 5555 CONS_MARK (ptr);
c54ca951 5556 /* If the cdr is nil, avoid recursion for the car. */
28a099a4 5557 if (EQ (ptr->u.cdr, Qnil))
c54ca951 5558 {
49723c04 5559 obj = ptr->car;
1342fc6f 5560 cdr_count = 0;
c54ca951
RS
5561 goto loop;
5562 }
49723c04 5563 mark_object (ptr->car);
28a099a4 5564 obj = ptr->u.cdr;
1342fc6f
RS
5565 cdr_count++;
5566 if (cdr_count == mark_object_loop_halt)
5567 abort ();
7146af97
JB
5568 goto loop;
5569 }
5570
7146af97 5571 case Lisp_Float:
4f5c1376 5572 CHECK_ALLOCATED_AND_LIVE (live_float_p);
ab6780cd 5573 FLOAT_MARK (XFLOAT (obj));
7146af97 5574 break;
7146af97 5575
2de9f71c 5576 case_Lisp_Int:
7146af97
JB
5577 break;
5578
5579 default:
5580 abort ();
5581 }
4f5c1376
GM
5582
5583#undef CHECK_LIVE
5584#undef CHECK_ALLOCATED
5585#undef CHECK_ALLOCATED_AND_LIVE
7146af97
JB
5586}
5587
5588/* Mark the pointers in a buffer structure. */
5589
5590static void
971de7fb 5591mark_buffer (Lisp_Object buf)
7146af97 5592{
7146af97 5593 register struct buffer *buffer = XBUFFER (buf);
f54253ec 5594 register Lisp_Object *ptr, tmp;
30e3190a 5595 Lisp_Object base_buffer;
7146af97 5596
8f11f7ec 5597 eassert (!VECTOR_MARKED_P (buffer));
3ef06d12 5598 VECTOR_MARK (buffer);
7146af97 5599
30e3190a 5600 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
d5e35230 5601
c37adf23
SM
5602 /* For now, we just don't mark the undo_list. It's done later in
5603 a special way just before the sweep phase, and after stripping
5604 some of its elements that are not needed any more. */
4c315bda 5605
f54253ec
SM
5606 if (buffer->overlays_before)
5607 {
5608 XSETMISC (tmp, buffer->overlays_before);
5609 mark_object (tmp);
5610 }
5611 if (buffer->overlays_after)
5612 {
5613 XSETMISC (tmp, buffer->overlays_after);
5614 mark_object (tmp);
5615 }
5616
9ce376f9
SM
5617 /* buffer-local Lisp variables start at `undo_list',
5618 tho only the ones from `name' on are GC'd normally. */
5d8ea120 5619 for (ptr = &buffer->BUFFER_INTERNAL_FIELD (name);
7146af97
JB
5620 (char *)ptr < (char *)buffer + sizeof (struct buffer);
5621 ptr++)
49723c04 5622 mark_object (*ptr);
30e3190a
RS
5623
5624 /* If this is an indirect buffer, mark its base buffer. */
349bd9ed 5625 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
30e3190a 5626 {
177c0ea7 5627 XSETBUFFER (base_buffer, buffer->base_buffer);
30e3190a
RS
5628 mark_buffer (base_buffer);
5629 }
7146af97 5630}
084b1a0c 5631
4a729fd8
SM
5632/* Mark the Lisp pointers in the terminal objects.
5633 Called by the Fgarbage_collector. */
5634
4a729fd8
SM
5635static void
5636mark_terminals (void)
5637{
5638 struct terminal *t;
5639 for (t = terminal_list; t; t = t->next_terminal)
5640 {
5641 eassert (t->name != NULL);
354884c4 5642#ifdef HAVE_WINDOW_SYSTEM
96ad0af7
YM
5643 /* If a terminal object is reachable from a stacpro'ed object,
5644 it might have been marked already. Make sure the image cache
5645 gets marked. */
5646 mark_image_cache (t->image_cache);
354884c4 5647#endif /* HAVE_WINDOW_SYSTEM */
96ad0af7
YM
5648 if (!VECTOR_MARKED_P (t))
5649 mark_vectorlike ((struct Lisp_Vector *)t);
4a729fd8
SM
5650 }
5651}
5652
5653
084b1a0c 5654
41c28a37
GM
5655/* Value is non-zero if OBJ will survive the current GC because it's
5656 either marked or does not need to be marked to survive. */
5657
5658int
971de7fb 5659survives_gc_p (Lisp_Object obj)
41c28a37
GM
5660{
5661 int survives_p;
177c0ea7 5662
8e50cc2d 5663 switch (XTYPE (obj))
41c28a37 5664 {
2de9f71c 5665 case_Lisp_Int:
41c28a37
GM
5666 survives_p = 1;
5667 break;
5668
5669 case Lisp_Symbol:
2336fe58 5670 survives_p = XSYMBOL (obj)->gcmarkbit;
41c28a37
GM
5671 break;
5672
5673 case Lisp_Misc:
67ee9f6e 5674 survives_p = XMISCANY (obj)->gcmarkbit;
41c28a37
GM
5675 break;
5676
5677 case Lisp_String:
08b7c2cb 5678 survives_p = STRING_MARKED_P (XSTRING (obj));
41c28a37
GM
5679 break;
5680
5681 case Lisp_Vectorlike:
8e50cc2d 5682 survives_p = SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
41c28a37
GM
5683 break;
5684
5685 case Lisp_Cons:
08b7c2cb 5686 survives_p = CONS_MARKED_P (XCONS (obj));
41c28a37
GM
5687 break;
5688
41c28a37 5689 case Lisp_Float:
ab6780cd 5690 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
41c28a37 5691 break;
41c28a37
GM
5692
5693 default:
5694 abort ();
5695 }
5696
34400008 5697 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
41c28a37
GM
5698}
5699
5700
7146af97 5701\f
1a4f1e2c 5702/* Sweep: find all structures not marked, and free them. */
7146af97
JB
5703
5704static void
971de7fb 5705gc_sweep (void)
7146af97 5706{
41c28a37
GM
5707 /* Remove or mark entries in weak hash tables.
5708 This must be done before any object is unmarked. */
5709 sweep_weak_hash_tables ();
5710
2e471eb5 5711 sweep_strings ();
676a7251
GM
5712#ifdef GC_CHECK_STRING_BYTES
5713 if (!noninteractive)
5714 check_string_bytes (1);
5715#endif
7146af97
JB
5716
5717 /* Put all unmarked conses on free list */
5718 {
5719 register struct cons_block *cblk;
6ca94ac9 5720 struct cons_block **cprev = &cons_block;
7146af97 5721 register int lim = cons_block_index;
c0c5c8ae 5722 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
5723
5724 cons_free_list = 0;
177c0ea7 5725
6ca94ac9 5726 for (cblk = cons_block; cblk; cblk = *cprev)
7146af97 5727 {
3ae2e3a3 5728 register int i = 0;
6ca94ac9 5729 int this_free = 0;
3ae2e3a3
RS
5730 int ilim = (lim + BITS_PER_INT - 1) / BITS_PER_INT;
5731
5732 /* Scan the mark bits an int at a time. */
5733 for (i = 0; i <= ilim; i++)
5734 {
5735 if (cblk->gcmarkbits[i] == -1)
5736 {
5737 /* Fast path - all cons cells for this int are marked. */
5738 cblk->gcmarkbits[i] = 0;
5739 num_used += BITS_PER_INT;
5740 }
5741 else
5742 {
5743 /* Some cons cells for this int are not marked.
5744 Find which ones, and free them. */
5745 int start, pos, stop;
5746
5747 start = i * BITS_PER_INT;
5748 stop = lim - start;
5749 if (stop > BITS_PER_INT)
5750 stop = BITS_PER_INT;
5751 stop += start;
5752
5753 for (pos = start; pos < stop; pos++)
5754 {
5755 if (!CONS_MARKED_P (&cblk->conses[pos]))
5756 {
5757 this_free++;
5758 cblk->conses[pos].u.chain = cons_free_list;
5759 cons_free_list = &cblk->conses[pos];
34400008 5760#if GC_MARK_STACK
3ae2e3a3 5761 cons_free_list->car = Vdead;
34400008 5762#endif
3ae2e3a3
RS
5763 }
5764 else
5765 {
5766 num_used++;
5767 CONS_UNMARK (&cblk->conses[pos]);
5768 }
5769 }
5770 }
5771 }
5772
7146af97 5773 lim = CONS_BLOCK_SIZE;
6ca94ac9
KH
5774 /* If this block contains only free conses and we have already
5775 seen more than two blocks worth of free conses then deallocate
5776 this block. */
6feef451 5777 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
6ca94ac9 5778 {
6ca94ac9
KH
5779 *cprev = cblk->next;
5780 /* Unhook from the free list. */
28a099a4 5781 cons_free_list = cblk->conses[0].u.chain;
08b7c2cb 5782 lisp_align_free (cblk);
6ca94ac9
KH
5783 }
5784 else
6feef451
AS
5785 {
5786 num_free += this_free;
5787 cprev = &cblk->next;
5788 }
7146af97
JB
5789 }
5790 total_conses = num_used;
5791 total_free_conses = num_free;
5792 }
5793
7146af97
JB
5794 /* Put all unmarked floats on free list */
5795 {
5796 register struct float_block *fblk;
6ca94ac9 5797 struct float_block **fprev = &float_block;
7146af97 5798 register int lim = float_block_index;
c0c5c8ae 5799 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
5800
5801 float_free_list = 0;
177c0ea7 5802
6ca94ac9 5803 for (fblk = float_block; fblk; fblk = *fprev)
7146af97
JB
5804 {
5805 register int i;
6ca94ac9 5806 int this_free = 0;
7146af97 5807 for (i = 0; i < lim; i++)
ab6780cd 5808 if (!FLOAT_MARKED_P (&fblk->floats[i]))
7146af97 5809 {
6ca94ac9 5810 this_free++;
28a099a4 5811 fblk->floats[i].u.chain = float_free_list;
7146af97
JB
5812 float_free_list = &fblk->floats[i];
5813 }
5814 else
5815 {
5816 num_used++;
ab6780cd 5817 FLOAT_UNMARK (&fblk->floats[i]);
7146af97
JB
5818 }
5819 lim = FLOAT_BLOCK_SIZE;
6ca94ac9
KH
5820 /* If this block contains only free floats and we have already
5821 seen more than two blocks worth of free floats then deallocate
5822 this block. */
6feef451 5823 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
6ca94ac9 5824 {
6ca94ac9
KH
5825 *fprev = fblk->next;
5826 /* Unhook from the free list. */
28a099a4 5827 float_free_list = fblk->floats[0].u.chain;
ab6780cd 5828 lisp_align_free (fblk);
6ca94ac9
KH
5829 }
5830 else
6feef451
AS
5831 {
5832 num_free += this_free;
5833 fprev = &fblk->next;
5834 }
7146af97
JB
5835 }
5836 total_floats = num_used;
5837 total_free_floats = num_free;
5838 }
7146af97 5839
d5e35230
JA
5840 /* Put all unmarked intervals on free list */
5841 {
5842 register struct interval_block *iblk;
6ca94ac9 5843 struct interval_block **iprev = &interval_block;
d5e35230 5844 register int lim = interval_block_index;
c0c5c8ae 5845 EMACS_INT num_free = 0, num_used = 0;
d5e35230
JA
5846
5847 interval_free_list = 0;
5848
6ca94ac9 5849 for (iblk = interval_block; iblk; iblk = *iprev)
d5e35230
JA
5850 {
5851 register int i;
6ca94ac9 5852 int this_free = 0;
d5e35230
JA
5853
5854 for (i = 0; i < lim; i++)
5855 {
2336fe58 5856 if (!iblk->intervals[i].gcmarkbit)
d5e35230 5857 {
439d5cb4 5858 SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
d5e35230 5859 interval_free_list = &iblk->intervals[i];
6ca94ac9 5860 this_free++;
d5e35230
JA
5861 }
5862 else
5863 {
5864 num_used++;
2336fe58 5865 iblk->intervals[i].gcmarkbit = 0;
d5e35230
JA
5866 }
5867 }
5868 lim = INTERVAL_BLOCK_SIZE;
6ca94ac9
KH
5869 /* If this block contains only free intervals and we have already
5870 seen more than two blocks worth of free intervals then
5871 deallocate this block. */
6feef451 5872 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
6ca94ac9 5873 {
6ca94ac9
KH
5874 *iprev = iblk->next;
5875 /* Unhook from the free list. */
439d5cb4 5876 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
c8099634 5877 lisp_free (iblk);
6ca94ac9
KH
5878 }
5879 else
6feef451
AS
5880 {
5881 num_free += this_free;
5882 iprev = &iblk->next;
5883 }
d5e35230
JA
5884 }
5885 total_intervals = num_used;
5886 total_free_intervals = num_free;
5887 }
d5e35230 5888
7146af97
JB
5889 /* Put all unmarked symbols on free list */
5890 {
5891 register struct symbol_block *sblk;
6ca94ac9 5892 struct symbol_block **sprev = &symbol_block;
7146af97 5893 register int lim = symbol_block_index;
c0c5c8ae 5894 EMACS_INT num_free = 0, num_used = 0;
7146af97 5895
d285b373 5896 symbol_free_list = NULL;
177c0ea7 5897
6ca94ac9 5898 for (sblk = symbol_block; sblk; sblk = *sprev)
7146af97 5899 {
6ca94ac9 5900 int this_free = 0;
d285b373
GM
5901 struct Lisp_Symbol *sym = sblk->symbols;
5902 struct Lisp_Symbol *end = sym + lim;
5903
5904 for (; sym < end; ++sym)
5905 {
20035321
SM
5906 /* Check if the symbol was created during loadup. In such a case
5907 it might be pointed to by pure bytecode which we don't trace,
5908 so we conservatively assume that it is live. */
8fe5665d 5909 int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
177c0ea7 5910
2336fe58 5911 if (!sym->gcmarkbit && !pure_p)
d285b373 5912 {
ce5b453a
SM
5913 if (sym->redirect == SYMBOL_LOCALIZED)
5914 xfree (SYMBOL_BLV (sym));
28a099a4 5915 sym->next = symbol_free_list;
d285b373 5916 symbol_free_list = sym;
34400008 5917#if GC_MARK_STACK
d285b373 5918 symbol_free_list->function = Vdead;
34400008 5919#endif
d285b373
GM
5920 ++this_free;
5921 }
5922 else
5923 {
5924 ++num_used;
5925 if (!pure_p)
8fe5665d 5926 UNMARK_STRING (XSTRING (sym->xname));
2336fe58 5927 sym->gcmarkbit = 0;
d285b373
GM
5928 }
5929 }
177c0ea7 5930
7146af97 5931 lim = SYMBOL_BLOCK_SIZE;
6ca94ac9
KH
5932 /* If this block contains only free symbols and we have already
5933 seen more than two blocks worth of free symbols then deallocate
5934 this block. */
6feef451 5935 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
6ca94ac9 5936 {
6ca94ac9
KH
5937 *sprev = sblk->next;
5938 /* Unhook from the free list. */
28a099a4 5939 symbol_free_list = sblk->symbols[0].next;
c8099634 5940 lisp_free (sblk);
6ca94ac9
KH
5941 }
5942 else
6feef451
AS
5943 {
5944 num_free += this_free;
5945 sprev = &sblk->next;
5946 }
7146af97
JB
5947 }
5948 total_symbols = num_used;
5949 total_free_symbols = num_free;
5950 }
5951
a9faeabe
RS
5952 /* Put all unmarked misc's on free list.
5953 For a marker, first unchain it from the buffer it points into. */
7146af97
JB
5954 {
5955 register struct marker_block *mblk;
6ca94ac9 5956 struct marker_block **mprev = &marker_block;
7146af97 5957 register int lim = marker_block_index;
c0c5c8ae 5958 EMACS_INT num_free = 0, num_used = 0;
7146af97
JB
5959
5960 marker_free_list = 0;
177c0ea7 5961
6ca94ac9 5962 for (mblk = marker_block; mblk; mblk = *mprev)
7146af97
JB
5963 {
5964 register int i;
6ca94ac9 5965 int this_free = 0;
fa05e253 5966
7146af97 5967 for (i = 0; i < lim; i++)
465edf35 5968 {
d314756e 5969 if (!mblk->markers[i].u_any.gcmarkbit)
465edf35 5970 {
d314756e 5971 if (mblk->markers[i].u_any.type == Lisp_Misc_Marker)
ef89c2ce 5972 unchain_marker (&mblk->markers[i].u_marker);
fa05e253
RS
5973 /* Set the type of the freed object to Lisp_Misc_Free.
5974 We could leave the type alone, since nobody checks it,
465edf35 5975 but this might catch bugs faster. */
a5da44fe 5976 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
465edf35
KH
5977 mblk->markers[i].u_free.chain = marker_free_list;
5978 marker_free_list = &mblk->markers[i];
6ca94ac9 5979 this_free++;
465edf35
KH
5980 }
5981 else
5982 {
5983 num_used++;
d314756e 5984 mblk->markers[i].u_any.gcmarkbit = 0;
465edf35
KH
5985 }
5986 }
7146af97 5987 lim = MARKER_BLOCK_SIZE;
6ca94ac9
KH
5988 /* If this block contains only free markers and we have already
5989 seen more than two blocks worth of free markers then deallocate
5990 this block. */
6feef451 5991 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
6ca94ac9 5992 {
6ca94ac9
KH
5993 *mprev = mblk->next;
5994 /* Unhook from the free list. */
5995 marker_free_list = mblk->markers[0].u_free.chain;
c8099634 5996 lisp_free (mblk);
6ca94ac9
KH
5997 }
5998 else
6feef451
AS
5999 {
6000 num_free += this_free;
6001 mprev = &mblk->next;
6002 }
7146af97
JB
6003 }
6004
6005 total_markers = num_used;
6006 total_free_markers = num_free;
6007 }
6008
6009 /* Free all unmarked buffers */
6010 {
6011 register struct buffer *buffer = all_buffers, *prev = 0, *next;
6012
6013 while (buffer)
3ef06d12 6014 if (!VECTOR_MARKED_P (buffer))
7146af97
JB
6015 {
6016 if (prev)
eab3844f 6017 prev->header.next = buffer->header.next;
7146af97 6018 else
eab3844f
PE
6019 all_buffers = buffer->header.next.buffer;
6020 next = buffer->header.next.buffer;
34400008 6021 lisp_free (buffer);
7146af97
JB
6022 buffer = next;
6023 }
6024 else
6025 {
3ef06d12 6026 VECTOR_UNMARK (buffer);
30e3190a 6027 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
eab3844f 6028 prev = buffer, buffer = buffer->header.next.buffer;
7146af97
JB
6029 }
6030 }
6031
7146af97
JB
6032 /* Free all unmarked vectors */
6033 {
6034 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
6035 total_vector_size = 0;
6036
6037 while (vector)
3ef06d12 6038 if (!VECTOR_MARKED_P (vector))
7146af97
JB
6039 {
6040 if (prev)
eab3844f 6041 prev->header.next = vector->header.next;
7146af97 6042 else
eab3844f
PE
6043 all_vectors = vector->header.next.vector;
6044 next = vector->header.next.vector;
c8099634 6045 lisp_free (vector);
7146af97 6046 vector = next;
41c28a37 6047
7146af97
JB
6048 }
6049 else
6050 {
3ef06d12 6051 VECTOR_UNMARK (vector);
eab3844f
PE
6052 if (vector->header.size & PSEUDOVECTOR_FLAG)
6053 total_vector_size += PSEUDOVECTOR_SIZE_MASK & vector->header.size;
fa05e253 6054 else
eab3844f
PE
6055 total_vector_size += vector->header.size;
6056 prev = vector, vector = vector->header.next.vector;
7146af97
JB
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
d01a7826 6079 XSETINT (end, (intptr_t) (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}