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