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