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