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