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