]> code.delx.au - gnu-emacs/blob - src/alloc.c
(SET_RAW_SYNTAX_ENTRY, SYNTAX_ENTRY): Adjusted for the change 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 }
1837 else if (GC_BOOL_VECTOR_P (obj))
1838 {
1839 register struct Lisp_Vector *ptr = XVECTOR (obj);
1840
1841 if (ptr->size & ARRAY_MARK_FLAG)
1842 break; /* Already marked */
1843 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1844 }
1845 else
1846 {
1847 register struct Lisp_Vector *ptr = XVECTOR (obj);
1848 register EMACS_INT size = ptr->size;
1849 /* The reason we use ptr1 is to avoid an apparent hardware bug
1850 that happens occasionally on the FSF's HP 300s.
1851 The bug is that a2 gets clobbered by recursive calls to mark_object.
1852 The clobberage seems to happen during function entry,
1853 perhaps in the moveml instruction.
1854 Yes, this is a crock, but we have to do it. */
1855 struct Lisp_Vector *volatile ptr1 = ptr;
1856 register int i;
1857
1858 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1859 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1860 if (size & PSEUDOVECTOR_FLAG)
1861 size &= PSEUDOVECTOR_SIZE_MASK;
1862 for (i = 0; i < size; i++) /* and then mark its elements */
1863 mark_object (&ptr1->contents[i]);
1864 }
1865 break;
1866
1867 case Lisp_Symbol:
1868 {
1869 /* See comment above under Lisp_Vector for why this is volatile. */
1870 register struct Lisp_Symbol *volatile ptr = XSYMBOL (obj);
1871 struct Lisp_Symbol *ptrx;
1872
1873 if (XMARKBIT (ptr->plist)) break;
1874 XMARK (ptr->plist);
1875 mark_object ((Lisp_Object *) &ptr->value);
1876 mark_object (&ptr->function);
1877 mark_object (&ptr->plist);
1878 XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String);
1879 mark_object (&ptr->name);
1880 ptr = ptr->next;
1881 if (ptr)
1882 {
1883 /* For the benefit of the last_marked log. */
1884 objptr = (Lisp_Object *)&XSYMBOL (obj)->next;
1885 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
1886 XSETSYMBOL (obj, ptrx);
1887 /* We can't goto loop here because *objptr doesn't contain an
1888 actual Lisp_Object with valid datatype field. */
1889 goto loop2;
1890 }
1891 }
1892 break;
1893
1894 case Lisp_Misc:
1895 switch (XMISCTYPE (obj))
1896 {
1897 case Lisp_Misc_Marker:
1898 XMARK (XMARKER (obj)->chain);
1899 /* DO NOT mark thru the marker's chain.
1900 The buffer's markers chain does not preserve markers from gc;
1901 instead, markers are removed from the chain when freed by gc. */
1902 break;
1903
1904 case Lisp_Misc_Buffer_Local_Value:
1905 case Lisp_Misc_Some_Buffer_Local_Value:
1906 {
1907 register struct Lisp_Buffer_Local_Value *ptr
1908 = XBUFFER_LOCAL_VALUE (obj);
1909 if (XMARKBIT (ptr->car)) break;
1910 XMARK (ptr->car);
1911 /* If the cdr is nil, avoid recursion for the car. */
1912 if (EQ (ptr->cdr, Qnil))
1913 {
1914 objptr = &ptr->car;
1915 goto loop;
1916 }
1917 mark_object (&ptr->car);
1918 /* See comment above under Lisp_Vector for why not use ptr here. */
1919 objptr = &XBUFFER_LOCAL_VALUE (obj)->cdr;
1920 goto loop;
1921 }
1922
1923 case Lisp_Misc_Intfwd:
1924 case Lisp_Misc_Boolfwd:
1925 case Lisp_Misc_Objfwd:
1926 case Lisp_Misc_Buffer_Objfwd:
1927 case Lisp_Misc_Kboard_Objfwd:
1928 /* Don't bother with Lisp_Buffer_Objfwd,
1929 since all markable slots in current buffer marked anyway. */
1930 /* Don't need to do Lisp_Objfwd, since the places they point
1931 are protected with staticpro. */
1932 break;
1933
1934 case Lisp_Misc_Overlay:
1935 {
1936 struct Lisp_Overlay *ptr = XOVERLAY (obj);
1937 if (!XMARKBIT (ptr->plist))
1938 {
1939 XMARK (ptr->plist);
1940 mark_object (&ptr->start);
1941 mark_object (&ptr->end);
1942 objptr = &ptr->plist;
1943 goto loop;
1944 }
1945 }
1946 break;
1947
1948 default:
1949 abort ();
1950 }
1951 break;
1952
1953 case Lisp_Cons:
1954 {
1955 register struct Lisp_Cons *ptr = XCONS (obj);
1956 if (XMARKBIT (ptr->car)) break;
1957 XMARK (ptr->car);
1958 /* If the cdr is nil, avoid recursion for the car. */
1959 if (EQ (ptr->cdr, Qnil))
1960 {
1961 objptr = &ptr->car;
1962 goto loop;
1963 }
1964 mark_object (&ptr->car);
1965 /* See comment above under Lisp_Vector for why not use ptr here. */
1966 objptr = &XCONS (obj)->cdr;
1967 goto loop;
1968 }
1969
1970 #ifdef LISP_FLOAT_TYPE
1971 case Lisp_Float:
1972 XMARK (XFLOAT (obj)->type);
1973 break;
1974 #endif /* LISP_FLOAT_TYPE */
1975
1976 case Lisp_Int:
1977 break;
1978
1979 default:
1980 abort ();
1981 }
1982 }
1983
1984 /* Mark the pointers in a buffer structure. */
1985
1986 static void
1987 mark_buffer (buf)
1988 Lisp_Object buf;
1989 {
1990 register struct buffer *buffer = XBUFFER (buf);
1991 register Lisp_Object *ptr;
1992 Lisp_Object base_buffer;
1993
1994 /* This is the buffer's markbit */
1995 mark_object (&buffer->name);
1996 XMARK (buffer->name);
1997
1998 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
1999
2000 #if 0
2001 mark_object (buffer->syntax_table);
2002
2003 /* Mark the various string-pointers in the buffer object.
2004 Since the strings may be relocated, we must mark them
2005 in their actual slots. So gc_sweep must convert each slot
2006 back to an ordinary C pointer. */
2007 XSETSTRING (*(Lisp_Object *)&buffer->upcase_table, buffer->upcase_table);
2008 mark_object ((Lisp_Object *)&buffer->upcase_table);
2009 XSETSTRING (*(Lisp_Object *)&buffer->downcase_table, buffer->downcase_table);
2010 mark_object ((Lisp_Object *)&buffer->downcase_table);
2011
2012 XSETSTRING (*(Lisp_Object *)&buffer->sort_table, buffer->sort_table);
2013 mark_object ((Lisp_Object *)&buffer->sort_table);
2014 XSETSTRING (*(Lisp_Object *)&buffer->folding_sort_table, buffer->folding_sort_table);
2015 mark_object ((Lisp_Object *)&buffer->folding_sort_table);
2016 #endif
2017
2018 for (ptr = &buffer->name + 1;
2019 (char *)ptr < (char *)buffer + sizeof (struct buffer);
2020 ptr++)
2021 mark_object (ptr);
2022
2023 /* If this is an indirect buffer, mark its base buffer. */
2024 if (buffer->base_buffer && !XMARKBIT (buffer->base_buffer->name))
2025 {
2026 XSETBUFFER (base_buffer, buffer->base_buffer);
2027 mark_buffer (base_buffer);
2028 }
2029 }
2030
2031
2032 /* Mark the pointers in the kboard objects. */
2033
2034 static void
2035 mark_kboards ()
2036 {
2037 KBOARD *kb;
2038 Lisp_Object *p;
2039 for (kb = all_kboards; kb; kb = kb->next_kboard)
2040 {
2041 if (kb->kbd_macro_buffer)
2042 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
2043 mark_object (p);
2044 mark_object (&kb->Vprefix_arg);
2045 mark_object (&kb->kbd_queue);
2046 mark_object (&kb->Vlast_kbd_macro);
2047 mark_object (&kb->Vsystem_key_alist);
2048 mark_object (&kb->system_key_syms);
2049 }
2050 }
2051 \f
2052 /* Sweep: find all structures not marked, and free them. */
2053
2054 static void
2055 gc_sweep ()
2056 {
2057 total_string_size = 0;
2058 compact_strings ();
2059
2060 /* Put all unmarked conses on free list */
2061 {
2062 register struct cons_block *cblk;
2063 register int lim = cons_block_index;
2064 register int num_free = 0, num_used = 0;
2065
2066 cons_free_list = 0;
2067
2068 for (cblk = cons_block; cblk; cblk = cblk->next)
2069 {
2070 register int i;
2071 for (i = 0; i < lim; i++)
2072 if (!XMARKBIT (cblk->conses[i].car))
2073 {
2074 num_free++;
2075 *(struct Lisp_Cons **)&cblk->conses[i].car = cons_free_list;
2076 cons_free_list = &cblk->conses[i];
2077 }
2078 else
2079 {
2080 num_used++;
2081 XUNMARK (cblk->conses[i].car);
2082 }
2083 lim = CONS_BLOCK_SIZE;
2084 }
2085 total_conses = num_used;
2086 total_free_conses = num_free;
2087 }
2088
2089 #ifdef LISP_FLOAT_TYPE
2090 /* Put all unmarked floats on free list */
2091 {
2092 register struct float_block *fblk;
2093 register int lim = float_block_index;
2094 register int num_free = 0, num_used = 0;
2095
2096 float_free_list = 0;
2097
2098 for (fblk = float_block; fblk; fblk = fblk->next)
2099 {
2100 register int i;
2101 for (i = 0; i < lim; i++)
2102 if (!XMARKBIT (fblk->floats[i].type))
2103 {
2104 num_free++;
2105 *(struct Lisp_Float **)&fblk->floats[i].type = float_free_list;
2106 float_free_list = &fblk->floats[i];
2107 }
2108 else
2109 {
2110 num_used++;
2111 XUNMARK (fblk->floats[i].type);
2112 }
2113 lim = FLOAT_BLOCK_SIZE;
2114 }
2115 total_floats = num_used;
2116 total_free_floats = num_free;
2117 }
2118 #endif /* LISP_FLOAT_TYPE */
2119
2120 #ifdef USE_TEXT_PROPERTIES
2121 /* Put all unmarked intervals on free list */
2122 {
2123 register struct interval_block *iblk;
2124 register int lim = interval_block_index;
2125 register int num_free = 0, num_used = 0;
2126
2127 interval_free_list = 0;
2128
2129 for (iblk = interval_block; iblk; iblk = iblk->next)
2130 {
2131 register int i;
2132
2133 for (i = 0; i < lim; i++)
2134 {
2135 if (! XMARKBIT (iblk->intervals[i].plist))
2136 {
2137 iblk->intervals[i].parent = interval_free_list;
2138 interval_free_list = &iblk->intervals[i];
2139 num_free++;
2140 }
2141 else
2142 {
2143 num_used++;
2144 XUNMARK (iblk->intervals[i].plist);
2145 }
2146 }
2147 lim = INTERVAL_BLOCK_SIZE;
2148 }
2149 total_intervals = num_used;
2150 total_free_intervals = num_free;
2151 }
2152 #endif /* USE_TEXT_PROPERTIES */
2153
2154 /* Put all unmarked symbols on free list */
2155 {
2156 register struct symbol_block *sblk;
2157 register int lim = symbol_block_index;
2158 register int num_free = 0, num_used = 0;
2159
2160 symbol_free_list = 0;
2161
2162 for (sblk = symbol_block; sblk; sblk = sblk->next)
2163 {
2164 register int i;
2165 for (i = 0; i < lim; i++)
2166 if (!XMARKBIT (sblk->symbols[i].plist))
2167 {
2168 *(struct Lisp_Symbol **)&sblk->symbols[i].value = symbol_free_list;
2169 symbol_free_list = &sblk->symbols[i];
2170 num_free++;
2171 }
2172 else
2173 {
2174 num_used++;
2175 sblk->symbols[i].name
2176 = XSTRING (*(Lisp_Object *) &sblk->symbols[i].name);
2177 XUNMARK (sblk->symbols[i].plist);
2178 }
2179 lim = SYMBOL_BLOCK_SIZE;
2180 }
2181 total_symbols = num_used;
2182 total_free_symbols = num_free;
2183 }
2184
2185 #ifndef standalone
2186 /* Put all unmarked markers on free list.
2187 Unchain each one first from the buffer it points into,
2188 but only if it's a real marker. */
2189 {
2190 register struct marker_block *mblk;
2191 register int lim = marker_block_index;
2192 register int num_free = 0, num_used = 0;
2193
2194 marker_free_list = 0;
2195
2196 for (mblk = marker_block; mblk; mblk = mblk->next)
2197 {
2198 register int i;
2199 EMACS_INT already_free = -1;
2200
2201 for (i = 0; i < lim; i++)
2202 {
2203 Lisp_Object *markword;
2204 switch (mblk->markers[i].u_marker.type)
2205 {
2206 case Lisp_Misc_Marker:
2207 markword = &mblk->markers[i].u_marker.chain;
2208 break;
2209 case Lisp_Misc_Buffer_Local_Value:
2210 case Lisp_Misc_Some_Buffer_Local_Value:
2211 markword = &mblk->markers[i].u_buffer_local_value.car;
2212 break;
2213 case Lisp_Misc_Overlay:
2214 markword = &mblk->markers[i].u_overlay.plist;
2215 break;
2216 case Lisp_Misc_Free:
2217 /* If the object was already free, keep it
2218 on the free list. */
2219 markword = &already_free;
2220 break;
2221 default:
2222 markword = 0;
2223 break;
2224 }
2225 if (markword && !XMARKBIT (*markword))
2226 {
2227 Lisp_Object tem;
2228 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
2229 {
2230 /* tem1 avoids Sun compiler bug */
2231 struct Lisp_Marker *tem1 = &mblk->markers[i].u_marker;
2232 XSETMARKER (tem, tem1);
2233 unchain_marker (tem);
2234 }
2235 /* Set the type of the freed object to Lisp_Misc_Free.
2236 We could leave the type alone, since nobody checks it,
2237 but this might catch bugs faster. */
2238 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
2239 mblk->markers[i].u_free.chain = marker_free_list;
2240 marker_free_list = &mblk->markers[i];
2241 num_free++;
2242 }
2243 else
2244 {
2245 num_used++;
2246 if (markword)
2247 XUNMARK (*markword);
2248 }
2249 }
2250 lim = MARKER_BLOCK_SIZE;
2251 }
2252
2253 total_markers = num_used;
2254 total_free_markers = num_free;
2255 }
2256
2257 /* Free all unmarked buffers */
2258 {
2259 register struct buffer *buffer = all_buffers, *prev = 0, *next;
2260
2261 while (buffer)
2262 if (!XMARKBIT (buffer->name))
2263 {
2264 if (prev)
2265 prev->next = buffer->next;
2266 else
2267 all_buffers = buffer->next;
2268 next = buffer->next;
2269 xfree (buffer);
2270 buffer = next;
2271 }
2272 else
2273 {
2274 XUNMARK (buffer->name);
2275 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
2276
2277 #if 0
2278 /* Each `struct Lisp_String *' was turned into a Lisp_Object
2279 for purposes of marking and relocation.
2280 Turn them back into C pointers now. */
2281 buffer->upcase_table
2282 = XSTRING (*(Lisp_Object *)&buffer->upcase_table);
2283 buffer->downcase_table
2284 = XSTRING (*(Lisp_Object *)&buffer->downcase_table);
2285 buffer->sort_table
2286 = XSTRING (*(Lisp_Object *)&buffer->sort_table);
2287 buffer->folding_sort_table
2288 = XSTRING (*(Lisp_Object *)&buffer->folding_sort_table);
2289 #endif
2290
2291 prev = buffer, buffer = buffer->next;
2292 }
2293 }
2294
2295 #endif /* standalone */
2296
2297 /* Free all unmarked vectors */
2298 {
2299 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
2300 total_vector_size = 0;
2301
2302 while (vector)
2303 if (!(vector->size & ARRAY_MARK_FLAG))
2304 {
2305 if (prev)
2306 prev->next = vector->next;
2307 else
2308 all_vectors = vector->next;
2309 next = vector->next;
2310 xfree (vector);
2311 vector = next;
2312 }
2313 else
2314 {
2315 vector->size &= ~ARRAY_MARK_FLAG;
2316 if (vector->size & PSEUDOVECTOR_FLAG)
2317 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
2318 else
2319 total_vector_size += vector->size;
2320 prev = vector, vector = vector->next;
2321 }
2322 }
2323
2324 /* Free all "large strings" not marked with ARRAY_MARK_FLAG. */
2325 {
2326 register struct string_block *sb = large_string_blocks, *prev = 0, *next;
2327 struct Lisp_String *s;
2328
2329 while (sb)
2330 {
2331 s = (struct Lisp_String *) &sb->chars[0];
2332 if (s->size & ARRAY_MARK_FLAG)
2333 {
2334 ((struct Lisp_String *)(&sb->chars[0]))->size
2335 &= ~ARRAY_MARK_FLAG & ~MARKBIT;
2336 UNMARK_BALANCE_INTERVALS (s->intervals);
2337 total_string_size += ((struct Lisp_String *)(&sb->chars[0]))->size;
2338 prev = sb, sb = sb->next;
2339 }
2340 else
2341 {
2342 if (prev)
2343 prev->next = sb->next;
2344 else
2345 large_string_blocks = sb->next;
2346 next = sb->next;
2347 xfree (sb);
2348 sb = next;
2349 }
2350 }
2351 }
2352 }
2353 \f
2354 /* Compactify strings, relocate references, and free empty string blocks. */
2355
2356 static void
2357 compact_strings ()
2358 {
2359 /* String block of old strings we are scanning. */
2360 register struct string_block *from_sb;
2361 /* A preceding string block (or maybe the same one)
2362 where we are copying the still-live strings to. */
2363 register struct string_block *to_sb;
2364 int pos;
2365 int to_pos;
2366
2367 to_sb = first_string_block;
2368 to_pos = 0;
2369
2370 /* Scan each existing string block sequentially, string by string. */
2371 for (from_sb = first_string_block; from_sb; from_sb = from_sb->next)
2372 {
2373 pos = 0;
2374 /* POS is the index of the next string in the block. */
2375 while (pos < from_sb->pos)
2376 {
2377 register struct Lisp_String *nextstr
2378 = (struct Lisp_String *) &from_sb->chars[pos];
2379
2380 register struct Lisp_String *newaddr;
2381 register EMACS_INT size = nextstr->size;
2382
2383 /* NEXTSTR is the old address of the next string.
2384 Just skip it if it isn't marked. */
2385 if (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
2386 {
2387 /* It is marked, so its size field is really a chain of refs.
2388 Find the end of the chain, where the actual size lives. */
2389 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
2390 {
2391 if (size & DONT_COPY_FLAG)
2392 size ^= MARKBIT | DONT_COPY_FLAG;
2393 size = *(EMACS_INT *)size & ~MARKBIT;
2394 }
2395
2396 total_string_size += size;
2397
2398 /* If it won't fit in TO_SB, close it out,
2399 and move to the next sb. Keep doing so until
2400 TO_SB reaches a large enough, empty enough string block.
2401 We know that TO_SB cannot advance past FROM_SB here
2402 since FROM_SB is large enough to contain this string.
2403 Any string blocks skipped here
2404 will be patched out and freed later. */
2405 while (to_pos + STRING_FULLSIZE (size)
2406 > max (to_sb->pos, STRING_BLOCK_SIZE))
2407 {
2408 to_sb->pos = to_pos;
2409 to_sb = to_sb->next;
2410 to_pos = 0;
2411 }
2412 /* Compute new address of this string
2413 and update TO_POS for the space being used. */
2414 newaddr = (struct Lisp_String *) &to_sb->chars[to_pos];
2415 to_pos += STRING_FULLSIZE (size);
2416
2417 /* Copy the string itself to the new place. */
2418 if (nextstr != newaddr)
2419 bcopy (nextstr, newaddr, size + 1 + sizeof (EMACS_INT)
2420 + INTERVAL_PTR_SIZE);
2421
2422 /* Go through NEXTSTR's chain of references
2423 and make each slot in the chain point to
2424 the new address of this string. */
2425 size = newaddr->size;
2426 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
2427 {
2428 register Lisp_Object *objptr;
2429 if (size & DONT_COPY_FLAG)
2430 size ^= MARKBIT | DONT_COPY_FLAG;
2431 objptr = (Lisp_Object *)size;
2432
2433 size = XFASTINT (*objptr) & ~MARKBIT;
2434 if (XMARKBIT (*objptr))
2435 {
2436 XSETSTRING (*objptr, newaddr);
2437 XMARK (*objptr);
2438 }
2439 else
2440 XSETSTRING (*objptr, newaddr);
2441 }
2442 /* Store the actual size in the size field. */
2443 newaddr->size = size;
2444
2445 #ifdef USE_TEXT_PROPERTIES
2446 /* Now that the string has been relocated, rebalance its
2447 interval tree, and update the tree's parent pointer. */
2448 if (! NULL_INTERVAL_P (newaddr->intervals))
2449 {
2450 UNMARK_BALANCE_INTERVALS (newaddr->intervals);
2451 XSETSTRING (* (Lisp_Object *) &newaddr->intervals->parent,
2452 newaddr);
2453 }
2454 #endif /* USE_TEXT_PROPERTIES */
2455 }
2456 pos += STRING_FULLSIZE (size);
2457 }
2458 }
2459
2460 /* Close out the last string block still used and free any that follow. */
2461 to_sb->pos = to_pos;
2462 current_string_block = to_sb;
2463
2464 from_sb = to_sb->next;
2465 to_sb->next = 0;
2466 while (from_sb)
2467 {
2468 to_sb = from_sb->next;
2469 xfree (from_sb);
2470 from_sb = to_sb;
2471 }
2472
2473 /* Free any empty string blocks further back in the chain.
2474 This loop will never free first_string_block, but it is very
2475 unlikely that that one will become empty, so why bother checking? */
2476
2477 from_sb = first_string_block;
2478 while (to_sb = from_sb->next)
2479 {
2480 if (to_sb->pos == 0)
2481 {
2482 if (from_sb->next = to_sb->next)
2483 from_sb->next->prev = from_sb;
2484 xfree (to_sb);
2485 }
2486 else
2487 from_sb = to_sb;
2488 }
2489 }
2490 \f
2491 /* Debugging aids. */
2492
2493 DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
2494 "Return the address of the last byte Emacs has allocated, divided by 1024.\n\
2495 This may be helpful in debugging Emacs's memory usage.\n\
2496 We divide the value by 1024 to make sure it fits in a Lisp integer.")
2497 ()
2498 {
2499 Lisp_Object end;
2500
2501 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
2502
2503 return end;
2504 }
2505
2506 DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
2507 "Return a list of counters that measure how much consing there has been.\n\
2508 Each of these counters increments for a certain kind of object.\n\
2509 The counters wrap around from the largest positive integer to zero.\n\
2510 Garbage collection does not decrease them.\n\
2511 The elements of the value are as follows:\n\
2512 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS)\n\
2513 All are in units of 1 = one object consed\n\
2514 except for VECTOR-CELLS and STRING-CHARS, which count the total length of\n\
2515 objects consed.\n\
2516 MISCS include overlays, markers, and some internal types.\n\
2517 Frames, windows, buffers, and subprocesses count as vectors\n\
2518 (but the contents of a buffer's text do not count here).")
2519 ()
2520 {
2521 Lisp_Object lisp_cons_cells_consed;
2522 Lisp_Object lisp_floats_consed;
2523 Lisp_Object lisp_vector_cells_consed;
2524 Lisp_Object lisp_symbols_consed;
2525 Lisp_Object lisp_string_chars_consed;
2526 Lisp_Object lisp_misc_objects_consed;
2527 Lisp_Object lisp_intervals_consed;
2528
2529 XSETINT (lisp_cons_cells_consed,
2530 cons_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2531 XSETINT (lisp_floats_consed,
2532 floats_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2533 XSETINT (lisp_vector_cells_consed,
2534 vector_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2535 XSETINT (lisp_symbols_consed,
2536 symbols_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2537 XSETINT (lisp_string_chars_consed,
2538 string_chars_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2539 XSETINT (lisp_misc_objects_consed,
2540 misc_objects_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2541 XSETINT (lisp_intervals_consed,
2542 intervals_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
2543
2544 return Fcons (lisp_cons_cells_consed,
2545 Fcons (lisp_floats_consed,
2546 Fcons (lisp_vector_cells_consed,
2547 Fcons (lisp_symbols_consed,
2548 Fcons (lisp_string_chars_consed,
2549 Fcons (lisp_misc_objects_consed,
2550 Fcons (lisp_intervals_consed,
2551 Qnil)))))));
2552 }
2553 \f
2554 /* Initialization */
2555
2556 init_alloc_once ()
2557 {
2558 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
2559 pureptr = 0;
2560 #ifdef HAVE_SHM
2561 pure_size = PURESIZE;
2562 #endif
2563 all_vectors = 0;
2564 ignore_warnings = 1;
2565 init_strings ();
2566 init_cons ();
2567 init_symbol ();
2568 init_marker ();
2569 #ifdef LISP_FLOAT_TYPE
2570 init_float ();
2571 #endif /* LISP_FLOAT_TYPE */
2572 INIT_INTERVALS;
2573
2574 #ifdef REL_ALLOC
2575 malloc_hysteresis = 32;
2576 #else
2577 malloc_hysteresis = 0;
2578 #endif
2579
2580 spare_memory = (char *) malloc (SPARE_MEMORY);
2581
2582 ignore_warnings = 0;
2583 gcprolist = 0;
2584 staticidx = 0;
2585 consing_since_gc = 0;
2586 gc_cons_threshold = 100000 * sizeof (Lisp_Object);
2587 #ifdef VIRT_ADDR_VARIES
2588 malloc_sbrk_unused = 1<<22; /* A large number */
2589 malloc_sbrk_used = 100000; /* as reasonable as any number */
2590 #endif /* VIRT_ADDR_VARIES */
2591 }
2592
2593 init_alloc ()
2594 {
2595 gcprolist = 0;
2596 }
2597
2598 void
2599 syms_of_alloc ()
2600 {
2601 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
2602 "*Number of bytes of consing between garbage collections.\n\
2603 Garbage collection can happen automatically once this many bytes have been\n\
2604 allocated since the last garbage collection. All data types count.\n\n\
2605 Garbage collection happens automatically only when `eval' is called.\n\n\
2606 By binding this temporarily to a large number, you can effectively\n\
2607 prevent garbage collection during a part of the program.");
2608
2609 DEFVAR_INT ("pure-bytes-used", &pureptr,
2610 "Number of bytes of sharable Lisp data allocated so far.");
2611
2612 DEFVAR_INT ("cons-cells-consed", &cons_cells_consed,
2613 "Number of cons cells that have been consed so far.");
2614
2615 DEFVAR_INT ("floats-consed", &floats_consed,
2616 "Number of floats that have been consed so far.");
2617
2618 DEFVAR_INT ("vector-cells-consed", &vector_cells_consed,
2619 "Number of vector cells that have been consed so far.");
2620
2621 DEFVAR_INT ("symbols-consed", &symbols_consed,
2622 "Number of symbols that have been consed so far.");
2623
2624 DEFVAR_INT ("string-chars-consed", &string_chars_consed,
2625 "Number of string characters that have been consed so far.");
2626
2627 DEFVAR_INT ("misc-objects-consed", &misc_objects_consed,
2628 "Number of miscellaneous objects that have been consed so far.");
2629
2630 DEFVAR_INT ("intervals-consed", &intervals_consed,
2631 "Number of intervals that have been consed so far.");
2632
2633 #if 0
2634 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used,
2635 "Number of bytes of unshared memory allocated in this session.");
2636
2637 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused,
2638 "Number of bytes of unshared memory remaining available in this session.");
2639 #endif
2640
2641 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
2642 "Non-nil means loading Lisp code in order to dump an executable.\n\
2643 This means that certain objects should be allocated in shared (pure) space.");
2644
2645 DEFVAR_INT ("undo-limit", &undo_limit,
2646 "Keep no more undo information once it exceeds this size.\n\
2647 This limit is applied when garbage collection happens.\n\
2648 The size is counted as the number of bytes occupied,\n\
2649 which includes both saved text and other data.");
2650 undo_limit = 20000;
2651
2652 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
2653 "Don't keep more than this much size of undo information.\n\
2654 A command which pushes past this size is itself forgotten.\n\
2655 This limit is applied when garbage collection happens.\n\
2656 The size is counted as the number of bytes occupied,\n\
2657 which includes both saved text and other data.");
2658 undo_strong_limit = 30000;
2659
2660 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
2661 "Non-nil means display messages at start and end of garbage collection.");
2662 garbage_collection_messages = 0;
2663
2664 /* We build this in advance because if we wait until we need it, we might
2665 not be able to allocate the memory to hold it. */
2666 memory_signal_data
2667 = Fcons (Qerror, Fcons (build_string ("Memory exhausted--use M-x save-some-buffers RET"), Qnil));
2668 staticpro (&memory_signal_data);
2669
2670 staticpro (&Qgc_cons_threshold);
2671 Qgc_cons_threshold = intern ("gc-cons-threshold");
2672
2673 staticpro (&Qchar_table_extra_slots);
2674 Qchar_table_extra_slots = intern ("char-table-extra-slots");
2675
2676 defsubr (&Scons);
2677 defsubr (&Slist);
2678 defsubr (&Svector);
2679 defsubr (&Smake_byte_code);
2680 defsubr (&Smake_list);
2681 defsubr (&Smake_vector);
2682 defsubr (&Smake_char_table);
2683 defsubr (&Smake_string);
2684 defsubr (&Smake_bool_vector);
2685 defsubr (&Smake_symbol);
2686 defsubr (&Smake_marker);
2687 defsubr (&Spurecopy);
2688 defsubr (&Sgarbage_collect);
2689 defsubr (&Smemory_limit);
2690 defsubr (&Smemory_use_counts);
2691 }