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