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