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