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