[emacs] (malloc, free): Define as xmalloc, and xfree.
[bpt/emacs.git] / src / alloc.c
... / ...
CommitLineData
1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 86, 88, 93, 94, 95 Free Software Foundation, Inc.
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21/* Note that this declares bzero on OSF/1. How dumb. */
22#include <signal.h>
23
24#include <config.h>
25#include "lisp.h"
26#include "intervals.h"
27#include "puresize.h"
28#ifndef standalone
29#include "buffer.h"
30#include "window.h"
31#include "frame.h"
32#include "blockinput.h"
33#include "keyboard.h"
34#endif
35
36#include "syssignal.h"
37
38extern char *sbrk ();
39
40/* The following come from gmalloc.c. */
41
42#if defined (__STDC__) && __STDC__
43#include <stddef.h>
44#define __malloc_size_t size_t
45#else
46#define __malloc_size_t unsigned int
47#endif
48extern __malloc_size_t _bytes_used;
49extern int __malloc_extra_blocks;
50
51#define max(A,B) ((A) > (B) ? (A) : (B))
52#define min(A,B) ((A) < (B) ? (A) : (B))
53
54/* Macro to verify that storage intended for Lisp objects is not
55 out of range to fit in the space for a pointer.
56 ADDRESS is the start of the block, and SIZE
57 is the amount of space within which objects can start. */
58#define VALIDATE_LISP_STORAGE(address, size) \
59do \
60 { \
61 Lisp_Object val; \
62 XSETCONS (val, (char *) address + size); \
63 if ((char *) XCONS (val) != (char *) address + size) \
64 { \
65 xfree (address); \
66 memory_full (); \
67 } \
68 } while (0)
69
70/* Value of _bytes_used, when spare_memory was freed. */
71static __malloc_size_t bytes_used_when_full;
72
73/* Number of bytes of consing done since the last gc */
74int consing_since_gc;
75
76/* Count the amount of consing of various sorts of space. */
77int cons_cells_consed;
78int floats_consed;
79int vector_cells_consed;
80int symbols_consed;
81int string_chars_consed;
82int misc_objects_consed;
83int intervals_consed;
84
85/* Number of bytes of consing since gc before another gc should be done. */
86int gc_cons_threshold;
87
88/* Nonzero during gc */
89int gc_in_progress;
90
91/* Nonzero means display messages at beginning and end of GC. */
92int garbage_collection_messages;
93
94#ifndef VIRT_ADDR_VARIES
95extern
96#endif /* VIRT_ADDR_VARIES */
97 int malloc_sbrk_used;
98
99#ifndef VIRT_ADDR_VARIES
100extern
101#endif /* VIRT_ADDR_VARIES */
102 int malloc_sbrk_unused;
103
104/* Two limits controlling how much undo information to keep. */
105int undo_limit;
106int undo_strong_limit;
107
108/* Points to memory space allocated as "spare",
109 to be freed if we run out of memory. */
110static char *spare_memory;
111
112/* Amount of spare memory to keep in reserve. */
113#define SPARE_MEMORY (1 << 14)
114
115/* Number of extra blocks malloc should get when it needs more core. */
116static int malloc_hysteresis;
117
118/* Nonzero when malloc is called for allocating Lisp object space. */
119int allocating_for_lisp;
120
121/* Non-nil means defun should do purecopy on the function definition */
122Lisp_Object Vpurify_flag;
123
124#ifndef HAVE_SHM
125EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {0,}; /* Force it into data space! */
126#define PUREBEG (char *) pure
127#else
128#define pure PURE_SEG_BITS /* Use shared memory segment */
129#define PUREBEG (char *)PURE_SEG_BITS
130
131/* This variable is used only by the XPNTR macro when HAVE_SHM is
132 defined. If we used the PURESIZE macro directly there, that would
133 make most of emacs dependent on puresize.h, which we don't want -
134 you should be able to change that without too much recompilation.
135 So map_in_data initializes pure_size, and the dependencies work
136 out. */
137EMACS_INT pure_size;
138#endif /* not HAVE_SHM */
139
140/* Index in pure at which next pure object will be allocated. */
141int pureptr;
142
143/* If nonzero, this is a warning delivered by malloc and not yet displayed. */
144char *pending_malloc_warning;
145
146/* Pre-computed signal argument for use when memory is exhausted. */
147Lisp_Object memory_signal_data;
148
149/* Maximum amount of C stack to save when a GC happens. */
150
151#ifndef MAX_SAVE_STACK
152#define MAX_SAVE_STACK 16000
153#endif
154
155/* Define DONT_COPY_FLAG to be some bit which will always be zero in a
156 pointer to a Lisp_Object, when that pointer is viewed as an integer.
157 (On most machines, pointers are even, so we can use the low bit.
158 Word-addressable architectures may need to override this in the m-file.)
159 When linking references to small strings through the size field, we
160 use this slot to hold the bit that would otherwise be interpreted as
161 the GC mark bit. */
162#ifndef DONT_COPY_FLAG
163#define DONT_COPY_FLAG 1
164#endif /* no DONT_COPY_FLAG */
165
166/* Buffer in which we save a copy of the C stack at each GC. */
167
168char *stack_copy;
169int stack_copy_size;
170
171/* Non-zero means ignore malloc warnings. Set during initialization. */
172int ignore_warnings;
173
174Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots;
175
176static void mark_object (), mark_buffer (), mark_kboards ();
177static void clear_marks (), gc_sweep ();
178static void compact_strings ();
179\f
180/* Versions of malloc and realloc that print warnings as memory gets full. */
181
182Lisp_Object
183malloc_warning_1 (str)
184 Lisp_Object str;
185{
186 Fprinc (str, Vstandard_output);
187 write_string ("\nKilling some buffers may delay running out of memory.\n", -1);
188 write_string ("However, certainly by the time you receive the 95% warning,\n", -1);
189 write_string ("you should clean up, kill this Emacs, and start a new one.", -1);
190 return Qnil;
191}
192
193/* malloc calls this if it finds we are near exhausting storage */
194malloc_warning (str)
195 char *str;
196{
197 pending_malloc_warning = str;
198}
199
200display_malloc_warning ()
201{
202 register Lisp_Object val;
203
204 val = build_string (pending_malloc_warning);
205 pending_malloc_warning = 0;
206 internal_with_output_to_temp_buffer (" *Danger*", malloc_warning_1, val);
207}
208
209/* Called if malloc returns zero */
210
211memory_full ()
212{
213#ifndef SYSTEM_MALLOC
214 bytes_used_when_full = _bytes_used;
215#endif
216
217 /* The first time we get here, free the spare memory. */
218 if (spare_memory)
219 {
220 free (spare_memory);
221 spare_memory = 0;
222 }
223
224 /* This used to call error, but if we've run out of memory, we could get
225 infinite recursion trying to build the string. */
226 while (1)
227 Fsignal (Qerror, memory_signal_data);
228}
229
230/* Called if we can't allocate relocatable space for a buffer. */
231
232void
233buffer_memory_full ()
234{
235 /* If buffers use the relocating allocator,
236 no need to free spare_memory, because we may have plenty of malloc
237 space left that we could get, and if we don't, the malloc that fails
238 will itself cause spare_memory to be freed.
239 If buffers don't use the relocating allocator,
240 treat this like any other failing malloc. */
241
242#ifndef REL_ALLOC
243 memory_full ();
244#endif
245
246 /* This used to call error, but if we've run out of memory, we could get
247 infinite recursion trying to build the string. */
248 while (1)
249 Fsignal (Qerror, memory_signal_data);
250}
251
252/* like malloc routines but check for no memory and block interrupt input. */
253
254long *
255xmalloc (size)
256 int size;
257{
258 register long *val;
259
260 BLOCK_INPUT;
261 val = (long *) malloc (size);
262 UNBLOCK_INPUT;
263
264 if (!val && size) memory_full ();
265 return val;
266}
267
268long *
269xrealloc (block, size)
270 long *block;
271 int size;
272{
273 register long *val;
274
275 BLOCK_INPUT;
276 /* We must call malloc explicitly when BLOCK is 0, since some
277 reallocs don't do this. */
278 if (! block)
279 val = (long *) malloc (size);
280 else
281 val = (long *) realloc (block, size);
282 UNBLOCK_INPUT;
283
284 if (!val && size) memory_full ();
285 return val;
286}
287
288void
289xfree (block)
290 long *block;
291{
292 BLOCK_INPUT;
293 free (block);
294 UNBLOCK_INPUT;
295}
296
297\f
298/* Arranging to disable input signals while we're in malloc.
299
300 This only works with GNU malloc. To help out systems which can't
301 use GNU malloc, all the calls to malloc, realloc, and free
302 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
303 pairs; unfortunately, we have no idea what C library functions
304 might call malloc, so we can't really protect them unless you're
305 using GNU malloc. Fortunately, most of the major operating can use
306 GNU malloc. */
307
308#ifndef SYSTEM_MALLOC
309extern void * (*__malloc_hook) ();
310static void * (*old_malloc_hook) ();
311extern void * (*__realloc_hook) ();
312static void * (*old_realloc_hook) ();
313extern void (*__free_hook) ();
314static void (*old_free_hook) ();
315
316/* This function is used as the hook for free to call. */
317
318static void
319emacs_blocked_free (ptr)
320 void *ptr;
321{
322 BLOCK_INPUT;
323 __free_hook = old_free_hook;
324 free (ptr);
325 /* If we released our reserve (due to running out of memory),
326 and we have a fair amount free once again,
327 try to set aside another reserve in case we run out once more. */
328 if (spare_memory == 0
329 /* Verify there is enough space that even with the malloc
330 hysteresis this call won't run out again.
331 The code here is correct as long as SPARE_MEMORY
332 is substantially larger than the block size malloc uses. */
333 && (bytes_used_when_full
334 > _bytes_used + max (malloc_hysteresis, 4) * SPARE_MEMORY))
335 spare_memory = (char *) malloc (SPARE_MEMORY);
336
337 __free_hook = emacs_blocked_free;
338 UNBLOCK_INPUT;
339}
340
341/* If we released our reserve (due to running out of memory),
342 and we have a fair amount free once again,
343 try to set aside another reserve in case we run out once more.
344
345 This is called when a relocatable block is freed in ralloc.c. */
346
347void
348refill_memory_reserve ()
349{
350 if (spare_memory == 0)
351 spare_memory = (char *) malloc (SPARE_MEMORY);
352}
353
354/* This function is the malloc hook that Emacs uses. */
355
356static void *
357emacs_blocked_malloc (size)
358 unsigned size;
359{
360 void *value;
361
362 BLOCK_INPUT;
363 __malloc_hook = old_malloc_hook;
364 __malloc_extra_blocks = malloc_hysteresis;
365 value = (void *) malloc (size);
366 __malloc_hook = emacs_blocked_malloc;
367 UNBLOCK_INPUT;
368
369 return value;
370}
371
372static void *
373emacs_blocked_realloc (ptr, size)
374 void *ptr;
375 unsigned size;
376{
377 void *value;
378
379 BLOCK_INPUT;
380 __realloc_hook = old_realloc_hook;
381 value = (void *) realloc (ptr, size);
382 __realloc_hook = emacs_blocked_realloc;
383 UNBLOCK_INPUT;
384
385 return value;
386}
387
388void
389uninterrupt_malloc ()
390{
391 old_free_hook = __free_hook;
392 __free_hook = emacs_blocked_free;
393
394 old_malloc_hook = __malloc_hook;
395 __malloc_hook = emacs_blocked_malloc;
396
397 old_realloc_hook = __realloc_hook;
398 __realloc_hook = emacs_blocked_realloc;
399}
400#endif
401\f
402/* Interval allocation. */
403
404#ifdef USE_TEXT_PROPERTIES
405#define INTERVAL_BLOCK_SIZE \
406 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
407
408struct interval_block
409 {
410 struct interval_block *next;
411 struct interval intervals[INTERVAL_BLOCK_SIZE];
412 };
413
414struct interval_block *interval_block;
415static int interval_block_index;
416
417INTERVAL interval_free_list;
418
419static void
420init_intervals ()
421{
422 allocating_for_lisp = 1;
423 interval_block
424 = (struct interval_block *) malloc (sizeof (struct interval_block));
425 allocating_for_lisp = 0;
426 interval_block->next = 0;
427 bzero ((char *) interval_block->intervals, sizeof interval_block->intervals);
428 interval_block_index = 0;
429 interval_free_list = 0;
430}
431
432#define INIT_INTERVALS init_intervals ()
433
434INTERVAL
435make_interval ()
436{
437 INTERVAL val;
438
439 if (interval_free_list)
440 {
441 val = interval_free_list;
442 interval_free_list = interval_free_list->parent;
443 }
444 else
445 {
446 if (interval_block_index == INTERVAL_BLOCK_SIZE)
447 {
448 register struct interval_block *newi;
449
450 allocating_for_lisp = 1;
451 newi = (struct interval_block *) xmalloc (sizeof (struct interval_block));
452
453 allocating_for_lisp = 0;
454 VALIDATE_LISP_STORAGE (newi, sizeof *newi);
455 newi->next = interval_block;
456 interval_block = newi;
457 interval_block_index = 0;
458 }
459 val = &interval_block->intervals[interval_block_index++];
460 }
461 consing_since_gc += sizeof (struct interval);
462 intervals_consed++;
463 RESET_INTERVAL (val);
464 return val;
465}
466
467static int total_free_intervals, total_intervals;
468
469/* Mark the pointers of one interval. */
470
471static void
472mark_interval (i, dummy)
473 register INTERVAL i;
474 Lisp_Object dummy;
475{
476 if (XMARKBIT (i->plist))
477 abort ();
478 mark_object (&i->plist);
479 XMARK (i->plist);
480}
481
482static void
483mark_interval_tree (tree)
484 register INTERVAL tree;
485{
486 /* No need to test if this tree has been marked already; this
487 function is always called through the MARK_INTERVAL_TREE macro,
488 which takes care of that. */
489
490 /* XMARK expands to an assignment; the LHS of an assignment can't be
491 a cast. */
492 XMARK (* (Lisp_Object *) &tree->parent);
493
494 traverse_intervals (tree, 1, 0, mark_interval, Qnil);
495}
496
497#define MARK_INTERVAL_TREE(i) \
498 do { \
499 if (!NULL_INTERVAL_P (i) \
500 && ! XMARKBIT ((Lisp_Object) i->parent)) \
501 mark_interval_tree (i); \
502 } while (0)
503
504/* The oddity in the call to XUNMARK is necessary because XUNMARK
505 expands to an assignment to its argument, and most C compilers don't
506 support casts on the left operand of `='. */
507#define UNMARK_BALANCE_INTERVALS(i) \
508{ \
509 if (! NULL_INTERVAL_P (i)) \
510 { \
511 XUNMARK (* (Lisp_Object *) (&(i)->parent)); \
512 (i) = balance_intervals (i); \
513 } \
514}
515
516#else /* no interval use */
517
518#define INIT_INTERVALS
519
520#define UNMARK_BALANCE_INTERVALS(i)
521#define MARK_INTERVAL_TREE(i)
522
523#endif /* no interval use */
524\f
525/* Floating point allocation. */
526
527#ifdef LISP_FLOAT_TYPE
528/* Allocation of float cells, just like conses */
529/* We store float cells inside of float_blocks, allocating a new
530 float_block with malloc whenever necessary. Float cells reclaimed by
531 GC are put on a free list to be reallocated before allocating
532 any new float cells from the latest float_block.
533
534 Each float_block is just under 1020 bytes long,
535 since malloc really allocates in units of powers of two
536 and uses 4 bytes for its own overhead. */
537
538#define FLOAT_BLOCK_SIZE \
539 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float))
540
541struct float_block
542 {
543 struct float_block *next;
544 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
545 };
546
547struct float_block *float_block;
548int float_block_index;
549
550struct Lisp_Float *float_free_list;
551
552void
553init_float ()
554{
555 allocating_for_lisp = 1;
556 float_block = (struct float_block *) malloc (sizeof (struct float_block));
557 allocating_for_lisp = 0;
558 float_block->next = 0;
559 bzero ((char *) float_block->floats, sizeof float_block->floats);
560 float_block_index = 0;
561 float_free_list = 0;
562}
563
564/* Explicitly free a float cell. */
565free_float (ptr)
566 struct Lisp_Float *ptr;
567{
568 *(struct Lisp_Float **)&ptr->type = float_free_list;
569 float_free_list = ptr;
570}
571
572Lisp_Object
573make_float (float_value)
574 double float_value;
575{
576 register Lisp_Object val;
577
578 if (float_free_list)
579 {
580 XSETFLOAT (val, float_free_list);
581 float_free_list = *(struct Lisp_Float **)&float_free_list->type;
582 }
583 else
584 {
585 if (float_block_index == FLOAT_BLOCK_SIZE)
586 {
587 register struct float_block *new;
588
589 allocating_for_lisp = 1;
590 new = (struct float_block *) xmalloc (sizeof (struct float_block));
591 allocating_for_lisp = 0;
592 VALIDATE_LISP_STORAGE (new, sizeof *new);
593 new->next = float_block;
594 float_block = new;
595 float_block_index = 0;
596 }
597 XSETFLOAT (val, &float_block->floats[float_block_index++]);
598 }
599 XFLOAT (val)->data = float_value;
600 XSETFASTINT (XFLOAT (val)->type, 0); /* bug chasing -wsr */
601 consing_since_gc += sizeof (struct Lisp_Float);
602 floats_consed++;
603 return val;
604}
605
606#endif /* LISP_FLOAT_TYPE */
607\f
608/* Allocation of cons cells */
609/* We store cons cells inside of cons_blocks, allocating a new
610 cons_block with malloc whenever necessary. Cons cells reclaimed by
611 GC are put on a free list to be reallocated before allocating
612 any new cons cells from the latest cons_block.
613
614 Each cons_block is just under 1020 bytes long,
615 since malloc really allocates in units of powers of two
616 and uses 4 bytes for its own overhead. */
617
618#define CONS_BLOCK_SIZE \
619 ((1020 - sizeof (struct cons_block *)) / sizeof (struct Lisp_Cons))
620
621struct cons_block
622 {
623 struct cons_block *next;
624 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
625 };
626
627struct cons_block *cons_block;
628int cons_block_index;
629
630struct Lisp_Cons *cons_free_list;
631
632void
633init_cons ()
634{
635 allocating_for_lisp = 1;
636 cons_block = (struct cons_block *) malloc (sizeof (struct cons_block));
637 allocating_for_lisp = 0;
638 cons_block->next = 0;
639 bzero ((char *) cons_block->conses, sizeof cons_block->conses);
640 cons_block_index = 0;
641 cons_free_list = 0;
642}
643
644/* Explicitly free a cons cell. */
645free_cons (ptr)
646 struct Lisp_Cons *ptr;
647{
648 *(struct Lisp_Cons **)&ptr->car = cons_free_list;
649 cons_free_list = ptr;
650}
651
652DEFUN ("cons", Fcons, Scons, 2, 2, 0,
653 "Create a new cons, give it CAR and CDR as components, and return it.")
654 (car, cdr)
655 Lisp_Object car, cdr;
656{
657 register Lisp_Object val;
658
659 if (cons_free_list)
660 {
661 XSETCONS (val, cons_free_list);
662 cons_free_list = *(struct Lisp_Cons **)&cons_free_list->car;
663 }
664 else
665 {
666 if (cons_block_index == CONS_BLOCK_SIZE)
667 {
668 register struct cons_block *new;
669 allocating_for_lisp = 1;
670 new = (struct cons_block *) xmalloc (sizeof (struct cons_block));
671 allocating_for_lisp = 0;
672 VALIDATE_LISP_STORAGE (new, sizeof *new);
673 new->next = cons_block;
674 cons_block = new;
675 cons_block_index = 0;
676 }
677 XSETCONS (val, &cons_block->conses[cons_block_index++]);
678 }
679 XCONS (val)->car = car;
680 XCONS (val)->cdr = cdr;
681 consing_since_gc += sizeof (struct Lisp_Cons);
682 cons_cells_consed++;
683 return val;
684}
685
686DEFUN ("list", Flist, Slist, 0, MANY, 0,
687 "Return a newly created list with specified arguments as elements.\n\
688Any number of arguments, even zero arguments, are allowed.")
689 (nargs, args)
690 int nargs;
691 register Lisp_Object *args;
692{
693 register Lisp_Object val;
694 val = Qnil;
695
696 while (nargs > 0)
697 {
698 nargs--;
699 val = Fcons (args[nargs], val);
700 }
701 return val;
702}
703
704DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
705 "Return a newly created list of length LENGTH, with each element being INIT.")
706 (length, init)
707 register Lisp_Object length, init;
708{
709 register Lisp_Object val;
710 register int size;
711
712 CHECK_NATNUM (length, 0);
713 size = XFASTINT (length);
714
715 val = Qnil;
716 while (size-- > 0)
717 val = Fcons (init, val);
718 return val;
719}
720\f
721/* Allocation of vectors */
722
723struct Lisp_Vector *all_vectors;
724
725struct Lisp_Vector *
726allocate_vectorlike (len)
727 EMACS_INT len;
728{
729 struct Lisp_Vector *p;
730
731 allocating_for_lisp = 1;
732 p = (struct Lisp_Vector *)xmalloc (sizeof (struct Lisp_Vector)
733 + (len - 1) * sizeof (Lisp_Object));
734 allocating_for_lisp = 0;
735 VALIDATE_LISP_STORAGE (p, 0);
736 consing_since_gc += (sizeof (struct Lisp_Vector)
737 + (len - 1) * sizeof (Lisp_Object));
738 vector_cells_consed += len;
739
740 p->next = all_vectors;
741 all_vectors = p;
742 return p;
743}
744
745DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
746 "Return a newly created vector of length LENGTH, with each element being INIT.\n\
747See also the function `vector'.")
748 (length, init)
749 register Lisp_Object length, init;
750{
751 Lisp_Object vector;
752 register EMACS_INT sizei;
753 register int index;
754 register struct Lisp_Vector *p;
755
756 CHECK_NATNUM (length, 0);
757 sizei = XFASTINT (length);
758
759 p = allocate_vectorlike (sizei);
760 p->size = sizei;
761 for (index = 0; index < sizei; index++)
762 p->contents[index] = init;
763
764 XSETVECTOR (vector, p);
765 return vector;
766}
767
768DEFUN ("make-char-table", Fmake_char_table, Smake_char_table, 1, 2, 0,
769 "Return a newly created char-table, with purpose PURPOSE.\n\
770Each element is initialized to INIT, which defaults to nil.\n\
771PURPOSE should be a symbol which has a `char-table-extra-slots' property.\n\
772The property's value should be an integer between 0 and 10.")
773 (purpose, init)
774 register Lisp_Object purpose, init;
775{
776 Lisp_Object vector;
777 Lisp_Object n;
778 CHECK_SYMBOL (purpose, 1);
779 n = Fget (purpose, Qchar_table_extra_slots);
780 CHECK_NUMBER (n, 0);
781 if (XINT (n) < 0 || XINT (n) > 10)
782 args_out_of_range (n, Qnil);
783 /* Add 2 to the size for the defalt and parent slots. */
784 vector = Fmake_vector (make_number (CHAR_TABLE_STANDARD_SLOTS + XINT (n)),
785 init);
786 XCHAR_TABLE (vector)->parent = Qnil;
787 XCHAR_TABLE (vector)->purpose = purpose;
788 XSETCHAR_TABLE (vector, XCHAR_TABLE (vector));
789 return vector;
790}
791
792DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
793 "Return a newly created vector with specified arguments as elements.\n\
794Any number of arguments, even zero arguments, are allowed.")
795 (nargs, args)
796 register int nargs;
797 Lisp_Object *args;
798{
799 register Lisp_Object len, val;
800 register int index;
801 register struct Lisp_Vector *p;
802
803 XSETFASTINT (len, nargs);
804 val = Fmake_vector (len, Qnil);
805 p = XVECTOR (val);
806 for (index = 0; index < nargs; index++)
807 p->contents[index] = args[index];
808 return val;
809}
810
811DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
812 "Create a byte-code object with specified arguments as elements.\n\
813The arguments should be the arglist, bytecode-string, constant vector,\n\
814stack size, (optional) doc string, and (optional) interactive spec.\n\
815The first four arguments are required; at most six have any\n\
816significance.")
817 (nargs, args)
818 register int nargs;
819 Lisp_Object *args;
820{
821 register Lisp_Object len, val;
822 register int index;
823 register struct Lisp_Vector *p;
824
825 XSETFASTINT (len, nargs);
826 if (!NILP (Vpurify_flag))
827 val = make_pure_vector ((EMACS_INT) nargs);
828 else
829 val = Fmake_vector (len, Qnil);
830 p = XVECTOR (val);
831 for (index = 0; index < nargs; index++)
832 {
833 if (!NILP (Vpurify_flag))
834 args[index] = Fpurecopy (args[index]);
835 p->contents[index] = args[index];
836 }
837 XSETCOMPILED (val, val);
838 return val;
839}
840\f
841/* Allocation of symbols.
842 Just like allocation of conses!
843
844 Each symbol_block is just under 1020 bytes long,
845 since malloc really allocates in units of powers of two
846 and uses 4 bytes for its own overhead. */
847
848#define SYMBOL_BLOCK_SIZE \
849 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
850
851struct symbol_block
852 {
853 struct symbol_block *next;
854 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
855 };
856
857struct symbol_block *symbol_block;
858int symbol_block_index;
859
860struct Lisp_Symbol *symbol_free_list;
861
862void
863init_symbol ()
864{
865 allocating_for_lisp = 1;
866 symbol_block = (struct symbol_block *) malloc (sizeof (struct symbol_block));
867 allocating_for_lisp = 0;
868 symbol_block->next = 0;
869 bzero ((char *) symbol_block->symbols, sizeof symbol_block->symbols);
870 symbol_block_index = 0;
871 symbol_free_list = 0;
872}
873
874DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
875 "Return a newly allocated uninterned symbol whose name is NAME.\n\
876Its value and function definition are void, and its property list is nil.")
877 (name)
878 Lisp_Object name;
879{
880 register Lisp_Object val;
881 register struct Lisp_Symbol *p;
882
883 CHECK_STRING (name, 0);
884
885 if (symbol_free_list)
886 {
887 XSETSYMBOL (val, symbol_free_list);
888 symbol_free_list = *(struct Lisp_Symbol **)&symbol_free_list->value;
889 }
890 else
891 {
892 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
893 {
894 struct symbol_block *new;
895 allocating_for_lisp = 1;
896 new = (struct symbol_block *) xmalloc (sizeof (struct symbol_block));
897 allocating_for_lisp = 0;
898 VALIDATE_LISP_STORAGE (new, sizeof *new);
899 new->next = symbol_block;
900 symbol_block = new;
901 symbol_block_index = 0;
902 }
903 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index++]);
904 }
905 p = XSYMBOL (val);
906 p->name = XSTRING (name);
907 p->obarray = Qnil;
908 p->plist = Qnil;
909 p->value = Qunbound;
910 p->function = Qunbound;
911 p->next = 0;
912 consing_since_gc += sizeof (struct Lisp_Symbol);
913 symbols_consed++;
914 return val;
915}
916\f
917/* Allocation of markers and other objects that share that structure.
918 Works like allocation of conses. */
919
920#define MARKER_BLOCK_SIZE \
921 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
922
923struct marker_block
924 {
925 struct marker_block *next;
926 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
927 };
928
929struct marker_block *marker_block;
930int marker_block_index;
931
932union Lisp_Misc *marker_free_list;
933
934void
935init_marker ()
936{
937 allocating_for_lisp = 1;
938 marker_block = (struct marker_block *) malloc (sizeof (struct marker_block));
939 allocating_for_lisp = 0;
940 marker_block->next = 0;
941 bzero ((char *) marker_block->markers, sizeof marker_block->markers);
942 marker_block_index = 0;
943 marker_free_list = 0;
944}
945
946/* Return a newly allocated Lisp_Misc object, with no substructure. */
947Lisp_Object
948allocate_misc ()
949{
950 Lisp_Object val;
951
952 if (marker_free_list)
953 {
954 XSETMISC (val, marker_free_list);
955 marker_free_list = marker_free_list->u_free.chain;
956 }
957 else
958 {
959 if (marker_block_index == MARKER_BLOCK_SIZE)
960 {
961 struct marker_block *new;
962 allocating_for_lisp = 1;
963 new = (struct marker_block *) xmalloc (sizeof (struct marker_block));
964 allocating_for_lisp = 0;
965 VALIDATE_LISP_STORAGE (new, sizeof *new);
966 new->next = marker_block;
967 marker_block = new;
968 marker_block_index = 0;
969 }
970 XSETMISC (val, &marker_block->markers[marker_block_index++]);
971 }
972 consing_since_gc += sizeof (union Lisp_Misc);
973 misc_objects_consed++;
974 return val;
975}
976
977DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
978 "Return a newly allocated marker which does not point at any place.")
979 ()
980{
981 register Lisp_Object val;
982 register struct Lisp_Marker *p;
983
984 val = allocate_misc ();
985 XMISCTYPE (val) = Lisp_Misc_Marker;
986 p = XMARKER (val);
987 p->buffer = 0;
988 p->bufpos = 0;
989 p->chain = Qnil;
990 p->insertion_type = 0;
991 return val;
992}
993\f
994/* Allocation of strings */
995
996/* Strings reside inside of string_blocks. The entire data of the string,
997 both the size and the contents, live in part of the `chars' component of a string_block.
998 The `pos' component is the index within `chars' of the first free byte.
999
1000 first_string_block points to the first string_block ever allocated.
1001 Each block points to the next one with its `next' field.
1002 The `prev' fields chain in reverse order.
1003 The last one allocated is the one currently being filled.
1004 current_string_block points to it.
1005
1006 The string_blocks that hold individual large strings
1007 go in a separate chain, started by large_string_blocks. */
1008
1009
1010/* String blocks contain this many useful bytes.
1011 8188 is power of 2, minus 4 for malloc overhead. */
1012#define STRING_BLOCK_SIZE (8188 - sizeof (struct string_block_head))
1013
1014/* A string bigger than this gets its own specially-made string block
1015 if it doesn't fit in the current one. */
1016#define STRING_BLOCK_OUTSIZE 1024
1017
1018struct string_block_head
1019 {
1020 struct string_block *next, *prev;
1021 EMACS_INT pos;
1022 };
1023
1024struct string_block
1025 {
1026 struct string_block *next, *prev;
1027 EMACS_INT pos;
1028 char chars[STRING_BLOCK_SIZE];
1029 };
1030
1031/* This points to the string block we are now allocating strings. */
1032
1033struct string_block *current_string_block;
1034
1035/* This points to the oldest string block, the one that starts the chain. */
1036
1037struct string_block *first_string_block;
1038
1039/* Last string block in chain of those made for individual large strings. */
1040
1041struct string_block *large_string_blocks;
1042
1043/* If SIZE is the length of a string, this returns how many bytes
1044 the string occupies in a string_block (including padding). */
1045
1046#define STRING_FULLSIZE(size) (((size) + sizeof (struct Lisp_String) + PAD) \
1047 & ~(PAD - 1))
1048#define PAD (sizeof (EMACS_INT))
1049
1050#if 0
1051#define STRING_FULLSIZE(SIZE) \
1052(((SIZE) + 2 * sizeof (EMACS_INT)) & ~(sizeof (EMACS_INT) - 1))
1053#endif
1054
1055void
1056init_strings ()
1057{
1058 allocating_for_lisp = 1;
1059 current_string_block = (struct string_block *) malloc (sizeof (struct string_block));
1060 allocating_for_lisp = 0;
1061 first_string_block = current_string_block;
1062 consing_since_gc += sizeof (struct string_block);
1063 current_string_block->next = 0;
1064 current_string_block->prev = 0;
1065 current_string_block->pos = 0;
1066 large_string_blocks = 0;
1067}
1068
1069DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
1070 "Return a newly created string of length LENGTH, with each element being INIT.\n\
1071Both LENGTH and INIT must be numbers.")
1072 (length, init)
1073 Lisp_Object length, init;
1074{
1075 register Lisp_Object val;
1076 register unsigned char *p, *end, c;
1077
1078 CHECK_NATNUM (length, 0);
1079 CHECK_NUMBER (init, 1);
1080 val = make_uninit_string (XFASTINT (length));
1081 c = XINT (init);
1082 p = XSTRING (val)->data;
1083 end = p + XSTRING (val)->size;
1084 while (p != end)
1085 *p++ = c;
1086 *p = 0;
1087 return val;
1088}
1089
1090DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
1091 "Return a newly created bitstring of length LENGTH, with INIT as each element.\n\
1092Both LENGTH and INIT must be numbers. INIT matters only in whether it is t or nil.")
1093 (length, init)
1094 Lisp_Object length, init;
1095{
1096 register Lisp_Object val;
1097 struct Lisp_Bool_Vector *p;
1098 int real_init, i;
1099 int length_in_chars, length_in_elts, bits_per_value;
1100
1101 CHECK_NATNUM (length, 0);
1102
1103 bits_per_value = sizeof (EMACS_INT) * BITS_PER_CHAR;
1104
1105 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
1106 length_in_chars = length_in_elts * sizeof (EMACS_INT);
1107
1108 val = Fmake_vector (make_number (length_in_elts), Qnil);
1109 p = XBOOL_VECTOR (val);
1110 /* Get rid of any bits that would cause confusion. */
1111 p->vector_size = 0;
1112 XSETBOOL_VECTOR (val, p);
1113 p->size = XFASTINT (length);
1114
1115 real_init = (NILP (init) ? 0 : -1);
1116 for (i = 0; i < length_in_chars ; i++)
1117 p->data[i] = real_init;
1118
1119 return val;
1120}
1121
1122Lisp_Object
1123make_string (contents, length)
1124 char *contents;
1125 int length;
1126{
1127 register Lisp_Object val;
1128 val = make_uninit_string (length);
1129 bcopy (contents, XSTRING (val)->data, length);
1130 return val;
1131}
1132
1133Lisp_Object
1134build_string (str)
1135 char *str;
1136{
1137 return make_string (str, strlen (str));
1138}
1139
1140Lisp_Object
1141make_uninit_string (length)
1142 int length;
1143{
1144 register Lisp_Object val;
1145 register int fullsize = STRING_FULLSIZE (length);
1146
1147 if (length < 0) abort ();
1148
1149 if (fullsize <= STRING_BLOCK_SIZE - current_string_block->pos)
1150 /* This string can fit in the current string block */
1151 {
1152 XSETSTRING (val,
1153 ((struct Lisp_String *)
1154 (current_string_block->chars + current_string_block->pos)));
1155 current_string_block->pos += fullsize;
1156 }
1157 else if (fullsize > STRING_BLOCK_OUTSIZE)
1158 /* This string gets its own string block */
1159 {
1160 register struct string_block *new;
1161 allocating_for_lisp = 1;
1162 new = (struct string_block *) xmalloc (sizeof (struct string_block_head) + fullsize);
1163 allocating_for_lisp = 0;
1164 VALIDATE_LISP_STORAGE (new, 0);
1165 consing_since_gc += sizeof (struct string_block_head) + fullsize;
1166 new->pos = fullsize;
1167 new->next = large_string_blocks;
1168 large_string_blocks = new;
1169 XSETSTRING (val,
1170 ((struct Lisp_String *)
1171 ((struct string_block_head *)new + 1)));
1172 }
1173 else
1174 /* Make a new current string block and start it off with this string */
1175 {
1176 register struct string_block *new;
1177 allocating_for_lisp = 1;
1178 new = (struct string_block *) xmalloc (sizeof (struct string_block));
1179 allocating_for_lisp = 0;
1180 VALIDATE_LISP_STORAGE (new, sizeof *new);
1181 consing_since_gc += sizeof (struct string_block);
1182 current_string_block->next = new;
1183 new->prev = current_string_block;
1184 new->next = 0;
1185 current_string_block = new;
1186 new->pos = fullsize;
1187 XSETSTRING (val,
1188 (struct Lisp_String *) current_string_block->chars);
1189 }
1190
1191 string_chars_consed += fullsize;
1192 XSTRING (val)->size = length;
1193 XSTRING (val)->data[length] = 0;
1194 INITIALIZE_INTERVAL (XSTRING (val), NULL_INTERVAL);
1195
1196 return val;
1197}
1198
1199/* Return a newly created vector or string with specified arguments as
1200 elements. If all the arguments are characters that can fit
1201 in a string of events, make a string; otherwise, make a vector.
1202
1203 Any number of arguments, even zero arguments, are allowed. */
1204
1205Lisp_Object
1206make_event_array (nargs, args)
1207 register int nargs;
1208 Lisp_Object *args;
1209{
1210 int i;
1211
1212 for (i = 0; i < nargs; i++)
1213 /* The things that fit in a string
1214 are characters that are in 0...127,
1215 after discarding the meta bit and all the bits above it. */
1216 if (!INTEGERP (args[i])
1217 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200)
1218 return Fvector (nargs, args);
1219
1220 /* Since the loop exited, we know that all the things in it are
1221 characters, so we can make a string. */
1222 {
1223 Lisp_Object result;
1224
1225 result = Fmake_string (nargs, make_number (0));
1226 for (i = 0; i < nargs; i++)
1227 {
1228 XSTRING (result)->data[i] = XINT (args[i]);
1229 /* Move the meta bit to the right place for a string char. */
1230 if (XINT (args[i]) & CHAR_META)
1231 XSTRING (result)->data[i] |= 0x80;
1232 }
1233
1234 return result;
1235 }
1236}
1237\f
1238/* Pure storage management. */
1239
1240/* Must get an error if pure storage is full,
1241 since if it cannot hold a large string
1242 it may be able to hold conses that point to that string;
1243 then the string is not protected from gc. */
1244
1245Lisp_Object
1246make_pure_string (data, length)
1247 char *data;
1248 int length;
1249{
1250 register Lisp_Object new;
1251 register int size = sizeof (EMACS_INT) + INTERVAL_PTR_SIZE + length + 1;
1252
1253 if (pureptr + size > PURESIZE)
1254 error ("Pure Lisp storage exhausted");
1255 XSETSTRING (new, PUREBEG + pureptr);
1256 XSTRING (new)->size = length;
1257 bcopy (data, XSTRING (new)->data, length);
1258 XSTRING (new)->data[length] = 0;
1259
1260 /* We must give strings in pure storage some kind of interval. So we
1261 give them a null one. */
1262#if defined (USE_TEXT_PROPERTIES)
1263 XSTRING (new)->intervals = NULL_INTERVAL;
1264#endif
1265 pureptr += (size + sizeof (EMACS_INT) - 1)
1266 / sizeof (EMACS_INT) * sizeof (EMACS_INT);
1267 return new;
1268}
1269
1270Lisp_Object
1271pure_cons (car, cdr)
1272 Lisp_Object car, cdr;
1273{
1274 register Lisp_Object new;
1275
1276 if (pureptr + sizeof (struct Lisp_Cons) > PURESIZE)
1277 error ("Pure Lisp storage exhausted");
1278 XSETCONS (new, PUREBEG + pureptr);
1279 pureptr += sizeof (struct Lisp_Cons);
1280 XCONS (new)->car = Fpurecopy (car);
1281 XCONS (new)->cdr = Fpurecopy (cdr);
1282 return new;
1283}
1284
1285#ifdef LISP_FLOAT_TYPE
1286
1287Lisp_Object
1288make_pure_float (num)
1289 double num;
1290{
1291 register Lisp_Object new;
1292
1293 /* Make sure that PUREBEG + pureptr is aligned on at least a sizeof
1294 (double) boundary. Some architectures (like the sparc) require
1295 this, and I suspect that floats are rare enough that it's no
1296 tragedy for those that do. */
1297 {
1298 int alignment;
1299 char *p = PUREBEG + pureptr;
1300
1301#ifdef __GNUC__
1302#if __GNUC__ >= 2
1303 alignment = __alignof (struct Lisp_Float);
1304#else
1305 alignment = sizeof (struct Lisp_Float);
1306#endif
1307#else
1308 alignment = sizeof (struct Lisp_Float);
1309#endif
1310 p = (char *) (((unsigned long) p + alignment - 1) & - alignment);
1311 pureptr = p - PUREBEG;
1312 }
1313
1314 if (pureptr + sizeof (struct Lisp_Float) > PURESIZE)
1315 error ("Pure Lisp storage exhausted");
1316 XSETFLOAT (new, PUREBEG + pureptr);
1317 pureptr += sizeof (struct Lisp_Float);
1318 XFLOAT (new)->data = num;
1319 XSETFASTINT (XFLOAT (new)->type, 0); /* bug chasing -wsr */
1320 return new;
1321}
1322
1323#endif /* LISP_FLOAT_TYPE */
1324
1325Lisp_Object
1326make_pure_vector (len)
1327 EMACS_INT len;
1328{
1329 register Lisp_Object new;
1330 register EMACS_INT size = sizeof (struct Lisp_Vector) + (len - 1) * sizeof (Lisp_Object);
1331
1332 if (pureptr + size > PURESIZE)
1333 error ("Pure Lisp storage exhausted");
1334
1335 XSETVECTOR (new, PUREBEG + pureptr);
1336 pureptr += size;
1337 XVECTOR (new)->size = len;
1338 return new;
1339}
1340
1341DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
1342 "Make a copy of OBJECT in pure storage.\n\
1343Recursively copies contents of vectors and cons cells.\n\
1344Does not copy symbols.")
1345 (obj)
1346 register Lisp_Object obj;
1347{
1348 if (NILP (Vpurify_flag))
1349 return obj;
1350
1351 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE)
1352 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
1353 return obj;
1354
1355 if (CONSP (obj))
1356 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr);
1357#ifdef LISP_FLOAT_TYPE
1358 else if (FLOATP (obj))
1359 return make_pure_float (XFLOAT (obj)->data);
1360#endif /* LISP_FLOAT_TYPE */
1361 else if (STRINGP (obj))
1362 return make_pure_string (XSTRING (obj)->data, XSTRING (obj)->size);
1363 else if (COMPILEDP (obj) || VECTORP (obj))
1364 {
1365 register struct Lisp_Vector *vec;
1366 register int i, size;
1367
1368 size = XVECTOR (obj)->size;
1369 if (size & PSEUDOVECTOR_FLAG)
1370 size &= PSEUDOVECTOR_SIZE_MASK;
1371 vec = XVECTOR (make_pure_vector ((EMACS_INT) size));
1372 for (i = 0; i < size; i++)
1373 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]);
1374 if (COMPILEDP (obj))
1375 XSETCOMPILED (obj, vec);
1376 else
1377 XSETVECTOR (obj, vec);
1378 return obj;
1379 }
1380 else if (MARKERP (obj))
1381 error ("Attempt to copy a marker to pure storage");
1382 else
1383 return obj;
1384}
1385\f
1386/* Recording what needs to be marked for gc. */
1387
1388struct gcpro *gcprolist;
1389
1390#define NSTATICS 768
1391
1392Lisp_Object *staticvec[NSTATICS] = {0};
1393
1394int staticidx = 0;
1395
1396/* Put an entry in staticvec, pointing at the variable whose address is given */
1397
1398void
1399staticpro (varaddress)
1400 Lisp_Object *varaddress;
1401{
1402 staticvec[staticidx++] = varaddress;
1403 if (staticidx >= NSTATICS)
1404 abort ();
1405}
1406
1407struct catchtag
1408 {
1409 Lisp_Object tag;
1410 Lisp_Object val;
1411 struct catchtag *next;
1412/* jmp_buf jmp; /* We don't need this for GC purposes */
1413 };
1414
1415struct backtrace
1416 {
1417 struct backtrace *next;
1418 Lisp_Object *function;
1419 Lisp_Object *args; /* Points to vector of args. */
1420 int nargs; /* length of vector */
1421 /* if nargs is UNEVALLED, args points to slot holding list of unevalled args */
1422 char evalargs;
1423 };
1424\f
1425/* Garbage collection! */
1426
1427int total_conses, total_markers, total_symbols, total_string_size, total_vector_size;
1428int total_free_conses, total_free_markers, total_free_symbols;
1429#ifdef LISP_FLOAT_TYPE
1430int total_free_floats, total_floats;
1431#endif /* LISP_FLOAT_TYPE */
1432
1433/* Temporarily prevent garbage collection. */
1434
1435int
1436inhibit_garbage_collection ()
1437{
1438 int count = specpdl_ptr - specpdl;
1439 Lisp_Object number;
1440 int nbits = min (VALBITS, BITS_PER_INT);
1441
1442 XSETINT (number, ((EMACS_INT) 1 << (nbits - 1)) - 1);
1443
1444 specbind (Qgc_cons_threshold, number);
1445
1446 return count;
1447}
1448
1449DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
1450 "Reclaim storage for Lisp objects no longer needed.\n\
1451Returns info on amount of space in use:\n\
1452 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)\n\
1453 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS\n\
1454 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS))\n\
1455Garbage collection happens automatically if you cons more than\n\
1456`gc-cons-threshold' bytes of Lisp data since previous garbage collection.")
1457 ()
1458{
1459 register struct gcpro *tail;
1460 register struct specbinding *bind;
1461 struct catchtag *catch;
1462 struct handler *handler;
1463 register struct backtrace *backlist;
1464 register Lisp_Object tem;
1465 char *omessage = echo_area_glyphs;
1466 int omessage_length = echo_area_glyphs_length;
1467 char stack_top_variable;
1468 register int i;
1469
1470 /* In case user calls debug_print during GC,
1471 don't let that cause a recursive GC. */
1472 consing_since_gc = 0;
1473
1474 /* Save a copy of the contents of the stack, for debugging. */
1475#if MAX_SAVE_STACK > 0
1476 if (NILP (Vpurify_flag))
1477 {
1478 i = &stack_top_variable - stack_bottom;
1479 if (i < 0) i = -i;
1480 if (i < MAX_SAVE_STACK)
1481 {
1482 if (stack_copy == 0)
1483 stack_copy = (char *) xmalloc (stack_copy_size = i);
1484 else if (stack_copy_size < i)
1485 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i));
1486 if (stack_copy)
1487 {
1488 if ((EMACS_INT) (&stack_top_variable - stack_bottom) > 0)
1489 bcopy (stack_bottom, stack_copy, i);
1490 else
1491 bcopy (&stack_top_variable, stack_copy, i);
1492 }
1493 }
1494 }
1495#endif /* MAX_SAVE_STACK > 0 */
1496
1497 if (garbage_collection_messages)
1498 message1_nolog ("Garbage collecting...");
1499
1500 /* Don't keep command history around forever */
1501 tem = Fnthcdr (make_number (30), Vcommand_history);
1502 if (CONSP (tem))
1503 XCONS (tem)->cdr = Qnil;
1504
1505 /* Likewise for undo information. */
1506 {
1507 register struct buffer *nextb = all_buffers;
1508
1509 while (nextb)
1510 {
1511 /* If a buffer's undo list is Qt, that means that undo is
1512 turned off in that buffer. Calling truncate_undo_list on
1513 Qt tends to return NULL, which effectively turns undo back on.
1514 So don't call truncate_undo_list if undo_list is Qt. */
1515 if (! EQ (nextb->undo_list, Qt))
1516 nextb->undo_list
1517 = truncate_undo_list (nextb->undo_list, undo_limit,
1518 undo_strong_limit);
1519 nextb = nextb->next;
1520 }
1521 }
1522
1523 gc_in_progress = 1;
1524
1525 /* clear_marks (); */
1526
1527 /* In each "large string", set the MARKBIT of the size field.
1528 That enables mark_object to recognize them. */
1529 {
1530 register struct string_block *b;
1531 for (b = large_string_blocks; b; b = b->next)
1532 ((struct Lisp_String *)(&b->chars[0]))->size |= MARKBIT;
1533 }
1534
1535 /* Mark all the special slots that serve as the roots of accessibility.
1536
1537 Usually the special slots to mark are contained in particular structures.
1538 Then we know no slot is marked twice because the structures don't overlap.
1539 In some cases, the structures point to the slots to be marked.
1540 For these, we use MARKBIT to avoid double marking of the slot. */
1541
1542 for (i = 0; i < staticidx; i++)
1543 mark_object (staticvec[i]);
1544 for (tail = gcprolist; tail; tail = tail->next)
1545 for (i = 0; i < tail->nvars; i++)
1546 if (!XMARKBIT (tail->var[i]))
1547 {
1548 mark_object (&tail->var[i]);
1549 XMARK (tail->var[i]);
1550 }
1551 for (bind = specpdl; bind != specpdl_ptr; bind++)
1552 {
1553 mark_object (&bind->symbol);
1554 mark_object (&bind->old_value);
1555 }
1556 for (catch = catchlist; catch; catch = catch->next)
1557 {
1558 mark_object (&catch->tag);
1559 mark_object (&catch->val);
1560 }
1561 for (handler = handlerlist; handler; handler = handler->next)
1562 {
1563 mark_object (&handler->handler);
1564 mark_object (&handler->var);
1565 }
1566 for (backlist = backtrace_list; backlist; backlist = backlist->next)
1567 {
1568 if (!XMARKBIT (*backlist->function))
1569 {
1570 mark_object (backlist->function);
1571 XMARK (*backlist->function);
1572 }
1573 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
1574 i = 0;
1575 else
1576 i = backlist->nargs - 1;
1577 for (; i >= 0; i--)
1578 if (!XMARKBIT (backlist->args[i]))
1579 {
1580 mark_object (&backlist->args[i]);
1581 XMARK (backlist->args[i]);
1582 }
1583 }
1584 mark_kboards ();
1585
1586 gc_sweep ();
1587
1588 /* Clear the mark bits that we set in certain root slots. */
1589
1590 for (tail = gcprolist; tail; tail = tail->next)
1591 for (i = 0; i < tail->nvars; i++)
1592 XUNMARK (tail->var[i]);
1593 for (backlist = backtrace_list; backlist; backlist = backlist->next)
1594 {
1595 XUNMARK (*backlist->function);
1596 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
1597 i = 0;
1598 else
1599 i = backlist->nargs - 1;
1600 for (; i >= 0; i--)
1601 XUNMARK (backlist->args[i]);
1602 }
1603 XUNMARK (buffer_defaults.name);
1604 XUNMARK (buffer_local_symbols.name);
1605
1606 /* clear_marks (); */
1607 gc_in_progress = 0;
1608
1609 consing_since_gc = 0;
1610 if (gc_cons_threshold < 10000)
1611 gc_cons_threshold = 10000;
1612
1613 if (garbage_collection_messages)
1614 {
1615 if (omessage || minibuf_level > 0)
1616 message2_nolog (omessage, omessage_length);
1617 else
1618 message1_nolog ("Garbage collecting...done");
1619 }
1620
1621 return Fcons (Fcons (make_number (total_conses),
1622 make_number (total_free_conses)),
1623 Fcons (Fcons (make_number (total_symbols),
1624 make_number (total_free_symbols)),
1625 Fcons (Fcons (make_number (total_markers),
1626 make_number (total_free_markers)),
1627 Fcons (make_number (total_string_size),
1628 Fcons (make_number (total_vector_size),
1629 Fcons (Fcons
1630#ifdef LISP_FLOAT_TYPE
1631 (make_number (total_floats),
1632 make_number (total_free_floats)),
1633#else /* not LISP_FLOAT_TYPE */
1634 (make_number (0), make_number (0)),
1635#endif /* not LISP_FLOAT_TYPE */
1636 Fcons (Fcons
1637#ifdef USE_TEXT_PROPERTIES
1638 (make_number (total_intervals),
1639 make_number (total_free_intervals)),
1640#else /* not USE_TEXT_PROPERTIES */
1641 (make_number (0), make_number (0)),
1642#endif /* not USE_TEXT_PROPERTIES */
1643 Qnil)))))));
1644}
1645\f
1646#if 0
1647static void
1648clear_marks ()
1649{
1650 /* Clear marks on all conses */
1651 {
1652 register struct cons_block *cblk;
1653 register int lim = cons_block_index;
1654
1655 for (cblk = cons_block; cblk; cblk = cblk->next)
1656 {
1657 register int i;
1658 for (i = 0; i < lim; i++)
1659 XUNMARK (cblk->conses[i].car);
1660 lim = CONS_BLOCK_SIZE;
1661 }
1662 }
1663 /* Clear marks on all symbols */
1664 {
1665 register struct symbol_block *sblk;
1666 register int lim = symbol_block_index;
1667
1668 for (sblk = symbol_block; sblk; sblk = sblk->next)
1669 {
1670 register int i;
1671 for (i = 0; i < lim; i++)
1672 {
1673 XUNMARK (sblk->symbols[i].plist);
1674 }
1675 lim = SYMBOL_BLOCK_SIZE;
1676 }
1677 }
1678 /* Clear marks on all markers */
1679 {
1680 register struct marker_block *sblk;
1681 register int lim = marker_block_index;
1682
1683 for (sblk = marker_block; sblk; sblk = sblk->next)
1684 {
1685 register int i;
1686 for (i = 0; i < lim; i++)
1687 if (sblk->markers[i].u_marker.type == Lisp_Misc_Marker)
1688 XUNMARK (sblk->markers[i].u_marker.chain);
1689 lim = MARKER_BLOCK_SIZE;
1690 }
1691 }
1692 /* Clear mark bits on all buffers */
1693 {
1694 register struct buffer *nextb = all_buffers;
1695
1696 while (nextb)
1697 {
1698 XUNMARK (nextb->name);
1699 nextb = nextb->next;
1700 }
1701 }
1702}
1703#endif
1704\f
1705/* Mark reference to a Lisp_Object.
1706 If the object referred to has not been seen yet, recursively mark
1707 all the references contained in it.
1708
1709 If the object referenced is a short string, the referencing slot
1710 is threaded into a chain of such slots, pointed to from
1711 the `size' field of the string. The actual string size
1712 lives in the last slot in the chain. We recognize the end
1713 because it is < (unsigned) STRING_BLOCK_SIZE. */
1714
1715#define LAST_MARKED_SIZE 500
1716Lisp_Object *last_marked[LAST_MARKED_SIZE];
1717int last_marked_index;
1718
1719static void
1720mark_object (argptr)
1721 Lisp_Object *argptr;
1722{
1723 Lisp_Object *objptr = argptr;
1724 register Lisp_Object obj;
1725
1726 loop:
1727 obj = *objptr;
1728 loop2:
1729 XUNMARK (obj);
1730
1731 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE)
1732 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
1733 return;
1734
1735 last_marked[last_marked_index++] = objptr;
1736 if (last_marked_index == LAST_MARKED_SIZE)
1737 last_marked_index = 0;
1738
1739 switch (SWITCH_ENUM_CAST (XGCTYPE (obj)))
1740 {
1741 case Lisp_String:
1742 {
1743 register struct Lisp_String *ptr = XSTRING (obj);
1744
1745 MARK_INTERVAL_TREE (ptr->intervals);
1746 if (ptr->size & MARKBIT)
1747 /* A large string. Just set ARRAY_MARK_FLAG. */
1748 ptr->size |= ARRAY_MARK_FLAG;
1749 else
1750 {
1751 /* A small string. Put this reference
1752 into the chain of references to it.
1753 If the address includes MARKBIT, put that bit elsewhere
1754 when we store OBJPTR into the size field. */
1755
1756 if (XMARKBIT (*objptr))
1757 {
1758 XSETFASTINT (*objptr, ptr->size);
1759 XMARK (*objptr);
1760 }
1761 else
1762 XSETFASTINT (*objptr, ptr->size);
1763
1764 if ((EMACS_INT) objptr & DONT_COPY_FLAG)
1765 abort ();
1766 ptr->size = (EMACS_INT) objptr;
1767 if (ptr->size & MARKBIT)
1768 ptr->size ^= MARKBIT | DONT_COPY_FLAG;
1769 }
1770 }
1771 break;
1772
1773 case Lisp_Vectorlike:
1774 if (GC_BUFFERP (obj))
1775 {
1776 if (!XMARKBIT (XBUFFER (obj)->name))
1777 mark_buffer (obj);
1778 }
1779 else if (GC_SUBRP (obj))
1780 break;
1781 else if (GC_COMPILEDP (obj))
1782 /* We could treat this just like a vector, but it is better
1783 to save the COMPILED_CONSTANTS element for last and avoid recursion
1784 there. */
1785 {
1786 register struct Lisp_Vector *ptr = XVECTOR (obj);
1787 register EMACS_INT size = ptr->size;
1788 /* See comment above under Lisp_Vector. */
1789 struct Lisp_Vector *volatile ptr1 = ptr;
1790 register int i;
1791
1792 if (size & ARRAY_MARK_FLAG)
1793 break; /* Already marked */
1794 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1795 size &= PSEUDOVECTOR_SIZE_MASK;
1796 for (i = 0; i < size; i++) /* and then mark its elements */
1797 {
1798 if (i != COMPILED_CONSTANTS)
1799 mark_object (&ptr1->contents[i]);
1800 }
1801 /* This cast should be unnecessary, but some Mips compiler complains
1802 (MIPS-ABI + SysVR4, DC/OSx, etc). */
1803 objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS];
1804 goto loop;
1805 }
1806 else if (GC_FRAMEP (obj))
1807 {
1808 /* See comment above under Lisp_Vector for why this is volatile. */
1809 register struct frame *volatile ptr = XFRAME (obj);
1810 register EMACS_INT size = ptr->size;
1811
1812 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1813 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1814
1815 mark_object (&ptr->name);
1816 mark_object (&ptr->icon_name);
1817 mark_object (&ptr->title);
1818 mark_object (&ptr->focus_frame);
1819 mark_object (&ptr->selected_window);
1820 mark_object (&ptr->minibuffer_window);
1821 mark_object (&ptr->param_alist);
1822 mark_object (&ptr->scroll_bars);
1823 mark_object (&ptr->condemned_scroll_bars);
1824 mark_object (&ptr->menu_bar_items);
1825 mark_object (&ptr->face_alist);
1826 mark_object (&ptr->menu_bar_vector);
1827 mark_object (&ptr->buffer_predicate);
1828 }
1829 else if (GC_BOOL_VECTOR_P (obj))
1830 {
1831 register struct Lisp_Vector *ptr = XVECTOR (obj);
1832
1833 if (ptr->size & ARRAY_MARK_FLAG)
1834 break; /* Already marked */
1835 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1836 }
1837 else
1838 {
1839 register struct Lisp_Vector *ptr = XVECTOR (obj);
1840 register EMACS_INT size = ptr->size;
1841 /* The reason we use ptr1 is to avoid an apparent hardware bug
1842 that happens occasionally on the FSF's HP 300s.
1843 The bug is that a2 gets clobbered by recursive calls to mark_object.
1844 The clobberage seems to happen during function entry,
1845 perhaps in the moveml instruction.
1846 Yes, this is a crock, but we have to do it. */
1847 struct Lisp_Vector *volatile ptr1 = ptr;
1848 register int i;
1849
1850 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1851 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1852 if (size & PSEUDOVECTOR_FLAG)
1853 size &= PSEUDOVECTOR_SIZE_MASK;
1854 for (i = 0; i < size; i++) /* and then mark its elements */
1855 mark_object (&ptr1->contents[i]);
1856 }
1857 break;
1858
1859 case Lisp_Symbol:
1860 {
1861 /* See comment above under Lisp_Vector for why this is volatile. */
1862 register struct Lisp_Symbol *volatile ptr = XSYMBOL (obj);
1863 struct Lisp_Symbol *ptrx;
1864
1865 if (XMARKBIT (ptr->plist)) break;
1866 XMARK (ptr->plist);
1867 mark_object ((Lisp_Object *) &ptr->value);
1868 mark_object (&ptr->function);
1869 mark_object (&ptr->plist);
1870 XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String);
1871 mark_object (&ptr->name);
1872 ptr = ptr->next;
1873 if (ptr)
1874 {
1875 /* For the benefit of the last_marked log. */
1876 objptr = (Lisp_Object *)&XSYMBOL (obj)->next;
1877 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
1878 XSETSYMBOL (obj, ptrx);
1879 /* We can't goto loop here because *objptr doesn't contain an
1880 actual Lisp_Object with valid datatype field. */
1881 goto loop2;
1882 }
1883 }
1884 break;
1885
1886 case Lisp_Misc:
1887 switch (XMISCTYPE (obj))
1888 {
1889 case Lisp_Misc_Marker:
1890 XMARK (XMARKER (obj)->chain);
1891 /* DO NOT mark thru the marker's chain.
1892 The buffer's markers chain does not preserve markers from gc;
1893 instead, markers are removed from the chain when freed by gc. */
1894 break;
1895
1896 case Lisp_Misc_Buffer_Local_Value:
1897 case Lisp_Misc_Some_Buffer_Local_Value:
1898 {
1899 register struct Lisp_Buffer_Local_Value *ptr
1900 = XBUFFER_LOCAL_VALUE (obj);
1901 if (XMARKBIT (ptr->car)) break;
1902 XMARK (ptr->car);
1903 /* If the cdr is nil, avoid recursion for the car. */
1904 if (EQ (ptr->cdr, Qnil))
1905 {
1906 objptr = &ptr->car;
1907 goto loop;
1908 }
1909 mark_object (&ptr->car);
1910 /* See comment above under Lisp_Vector for why not use ptr here. */
1911 objptr = &XBUFFER_LOCAL_VALUE (obj)->cdr;
1912 goto loop;
1913 }
1914
1915 case Lisp_Misc_Intfwd:
1916 case Lisp_Misc_Boolfwd:
1917 case Lisp_Misc_Objfwd:
1918 case Lisp_Misc_Buffer_Objfwd:
1919 case Lisp_Misc_Kboard_Objfwd:
1920 /* Don't bother with Lisp_Buffer_Objfwd,
1921 since all markable slots in current buffer marked anyway. */
1922 /* Don't need to do Lisp_Objfwd, since the places they point
1923 are protected with staticpro. */
1924 break;
1925
1926 case Lisp_Misc_Overlay:
1927 {
1928 struct Lisp_Overlay *ptr = XOVERLAY (obj);
1929 if (!XMARKBIT (ptr->plist))
1930 {
1931 XMARK (ptr->plist);
1932 mark_object (&ptr->start);
1933 mark_object (&ptr->end);
1934 objptr = &ptr->plist;
1935 goto loop;
1936 }
1937 }
1938 break;
1939
1940 default:
1941 abort ();
1942 }
1943 break;
1944
1945 case Lisp_Cons:
1946 {
1947 register struct Lisp_Cons *ptr = XCONS (obj);
1948 if (XMARKBIT (ptr->car)) break;
1949 XMARK (ptr->car);
1950 /* If the cdr is nil, avoid recursion for the car. */
1951 if (EQ (ptr->cdr, Qnil))
1952 {
1953 objptr = &ptr->car;
1954 goto loop;
1955 }
1956 mark_object (&ptr->car);
1957 /* See comment above under Lisp_Vector for why not use ptr here. */
1958 objptr = &XCONS (obj)->cdr;
1959 goto loop;
1960 }
1961
1962#ifdef LISP_FLOAT_TYPE
1963 case Lisp_Float:
1964 XMARK (XFLOAT (obj)->type);
1965 break;
1966#endif /* LISP_FLOAT_TYPE */
1967
1968 case Lisp_Int:
1969 break;
1970
1971 default:
1972 abort ();
1973 }
1974}
1975
1976/* Mark the pointers in a buffer structure. */
1977
1978static void
1979mark_buffer (buf)
1980 Lisp_Object buf;
1981{
1982 register struct buffer *buffer = XBUFFER (buf);
1983 register Lisp_Object *ptr;
1984 Lisp_Object base_buffer;
1985
1986 /* This is the buffer's markbit */
1987 mark_object (&buffer->name);
1988 XMARK (buffer->name);
1989
1990 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
1991
1992#if 0
1993 mark_object (buffer->syntax_table);
1994
1995 /* Mark the various string-pointers in the buffer object.
1996 Since the strings may be relocated, we must mark them
1997 in their actual slots. So gc_sweep must convert each slot
1998 back to an ordinary C pointer. */
1999 XSETSTRING (*(Lisp_Object *)&buffer->upcase_table, buffer->upcase_table);
2000 mark_object ((Lisp_Object *)&buffer->upcase_table);
2001 XSETSTRING (*(Lisp_Object *)&buffer->downcase_table, buffer->downcase_table);
2002 mark_object ((Lisp_Object *)&buffer->downcase_table);
2003
2004 XSETSTRING (*(Lisp_Object *)&buffer->sort_table, buffer->sort_table);
2005 mark_object ((Lisp_Object *)&buffer->sort_table);
2006 XSETSTRING (*(Lisp_Object *)&buffer->folding_sort_table, buffer->folding_sort_table);
2007 mark_object ((Lisp_Object *)&buffer->folding_sort_table);
2008#endif
2009
2010 for (ptr = &buffer->name + 1;
2011 (char *)ptr < (char *)buffer + sizeof (struct buffer);
2012 ptr++)
2013 mark_object (ptr);
2014
2015 /* If this is an indirect buffer, mark its base buffer. */
2016 if (buffer->base_buffer && !XMARKBIT (buffer->base_buffer->name))
2017 {
2018 XSETBUFFER (base_buffer, buffer->base_buffer);
2019 mark_buffer (base_buffer);
2020 }
2021}
2022
2023
2024/* Mark the pointers in the kboard objects. */
2025
2026static void
2027mark_kboards ()
2028{
2029 KBOARD *kb;
2030 Lisp_Object *p;
2031 for (kb = all_kboards; kb; kb = kb->next_kboard)
2032 {
2033 if (kb->kbd_macro_buffer)
2034 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
2035 mark_object (p);
2036 mark_object (&kb->Vprefix_arg);
2037 mark_object (&kb->kbd_queue);
2038 mark_object (&kb->Vlast_kbd_macro);
2039 mark_object (&kb->Vsystem_key_alist);
2040 mark_object (&kb->system_key_syms);
2041 }
2042}
2043\f
2044/* Sweep: find all structures not marked, and free them. */
2045
2046static void
2047gc_sweep ()
2048{
2049 total_string_size = 0;
2050 compact_strings ();
2051
2052 /* Put all unmarked conses on free list */
2053 {
2054 register struct cons_block *cblk;
2055 register int lim = cons_block_index;
2056 register int num_free = 0, num_used = 0;
2057
2058 cons_free_list = 0;
2059
2060 for (cblk = cons_block; cblk; cblk = cblk->next)
2061 {
2062 register int i;
2063 for (i = 0; i < lim; i++)
2064 if (!XMARKBIT (cblk->conses[i].car))
2065 {
2066 num_free++;
2067 *(struct Lisp_Cons **)&cblk->conses[i].car = cons_free_list;
2068 cons_free_list = &cblk->conses[i];
2069 }
2070 else
2071 {
2072 num_used++;
2073 XUNMARK (cblk->conses[i].car);
2074 }
2075 lim = CONS_BLOCK_SIZE;
2076 }
2077 total_conses = num_used;
2078 total_free_conses = num_free;
2079 }
2080
2081#ifdef LISP_FLOAT_TYPE
2082 /* Put all unmarked floats on free list */
2083 {
2084 register struct float_block *fblk;
2085 register int lim = float_block_index;
2086 register int num_free = 0, num_used = 0;
2087
2088 float_free_list = 0;
2089
2090 for (fblk = float_block; fblk; fblk = fblk->next)
2091 {
2092 register int i;
2093 for (i = 0; i < lim; i++)
2094 if (!XMARKBIT (fblk->floats[i].type))
2095 {
2096 num_free++;
2097 *(struct Lisp_Float **)&fblk->floats[i].type = float_free_list;
2098 float_free_list = &fblk->floats[i];
2099 }
2100 else
2101 {
2102 num_used++;
2103 XUNMARK (fblk->floats[i].type);
2104 }
2105 lim = FLOAT_BLOCK_SIZE;
2106 }
2107 total_floats = num_used;
2108 total_free_floats = num_free;
2109 }
2110#endif /* LISP_FLOAT_TYPE */
2111
2112#ifdef USE_TEXT_PROPERTIES
2113 /* Put all unmarked intervals on free list */
2114 {
2115 register struct interval_block *iblk;
2116 register int lim = interval_block_index;
2117 register int num_free = 0, num_used = 0;
2118
2119 interval_free_list = 0;
2120
2121 for (iblk = interval_block; iblk; iblk = iblk->next)
2122 {
2123 register int i;
2124
2125 for (i = 0; i < lim; i++)
2126 {
2127 if (! XMARKBIT (iblk->intervals[i].plist))
2128 {
2129 iblk->intervals[i].parent = interval_free_list;
2130 interval_free_list = &iblk->intervals[i];
2131 num_free++;
2132 }
2133 else
2134 {
2135 num_used++;
2136 XUNMARK (iblk->intervals[i].plist);
2137 }
2138 }
2139 lim = INTERVAL_BLOCK_SIZE;
2140 }
2141 total_intervals = num_used;
2142 total_free_intervals = num_free;
2143 }
2144#endif /* USE_TEXT_PROPERTIES */
2145
2146 /* Put all unmarked symbols on free list */
2147 {
2148 register struct symbol_block *sblk;
2149 register int lim = symbol_block_index;
2150 register int num_free = 0, num_used = 0;
2151
2152 symbol_free_list = 0;
2153
2154 for (sblk = symbol_block; sblk; sblk = sblk->next)
2155 {
2156 register int i;
2157 for (i = 0; i < lim; i++)
2158 if (!XMARKBIT (sblk->symbols[i].plist))
2159 {
2160 *(struct Lisp_Symbol **)&sblk->symbols[i].value = symbol_free_list;
2161 symbol_free_list = &sblk->symbols[i];
2162 num_free++;
2163 }
2164 else
2165 {
2166 num_used++;
2167 sblk->symbols[i].name
2168 = XSTRING (*(Lisp_Object *) &sblk->symbols[i].name);
2169 XUNMARK (sblk->symbols[i].plist);
2170 }
2171 lim = SYMBOL_BLOCK_SIZE;
2172 }
2173 total_symbols = num_used;
2174 total_free_symbols = num_free;
2175 }
2176
2177#ifndef standalone
2178 /* Put all unmarked markers on free list.
2179 Unchain each one first from the buffer it points into,
2180 but only if it's a real marker. */
2181 {
2182 register struct marker_block *mblk;
2183 register int lim = marker_block_index;
2184 register int num_free = 0, num_used = 0;
2185
2186 marker_free_list = 0;
2187
2188 for (mblk = marker_block; mblk; mblk = mblk->next)
2189 {
2190 register int i;
2191 EMACS_INT already_free = -1;
2192
2193 for (i = 0; i < lim; i++)
2194 {
2195 Lisp_Object *markword;
2196 switch (mblk->markers[i].u_marker.type)
2197 {
2198 case Lisp_Misc_Marker:
2199 markword = &mblk->markers[i].u_marker.chain;
2200 break;
2201 case Lisp_Misc_Buffer_Local_Value:
2202 case Lisp_Misc_Some_Buffer_Local_Value:
2203 markword = &mblk->markers[i].u_buffer_local_value.car;
2204 break;
2205 case Lisp_Misc_Overlay:
2206 markword = &mblk->markers[i].u_overlay.plist;
2207 break;
2208 case Lisp_Misc_Free:
2209 /* If the object was already free, keep it
2210 on the free list. */
2211 markword = &already_free;
2212 break;
2213 default:
2214 markword = 0;
2215 break;
2216 }
2217 if (markword && !XMARKBIT (*markword))
2218 {
2219 Lisp_Object tem;
2220 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
2221 {
2222 /* tem1 avoids Sun compiler bug */
2223 struct Lisp_Marker *tem1 = &mblk->markers[i].u_marker;
2224 XSETMARKER (tem, tem1);
2225 unchain_marker (tem);
2226 }
2227 /* Set the type of the freed object to Lisp_Misc_Free.
2228 We could leave the type alone, since nobody checks it,
2229 but this might catch bugs faster. */
2230 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
2231 mblk->markers[i].u_free.chain = marker_free_list;
2232 marker_free_list = &mblk->markers[i];
2233 num_free++;
2234 }
2235 else
2236 {
2237 num_used++;
2238 if (markword)
2239 XUNMARK (*markword);
2240 }
2241 }
2242 lim = MARKER_BLOCK_SIZE;
2243 }
2244
2245 total_markers = num_used;
2246 total_free_markers = num_free;
2247 }
2248
2249 /* Free all unmarked buffers */
2250 {
2251 register struct buffer *buffer = all_buffers, *prev = 0, *next;
2252
2253 while (buffer)
2254 if (!XMARKBIT (buffer->name))
2255 {
2256 if (prev)
2257 prev->next = buffer->next;
2258 else
2259 all_buffers = buffer->next;
2260 next = buffer->next;
2261 xfree (buffer);
2262 buffer = next;
2263 }
2264 else
2265 {
2266 XUNMARK (buffer->name);
2267 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
2268
2269#if 0
2270 /* Each `struct Lisp_String *' was turned into a Lisp_Object
2271 for purposes of marking and relocation.
2272 Turn them back into C pointers now. */
2273 buffer->upcase_table
2274 = XSTRING (*(Lisp_Object *)&buffer->upcase_table);
2275 buffer->downcase_table
2276 = XSTRING (*(Lisp_Object *)&buffer->downcase_table);
2277 buffer->sort_table
2278 = XSTRING (*(Lisp_Object *)&buffer->sort_table);
2279 buffer->folding_sort_table
2280 = XSTRING (*(Lisp_Object *)&buffer->folding_sort_table);
2281#endif
2282
2283 prev = buffer, buffer = buffer->next;
2284 }
2285 }
2286
2287#endif /* standalone */
2288
2289 /* Free all unmarked vectors */
2290 {
2291 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
2292 total_vector_size = 0;
2293
2294 while (vector)
2295 if (!(vector->size & ARRAY_MARK_FLAG))
2296 {
2297 if (prev)
2298 prev->next = vector->next;
2299 else
2300 all_vectors = vector->next;
2301 next = vector->next;
2302 xfree (vector);
2303 vector = next;
2304 }
2305 else
2306 {
2307 vector->size &= ~ARRAY_MARK_FLAG;
2308 if (vector->size & PSEUDOVECTOR_FLAG)
2309 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
2310 else
2311 total_vector_size += vector->size;
2312 prev = vector, vector = vector->next;
2313 }
2314 }
2315
2316 /* Free all "large strings" not marked with ARRAY_MARK_FLAG. */
2317 {
2318 register struct string_block *sb = large_string_blocks, *prev = 0, *next;
2319 struct Lisp_String *s;
2320
2321 while (sb)
2322 {
2323 s = (struct Lisp_String *) &sb->chars[0];
2324 if (s->size & ARRAY_MARK_FLAG)
2325 {
2326 ((struct Lisp_String *)(&sb->chars[0]))->size
2327 &= ~ARRAY_MARK_FLAG & ~MARKBIT;
2328 UNMARK_BALANCE_INTERVALS (s->intervals);
2329 total_string_size += ((struct Lisp_String *)(&sb->chars[0]))->size;
2330 prev = sb, sb = sb->next;
2331 }
2332 else
2333 {
2334 if (prev)
2335 prev->next = sb->next;
2336 else
2337 large_string_blocks = sb->next;
2338 next = sb->next;
2339 xfree (sb);
2340 sb = next;
2341 }
2342 }
2343 }
2344}
2345\f
2346/* Compactify strings, relocate references, and free empty string blocks. */
2347
2348static void
2349compact_strings ()
2350{
2351 /* String block of old strings we are scanning. */
2352 register struct string_block *from_sb;
2353 /* A preceding string block (or maybe the same one)
2354 where we are copying the still-live strings to. */
2355 register struct string_block *to_sb;
2356 int pos;
2357 int to_pos;
2358
2359 to_sb = first_string_block;
2360 to_pos = 0;
2361
2362 /* Scan each existing string block sequentially, string by string. */
2363 for (from_sb = first_string_block; from_sb; from_sb = from_sb->next)
2364 {
2365 pos = 0;
2366 /* POS is the index of the next string in the block. */
2367 while (pos < from_sb->pos)
2368 {
2369 register struct Lisp_String *nextstr
2370 = (struct Lisp_String *) &from_sb->chars[pos];
2371
2372 register struct Lisp_String *newaddr;
2373 register EMACS_INT size = nextstr->size;
2374
2375 /* NEXTSTR is the old address of the next string.
2376 Just skip it if it isn't marked. */
2377 if (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
2378 {
2379 /* It is marked, so its size field is really a chain of refs.
2380 Find the end of the chain, where the actual size lives. */
2381 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
2382 {
2383 if (size & DONT_COPY_FLAG)
2384 size ^= MARKBIT | DONT_COPY_FLAG;
2385 size = *(EMACS_INT *)size & ~MARKBIT;
2386 }
2387
2388 total_string_size += size;
2389
2390 /* If it won't fit in TO_SB, close it out,
2391 and move to the next sb. Keep doing so until
2392 TO_SB reaches a large enough, empty enough string block.
2393 We know that TO_SB cannot advance past FROM_SB here
2394 since FROM_SB is large enough to contain this string.
2395 Any string blocks skipped here
2396 will be patched out and freed later. */
2397 while (to_pos + STRING_FULLSIZE (size)
2398 > max (to_sb->pos, STRING_BLOCK_SIZE))
2399 {
2400 to_sb->pos = to_pos;
2401 to_sb = to_sb->next;
2402 to_pos = 0;
2403 }
2404 /* Compute new address of this string
2405 and update TO_POS for the space being used. */
2406 newaddr = (struct Lisp_String *) &to_sb->chars[to_pos];
2407 to_pos += STRING_FULLSIZE (size);
2408
2409 /* Copy the string itself to the new place. */
2410 if (nextstr != newaddr)
2411 bcopy (nextstr, newaddr, size + 1 + sizeof (EMACS_INT)
2412 + INTERVAL_PTR_SIZE);
2413
2414 /* Go through NEXTSTR's chain of references
2415 and make each slot in the chain point to
2416 the new address of this string. */
2417 size = newaddr->size;
2418 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
2419 {
2420 register Lisp_Object *objptr;
2421 if (size & DONT_COPY_FLAG)
2422 size ^= MARKBIT | DONT_COPY_FLAG;
2423 objptr = (Lisp_Object *)size;
2424
2425 size = XFASTINT (*objptr) & ~MARKBIT;
2426 if (XMARKBIT (*objptr))
2427 {
2428 XSETSTRING (*objptr, newaddr);
2429 XMARK (*objptr);
2430 }
2431 else
2432 XSETSTRING (*objptr, newaddr);
2433 }
2434 /* Store the actual size in the size field. */
2435 newaddr->size = size;
2436
2437#ifdef USE_TEXT_PROPERTIES
2438 /* Now that the string has been relocated, rebalance its
2439 interval tree, and update the tree's parent pointer. */
2440 if (! NULL_INTERVAL_P (newaddr->intervals))
2441 {
2442 UNMARK_BALANCE_INTERVALS (newaddr->intervals);
2443 XSETSTRING (* (Lisp_Object *) &newaddr->intervals->parent,
2444 newaddr);
2445 }
2446#endif /* USE_TEXT_PROPERTIES */
2447 }
2448 pos += STRING_FULLSIZE (size);
2449 }
2450 }
2451
2452 /* Close out the last string block still used and free any that follow. */
2453 to_sb->pos = to_pos;
2454 current_string_block = to_sb;
2455
2456 from_sb = to_sb->next;
2457 to_sb->next = 0;
2458 while (from_sb)
2459 {
2460 to_sb = from_sb->next;
2461 xfree (from_sb);
2462 from_sb = to_sb;
2463 }
2464
2465 /* Free any empty string blocks further back in the chain.
2466 This loop will never free first_string_block, but it is very
2467 unlikely that that one will become empty, so why bother checking? */
2468
2469 from_sb = first_string_block;
2470 while (to_sb = from_sb->next)
2471 {
2472 if (to_sb->pos == 0)
2473 {
2474 if (from_sb->next = to_sb->next)
2475 from_sb->next->prev = from_sb;
2476 xfree (to_sb);
2477 }
2478 else
2479 from_sb = to_sb;
2480 }
2481}
2482\f
2483/* Debugging aids. */
2484
2485DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
2486 "Return the address of the last byte Emacs has allocated, divided by 1024.\n\
2487This may be helpful in debugging Emacs's memory usage.\n\
2488We divide the value by 1024 to make sure it fits in a Lisp integer.")
2489 ()
2490{
2491 Lisp_Object end;
2492
2493 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
2494
2495 return end;
2496}
2497
2498DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
2499 "Return a list of counters that measure how much consing there has been.\n\
2500Each of these counters increments for a certain kind of object.\n\
2501The counters wrap around from the largest positive integer to zero.\n\
2502Garbage collection does not decrease them.\n\
2503The elements of the value are as follows:\n\
2504 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS)\n\
2505All are in units of 1 = one object consed\n\
2506except for VECTOR-CELLS and STRING-CHARS, which count the total length of\n\
2507objects consed.\n\
2508MISCS include overlays, markers, and some internal types.\n\
2509Frames, windows, buffers, and subprocesses count as vectors\n\
2510 (but the contents of a buffer's text do not count here).")
2511 ()
2512{
2513 Lisp_Object lisp_cons_cells_consed;
2514 Lisp_Object lisp_floats_consed;
2515 Lisp_Object lisp_vector_cells_consed;
2516 Lisp_Object lisp_symbols_consed;
2517 Lisp_Object lisp_string_chars_consed;
2518 Lisp_Object lisp_misc_objects_consed;
2519 Lisp_Object lisp_intervals_consed;
2520
2521 XSETINT (lisp_cons_cells_consed,
2522 cons_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2523 XSETINT (lisp_floats_consed,
2524 floats_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2525 XSETINT (lisp_vector_cells_consed,
2526 vector_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2527 XSETINT (lisp_symbols_consed,
2528 symbols_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2529 XSETINT (lisp_string_chars_consed,
2530 string_chars_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2531 XSETINT (lisp_misc_objects_consed,
2532 misc_objects_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2533 XSETINT (lisp_intervals_consed,
2534 intervals_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2535
2536 return Fcons (lisp_cons_cells_consed,
2537 Fcons (lisp_floats_consed,
2538 Fcons (lisp_vector_cells_consed,
2539 Fcons (lisp_symbols_consed,
2540 Fcons (lisp_string_chars_consed,
2541 Fcons (lisp_misc_objects_consed,
2542 Fcons (lisp_intervals_consed,
2543 Qnil)))))));
2544}
2545\f
2546/* Initialization */
2547
2548init_alloc_once ()
2549{
2550 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
2551 pureptr = 0;
2552#ifdef HAVE_SHM
2553 pure_size = PURESIZE;
2554#endif
2555 all_vectors = 0;
2556 ignore_warnings = 1;
2557 init_strings ();
2558 init_cons ();
2559 init_symbol ();
2560 init_marker ();
2561#ifdef LISP_FLOAT_TYPE
2562 init_float ();
2563#endif /* LISP_FLOAT_TYPE */
2564 INIT_INTERVALS;
2565
2566#ifdef REL_ALLOC
2567 malloc_hysteresis = 32;
2568#else
2569 malloc_hysteresis = 0;
2570#endif
2571
2572 spare_memory = (char *) malloc (SPARE_MEMORY);
2573
2574 ignore_warnings = 0;
2575 gcprolist = 0;
2576 staticidx = 0;
2577 consing_since_gc = 0;
2578 gc_cons_threshold = 100000 * sizeof (Lisp_Object);
2579#ifdef VIRT_ADDR_VARIES
2580 malloc_sbrk_unused = 1<<22; /* A large number */
2581 malloc_sbrk_used = 100000; /* as reasonable as any number */
2582#endif /* VIRT_ADDR_VARIES */
2583}
2584
2585init_alloc ()
2586{
2587 gcprolist = 0;
2588}
2589
2590void
2591syms_of_alloc ()
2592{
2593 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
2594 "*Number of bytes of consing between garbage collections.\n\
2595Garbage collection can happen automatically once this many bytes have been\n\
2596allocated since the last garbage collection. All data types count.\n\n\
2597Garbage collection happens automatically only when `eval' is called.\n\n\
2598By binding this temporarily to a large number, you can effectively\n\
2599prevent garbage collection during a part of the program.");
2600
2601 DEFVAR_INT ("pure-bytes-used", &pureptr,
2602 "Number of bytes of sharable Lisp data allocated so far.");
2603
2604 DEFVAR_INT ("cons-cells-consed", &cons_cells_consed,
2605 "Number of cons cells that have been consed so far.");
2606
2607 DEFVAR_INT ("floats-consed", &floats_consed,
2608 "Number of floats that have been consed so far.");
2609
2610 DEFVAR_INT ("vector-cells-consed", &vector_cells_consed,
2611 "Number of vector cells that have been consed so far.");
2612
2613 DEFVAR_INT ("symbols-consed", &symbols_consed,
2614 "Number of symbols that have been consed so far.");
2615
2616 DEFVAR_INT ("string-chars-consed", &string_chars_consed,
2617 "Number of string characters that have been consed so far.");
2618
2619 DEFVAR_INT ("misc-objects-consed", &misc_objects_consed,
2620 "Number of miscellaneous objects that have been consed so far.");
2621
2622 DEFVAR_INT ("intervals-consed", &intervals_consed,
2623 "Number of intervals that have been consed so far.");
2624
2625#if 0
2626 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used,
2627 "Number of bytes of unshared memory allocated in this session.");
2628
2629 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused,
2630 "Number of bytes of unshared memory remaining available in this session.");
2631#endif
2632
2633 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
2634 "Non-nil means loading Lisp code in order to dump an executable.\n\
2635This means that certain objects should be allocated in shared (pure) space.");
2636
2637 DEFVAR_INT ("undo-limit", &undo_limit,
2638 "Keep no more undo information once it exceeds this size.\n\
2639This limit is applied when garbage collection happens.\n\
2640The size is counted as the number of bytes occupied,\n\
2641which includes both saved text and other data.");
2642 undo_limit = 20000;
2643
2644 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
2645 "Don't keep more than this much size of undo information.\n\
2646A command which pushes past this size is itself forgotten.\n\
2647This limit is applied when garbage collection happens.\n\
2648The size is counted as the number of bytes occupied,\n\
2649which includes both saved text and other data.");
2650 undo_strong_limit = 30000;
2651
2652 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
2653 "Non-nil means display messages at start and end of garbage collection.");
2654 garbage_collection_messages = 0;
2655
2656 /* We build this in advance because if we wait until we need it, we might
2657 not be able to allocate the memory to hold it. */
2658 memory_signal_data
2659 = Fcons (Qerror, Fcons (build_string ("Memory exhausted--use M-x save-some-buffers RET"), Qnil));
2660 staticpro (&memory_signal_data);
2661
2662 staticpro (&Qgc_cons_threshold);
2663 Qgc_cons_threshold = intern ("gc-cons-threshold");
2664
2665 staticpro (&Qchar_table_extra_slots);
2666 Qchar_table_extra_slots = intern ("char-table-extra-slots");
2667
2668 defsubr (&Scons);
2669 defsubr (&Slist);
2670 defsubr (&Svector);
2671 defsubr (&Smake_byte_code);
2672 defsubr (&Smake_list);
2673 defsubr (&Smake_vector);
2674 defsubr (&Smake_char_table);
2675 defsubr (&Smake_string);
2676 defsubr (&Smake_bool_vector);
2677 defsubr (&Smake_symbol);
2678 defsubr (&Smake_marker);
2679 defsubr (&Spurecopy);
2680 defsubr (&Sgarbage_collect);
2681 defsubr (&Smemory_limit);
2682 defsubr (&Smemory_use_counts);
2683}