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