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