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