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