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