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