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