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