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