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