comparison src/alloc.c @ 27142:f742c86fcc15

(Fgarbage_collect): Return number of live and free strings. (mark_buffer): Remove code in #if 0. (gc_sweep): Ditto. (UNMARK_BALANCE_INTERVALS): Give the macro statement form. (strings_consed): New variable. (allocate_string): Set it. (syms_of_alloc): Add DEFVAR_INT for strings_consed. (Fmemory_use_counts): Return strings_consed. Use Flist. General cleanup in comments etc. Remove conditional compilation for `standalone'. (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): (GC_STRING_BYTES, GC_STRING_CHARS): New macros. (DONT_COPY_FLAG): Removed. (SBLOCK_SIZE, LARGE_STRING_BYTES): New macros. (struct sdata, struct sblock): New (struct string_block): Rewritten. (STRINGS_IN_STRING_BLOCK): New macro. (oldest_sblock, current_sblock, total_strings, total_free_strings) (large_sblocks, string_blocks, string_free_list): New variables. (NEXT_FREE_LISP_STRING, SDATA_OF_STRING, SDATA_SIZE): New macros. (init_strings): Rewritten. (allocate_string, allocate_string_data, compact_small_strings) (free_large_strings, sweep_strings): New functions. (STRING_BLOCK_SIZE, STRING_BLOCK_OUTSIZE) (struct string_block_head, current_string_block) (first_string_block, large_string_blocks, STRING_FULLSIZE) (STRING_PAD): Removed. (make_uninit_multibyte_string, make_pure_string): Rewritten. (Fgarbage_collect): Don't set mark bit in large strings. (mark_object): Mark strings differently. Mark symbol names differently. (survives_gc_p): Test marked strings differently. (gc_sweep): Sweep strings differently, unmark strings in symbol names. (compact_strings): Removed.
author Gerd Moellmann <gerd@gnu.org>
date Tue, 04 Jan 2000 12:22:13 +0000
parents d6d99ee4a5ae
children 46cf02cace2d
comparison
equal deleted inserted replaced
27141:d7b1de135a40 27142:f742c86fcc15
1 /* Storage allocation and gc for GNU Emacs Lisp interpreter. 1 /* Storage allocation and gc for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999 2 Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5 This file is part of GNU Emacs. 5 This file is part of GNU Emacs.
6 6
7 GNU Emacs is free software; you can redistribute it and/or modify 7 GNU Emacs is free software; you can redistribute it and/or modify
20 Boston, MA 02111-1307, USA. */ 20 Boston, MA 02111-1307, USA. */
21 21
22 #include <config.h> 22 #include <config.h>
23 23
24 /* Note that this declares bzero on OSF/1. How dumb. */ 24 /* Note that this declares bzero on OSF/1. How dumb. */
25
25 #include <signal.h> 26 #include <signal.h>
26 27
27 /* This file is part of the core Lisp implementation, and thus must 28 /* This file is part of the core Lisp implementation, and thus must
28 deal with the real data structures. If the Lisp implementation is 29 deal with the real data structures. If the Lisp implementation is
29 replaced, this file likely will not be used. */ 30 replaced, this file likely will not be used. */
31
30 #undef HIDE_LISP_IMPLEMENTATION 32 #undef HIDE_LISP_IMPLEMENTATION
31 #include "lisp.h" 33 #include "lisp.h"
32 #include "intervals.h" 34 #include "intervals.h"
33 #include "puresize.h" 35 #include "puresize.h"
34 #ifndef standalone
35 #include "buffer.h" 36 #include "buffer.h"
36 #include "window.h" 37 #include "window.h"
37 #include "frame.h" 38 #include "frame.h"
38 #include "blockinput.h" 39 #include "blockinput.h"
39 #include "keyboard.h" 40 #include "keyboard.h"
40 #include "charset.h" 41 #include "charset.h"
41 #endif
42
43 #include "syssignal.h" 42 #include "syssignal.h"
44 43
45 extern char *sbrk (); 44 extern char *sbrk ();
46 45
47 #ifdef DOUG_LEA_MALLOC 46 #ifdef DOUG_LEA_MALLOC
47
48 #include <malloc.h> 48 #include <malloc.h>
49 #define __malloc_size_t int 49 #define __malloc_size_t int
50 50
51 /* Specify maximum number of areas to mmap. 51 /* Specify maximum number of areas to mmap. It would be nice to use a
52 It would be nice to use a value that explicitly 52 value that explicitly means "no limit". */
53 means "no limit". */ 53
54 #define MMAP_MAX_AREAS 100000000 54 #define MMAP_MAX_AREAS 100000000
55 55
56 #else 56 #else /* not DOUG_LEA_MALLOC */
57
57 /* The following come from gmalloc.c. */ 58 /* The following come from gmalloc.c. */
58 59
59 #if defined (__STDC__) && __STDC__ 60 #if defined (__STDC__) && __STDC__
60 #include <stddef.h> 61 #include <stddef.h>
61 #define __malloc_size_t size_t 62 #define __malloc_size_t size_t
62 #else 63 #else
63 #define __malloc_size_t unsigned int 64 #define __malloc_size_t unsigned int
64 #endif 65 #endif
65 extern __malloc_size_t _bytes_used; 66 extern __malloc_size_t _bytes_used;
66 extern int __malloc_extra_blocks; 67 extern int __malloc_extra_blocks;
67 #endif /* !defined(DOUG_LEA_MALLOC) */ 68
69 #endif /* not DOUG_LEA_MALLOC */
68 70
69 #define max(A,B) ((A) > (B) ? (A) : (B)) 71 #define max(A,B) ((A) > (B) ? (A) : (B))
70 #define min(A,B) ((A) < (B) ? (A) : (B)) 72 #define min(A,B) ((A) < (B) ? (A) : (B))
71 73
72 /* Macro to verify that storage intended for Lisp objects is not 74 /* Macro to verify that storage intended for Lisp objects is not
73 out of range to fit in the space for a pointer. 75 out of range to fit in the space for a pointer.
74 ADDRESS is the start of the block, and SIZE 76 ADDRESS is the start of the block, and SIZE
75 is the amount of space within which objects can start. */ 77 is the amount of space within which objects can start. */
78
76 #define VALIDATE_LISP_STORAGE(address, size) \ 79 #define VALIDATE_LISP_STORAGE(address, size) \
77 do \ 80 do \
78 { \ 81 { \
79 Lisp_Object val; \ 82 Lisp_Object val; \
80 XSETCONS (val, (char *) address + size); \ 83 XSETCONS (val, (char *) address + size); \
84 memory_full (); \ 87 memory_full (); \
85 } \ 88 } \
86 } while (0) 89 } while (0)
87 90
88 /* Value of _bytes_used, when spare_memory was freed. */ 91 /* Value of _bytes_used, when spare_memory was freed. */
92
89 static __malloc_size_t bytes_used_when_full; 93 static __malloc_size_t bytes_used_when_full;
90 94
91 /* Number of bytes of consing done since the last gc */ 95 /* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
96 to a struct Lisp_String. */
97
98 #define MARK_STRING(S) XMARK ((S)->size)
99 #define UNMARK_STRING(S) XUNMARK ((S)->size)
100 #define STRING_MARKED_P(S) XMARKBIT ((S)->size)
101
102 /* Value is the number of bytes/chars of S, a pointer to a struct
103 Lisp_String. This must be used instead of STRING_BYTES (S) or
104 S->size during GC, because S->size contains the mark bit for
105 strings. */
106
107 #define GC_STRING_BYTES(S) (STRING_BYTES (S) & ~MARKBIT)
108 #define GC_STRING_CHARS(S) ((S)->size & ~MARKBIT)
109
110 /* Number of bytes of consing done since the last gc. */
111
92 int consing_since_gc; 112 int consing_since_gc;
93 113
94 /* Count the amount of consing of various sorts of space. */ 114 /* Count the amount of consing of various sorts of space. */
115
95 int cons_cells_consed; 116 int cons_cells_consed;
96 int floats_consed; 117 int floats_consed;
97 int vector_cells_consed; 118 int vector_cells_consed;
98 int symbols_consed; 119 int symbols_consed;
99 int string_chars_consed; 120 int string_chars_consed;
100 int misc_objects_consed; 121 int misc_objects_consed;
101 int intervals_consed; 122 int intervals_consed;
102 123 int strings_consed;
103 /* Number of bytes of consing since gc before another gc should be done. */ 124
125 /* Number of bytes of consing since GC before another GC should be done. */
126
104 int gc_cons_threshold; 127 int gc_cons_threshold;
105 128
106 /* Nonzero during gc */ 129 /* Nonzero during GC. */
130
107 int gc_in_progress; 131 int gc_in_progress;
108 132
109 /* Nonzero means display messages at beginning and end of GC. */ 133 /* Nonzero means display messages at beginning and end of GC. */
134
110 int garbage_collection_messages; 135 int garbage_collection_messages;
111 136
112 #ifndef VIRT_ADDR_VARIES 137 #ifndef VIRT_ADDR_VARIES
113 extern 138 extern
114 #endif /* VIRT_ADDR_VARIES */ 139 #endif /* VIRT_ADDR_VARIES */
115 int malloc_sbrk_used; 140 int malloc_sbrk_used;
116 141
117 #ifndef VIRT_ADDR_VARIES 142 #ifndef VIRT_ADDR_VARIES
118 extern 143 extern
119 #endif /* VIRT_ADDR_VARIES */ 144 #endif /* VIRT_ADDR_VARIES */
120 int malloc_sbrk_unused; 145 int malloc_sbrk_unused;
121 146
122 /* Two limits controlling how much undo information to keep. */ 147 /* Two limits controlling how much undo information to keep. */
148
123 int undo_limit; 149 int undo_limit;
124 int undo_strong_limit; 150 int undo_strong_limit;
125 151
126 int total_conses, total_markers, total_symbols, total_string_size, total_vector_size; 152 int total_conses, total_markers, total_symbols, total_vector_size;
127 int total_free_conses, total_free_markers, total_free_symbols; 153 int total_free_conses, total_free_markers, total_free_symbols;
128 #ifdef LISP_FLOAT_TYPE 154 #ifdef LISP_FLOAT_TYPE
129 int total_free_floats, total_floats; 155 int total_free_floats, total_floats;
130 #endif /* LISP_FLOAT_TYPE */ 156 #endif /* LISP_FLOAT_TYPE */
131 157
132 /* Points to memory space allocated as "spare", 158 /* Points to memory space allocated as "spare", to be freed if we run
133 to be freed if we run out of memory. */ 159 out of memory. */
160
134 static char *spare_memory; 161 static char *spare_memory;
135 162
136 /* Amount of spare memory to keep in reserve. */ 163 /* Amount of spare memory to keep in reserve. */
164
137 #define SPARE_MEMORY (1 << 14) 165 #define SPARE_MEMORY (1 << 14)
138 166
139 /* Number of extra blocks malloc should get when it needs more core. */ 167 /* Number of extra blocks malloc should get when it needs more core. */
168
140 static int malloc_hysteresis; 169 static int malloc_hysteresis;
141 170
142 /* Nonzero when malloc is called for allocating Lisp object space. */ 171 /* Nonzero when malloc is called for allocating Lisp object space.
172 Currently set but not used. */
173
143 int allocating_for_lisp; 174 int allocating_for_lisp;
144 175
145 /* Non-nil means defun should do purecopy on the function definition */ 176 /* Non-nil means defun should do purecopy on the function definition. */
177
146 Lisp_Object Vpurify_flag; 178 Lisp_Object Vpurify_flag;
147 179
148 #ifndef HAVE_SHM 180 #ifndef HAVE_SHM
149 EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {0,}; /* Force it into data space! */ 181
182 /* Force it into data space! */
183
184 EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {0,};
150 #define PUREBEG (char *) pure 185 #define PUREBEG (char *) pure
151 #else 186
187 #else /* not HAVE_SHM */
188
152 #define pure PURE_SEG_BITS /* Use shared memory segment */ 189 #define pure PURE_SEG_BITS /* Use shared memory segment */
153 #define PUREBEG (char *)PURE_SEG_BITS 190 #define PUREBEG (char *)PURE_SEG_BITS
154 191
155 /* This variable is used only by the XPNTR macro when HAVE_SHM is 192 /* This variable is used only by the XPNTR macro when HAVE_SHM is
156 defined. If we used the PURESIZE macro directly there, that would 193 defined. If we used the PURESIZE macro directly there, that would
157 make most of emacs dependent on puresize.h, which we don't want - 194 make most of Emacs dependent on puresize.h, which we don't want -
158 you should be able to change that without too much recompilation. 195 you should be able to change that without too much recompilation.
159 So map_in_data initializes pure_size, and the dependencies work 196 So map_in_data initializes pure_size, and the dependencies work
160 out. */ 197 out. */
198
161 EMACS_INT pure_size; 199 EMACS_INT pure_size;
200
162 #endif /* not HAVE_SHM */ 201 #endif /* not HAVE_SHM */
163 202
164 /* Index in pure at which next pure object will be allocated. */ 203 /* Index in pure at which next pure object will be allocated.. */
204
165 int pureptr; 205 int pureptr;
166 206
167 /* If nonzero, this is a warning delivered by malloc and not yet displayed. */ 207 /* If nonzero, this is a warning delivered by malloc and not yet
208 displayed. */
209
168 char *pending_malloc_warning; 210 char *pending_malloc_warning;
169 211
170 /* Pre-computed signal argument for use when memory is exhausted. */ 212 /* Pre-computed signal argument for use when memory is exhausted. */
213
171 Lisp_Object memory_signal_data; 214 Lisp_Object memory_signal_data;
172 215
173 /* Maximum amount of C stack to save when a GC happens. */ 216 /* Maximum amount of C stack to save when a GC happens. */
174 217
175 #ifndef MAX_SAVE_STACK 218 #ifndef MAX_SAVE_STACK
176 #define MAX_SAVE_STACK 16000 219 #define MAX_SAVE_STACK 16000
177 #endif 220 #endif
178 221
179 /* Define DONT_COPY_FLAG to be some bit which will always be zero in a
180 pointer to a Lisp_Object, when that pointer is viewed as an integer.
181 (On most machines, pointers are even, so we can use the low bit.
182 Word-addressable architectures may need to override this in the m-file.)
183 When linking references to small strings through the size field, we
184 use this slot to hold the bit that would otherwise be interpreted as
185 the GC mark bit. */
186 #ifndef DONT_COPY_FLAG
187 #define DONT_COPY_FLAG 1
188 #endif /* no DONT_COPY_FLAG */
189
190 /* Buffer in which we save a copy of the C stack at each GC. */ 222 /* Buffer in which we save a copy of the C stack at each GC. */
191 223
192 char *stack_copy; 224 char *stack_copy;
193 int stack_copy_size; 225 int stack_copy_size;
194 226
195 /* Non-zero means ignore malloc warnings. Set during initialization. */ 227 /* Non-zero means ignore malloc warnings. Set during initialization.
228 Currently not used. */
229
196 int ignore_warnings; 230 int ignore_warnings;
197 231
198 Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots; 232 Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots;
199 233
200 static void mark_buffer (), mark_kboards (); 234 static void mark_buffer P_ ((Lisp_Object));
201 static void gc_sweep (); 235 static void mark_kboards P_ ((void));
202 static void compact_strings (); 236 static void gc_sweep P_ ((void));
203 static void mark_glyph_matrix P_ ((struct glyph_matrix *)); 237 static void mark_glyph_matrix P_ ((struct glyph_matrix *));
204 static void mark_face_cache P_ ((struct face_cache *)); 238 static void mark_face_cache P_ ((struct face_cache *));
205 #if 0 239 #if 0
206 static void clear_marks (); 240 static void clear_marks ();
207 #endif 241 #endif
209 #ifdef HAVE_WINDOW_SYSTEM 243 #ifdef HAVE_WINDOW_SYSTEM
210 static void mark_image P_ ((struct image *)); 244 static void mark_image P_ ((struct image *));
211 static void mark_image_cache P_ ((struct frame *)); 245 static void mark_image_cache P_ ((struct frame *));
212 #endif /* HAVE_WINDOW_SYSTEM */ 246 #endif /* HAVE_WINDOW_SYSTEM */
213 247
248 static struct Lisp_String *allocate_string P_ ((void));
249 static void compact_small_strings P_ ((void));
250 static void free_large_strings P_ ((void));
251 static void sweep_strings P_ ((void));
214 252
215 extern int message_enable_multibyte; 253 extern int message_enable_multibyte;
216 254
217 /* Versions of malloc and realloc that print warnings as memory gets full. */ 255 /* Versions of malloc and realloc that print warnings as memory gets
256 full. */
218 257
219 Lisp_Object 258 Lisp_Object
220 malloc_warning_1 (str) 259 malloc_warning_1 (str)
221 Lisp_Object str; 260 Lisp_Object str;
222 { 261 {
225 write_string ("However, certainly by the time you receive the 95% warning,\n", -1); 264 write_string ("However, certainly by the time you receive the 95% warning,\n", -1);
226 write_string ("you should clean up, kill this Emacs, and start a new one.", -1); 265 write_string ("you should clean up, kill this Emacs, and start a new one.", -1);
227 return Qnil; 266 return Qnil;
228 } 267 }
229 268
230 /* malloc calls this if it finds we are near exhausting storage */ 269 /* malloc calls this if it finds we are near exhausting storage. */
231 270
232 void 271 void
233 malloc_warning (str) 272 malloc_warning (str)
234 char *str; 273 char *str;
235 { 274 {
250 # define BYTES_USED (mallinfo ().arena) 289 # define BYTES_USED (mallinfo ().arena)
251 #else 290 #else
252 # define BYTES_USED _bytes_used 291 # define BYTES_USED _bytes_used
253 #endif 292 #endif
254 293
255 /* Called if malloc returns zero */ 294 /* Called if malloc returns zero. */
256 295
257 void 296 void
258 memory_full () 297 memory_full ()
259 { 298 {
260 #ifndef SYSTEM_MALLOC 299 #ifndef SYSTEM_MALLOC
266 { 305 {
267 free (spare_memory); 306 free (spare_memory);
268 spare_memory = 0; 307 spare_memory = 0;
269 } 308 }
270 309
271 /* This used to call error, but if we've run out of memory, we could get 310 /* This used to call error, but if we've run out of memory, we could
272 infinite recursion trying to build the string. */ 311 get infinite recursion trying to build the string. */
273 while (1) 312 while (1)
274 Fsignal (Qnil, memory_signal_data); 313 Fsignal (Qnil, memory_signal_data);
275 } 314 }
276 315
277 /* Called if we can't allocate relocatable space for a buffer. */ 316 /* Called if we can't allocate relocatable space for a buffer. */
278 317
279 void 318 void
280 buffer_memory_full () 319 buffer_memory_full ()
281 { 320 {
282 /* If buffers use the relocating allocator, 321 /* If buffers use the relocating allocator, no need to free
283 no need to free spare_memory, because we may have plenty of malloc 322 spare_memory, because we may have plenty of malloc space left
284 space left that we could get, and if we don't, the malloc that fails 323 that we could get, and if we don't, the malloc that fails will
285 will itself cause spare_memory to be freed. 324 itself cause spare_memory to be freed. If buffers don't use the
286 If buffers don't use the relocating allocator, 325 relocating allocator, treat this like any other failing
287 treat this like any other failing malloc. */ 326 malloc. */
288 327
289 #ifndef REL_ALLOC 328 #ifndef REL_ALLOC
290 memory_full (); 329 memory_full ();
291 #endif 330 #endif
292 331
293 /* This used to call error, but if we've run out of memory, we could get 332 /* This used to call error, but if we've run out of memory, we could
294 infinite recursion trying to build the string. */ 333 get infinite recursion trying to build the string. */
295 while (1) 334 while (1)
296 Fsignal (Qerror, memory_signal_data); 335 Fsignal (Qerror, memory_signal_data);
297 } 336 }
298 337
299 /* Like malloc routines but check for no memory and block interrupt input. */ 338 /* Like malloc routines but check for no memory and block interrupt
339 input.. */
300 340
301 long * 341 long *
302 xmalloc (size) 342 xmalloc (size)
303 int size; 343 int size;
304 { 344 {
306 346
307 BLOCK_INPUT; 347 BLOCK_INPUT;
308 val = (long *) malloc (size); 348 val = (long *) malloc (size);
309 UNBLOCK_INPUT; 349 UNBLOCK_INPUT;
310 350
311 if (!val && size) memory_full (); 351 if (!val && size)
352 memory_full ();
312 return val; 353 return val;
313 } 354 }
314 355
315 long * 356 long *
316 xrealloc (block, size) 357 xrealloc (block, size)
379 might call malloc, so we can't really protect them unless you're 420 might call malloc, so we can't really protect them unless you're
380 using GNU malloc. Fortunately, most of the major operating can use 421 using GNU malloc. Fortunately, most of the major operating can use
381 GNU malloc. */ 422 GNU malloc. */
382 423
383 #ifndef SYSTEM_MALLOC 424 #ifndef SYSTEM_MALLOC
425
384 extern void * (*__malloc_hook) (); 426 extern void * (*__malloc_hook) ();
385 static void * (*old_malloc_hook) (); 427 static void * (*old_malloc_hook) ();
386 extern void * (*__realloc_hook) (); 428 extern void * (*__realloc_hook) ();
387 static void * (*old_realloc_hook) (); 429 static void * (*old_realloc_hook) ();
388 extern void (*__free_hook) (); 430 extern void (*__free_hook) ();
477 519
478 if (__realloc_hook != emacs_blocked_realloc) 520 if (__realloc_hook != emacs_blocked_realloc)
479 old_realloc_hook = __realloc_hook; 521 old_realloc_hook = __realloc_hook;
480 __realloc_hook = emacs_blocked_realloc; 522 __realloc_hook = emacs_blocked_realloc;
481 } 523 }
482 #endif 524
525 #endif /* not SYSTEM_MALLOC */
526
527
483 528
484 /* Interval allocation. */ 529 /***********************************************************************
530 Interval Allocation
531 ***********************************************************************/
485 532
486 #define INTERVAL_BLOCK_SIZE \ 533 #define INTERVAL_BLOCK_SIZE \
487 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval)) 534 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
488 535
489 struct interval_block 536 struct interval_block
490 { 537 {
491 struct interval_block *next; 538 struct interval_block *next;
492 struct interval intervals[INTERVAL_BLOCK_SIZE]; 539 struct interval intervals[INTERVAL_BLOCK_SIZE];
493 }; 540 };
494 541
495 struct interval_block *interval_block; 542 struct interval_block *interval_block;
496 static int interval_block_index; 543 static int interval_block_index;
544 static int total_free_intervals, total_intervals;
497 545
498 INTERVAL interval_free_list; 546 INTERVAL interval_free_list;
499 547
500 /* Total number of interval blocks now in use. */ 548 /* Total number of interval blocks now in use. */
549
501 int n_interval_blocks; 550 int n_interval_blocks;
502 551
503 static void 552 static void
504 init_intervals () 553 init_intervals ()
505 { 554 {
544 intervals_consed++; 593 intervals_consed++;
545 RESET_INTERVAL (val); 594 RESET_INTERVAL (val);
546 return val; 595 return val;
547 } 596 }
548 597
549 static int total_free_intervals, total_intervals;
550
551 /* Mark the pointers of one interval. */ 598 /* Mark the pointers of one interval. */
552 599
553 static void 600 static void
554 mark_interval (i, dummy) 601 mark_interval (i, dummy)
555 register INTERVAL i; 602 register INTERVAL i;
582 && ! XMARKBIT (*(Lisp_Object *) &i->parent)) \ 629 && ! XMARKBIT (*(Lisp_Object *) &i->parent)) \
583 mark_interval_tree (i); \ 630 mark_interval_tree (i); \
584 } while (0) 631 } while (0)
585 632
586 /* The oddity in the call to XUNMARK is necessary because XUNMARK 633 /* The oddity in the call to XUNMARK is necessary because XUNMARK
587 expands to an assignment to its argument, and most C compilers don't 634 expands to an assignment to its argument, and most C compilers
588 support casts on the left operand of `='. */ 635 don't support casts on the left operand of `='. */
589 #define UNMARK_BALANCE_INTERVALS(i) \ 636
590 { \ 637 #define UNMARK_BALANCE_INTERVALS(i) \
591 if (! NULL_INTERVAL_P (i)) \ 638 do { \
592 { \ 639 if (! NULL_INTERVAL_P (i)) \
593 XUNMARK (* (Lisp_Object *) (&(i)->parent)); \ 640 { \
594 (i) = balance_intervals (i); \ 641 XUNMARK (* (Lisp_Object *) (&(i)->parent)); \
595 } \ 642 (i) = balance_intervals (i); \
596 } 643 } \
644 } while (0)
597 645
598 646
599 /* Floating point allocation. */ 647 /***********************************************************************
648 String Allocation
649 ***********************************************************************/
650
651 /* Lisp_Strings are allocated in string_block structures. When a new
652 string_block is allocated, all the Lisp_Strings it contains are
653 added to a free-list stiing_free_list. When a new Lisp_String is
654 needed, it is taken from that list. During the sweep phase of GC,
655 string_blocks that are entirely free are freed, except two which
656 we keep.
657
658 String data is allocated from sblock structures. Strings larger
659 than LARGE_STRING_BYTES, get their own sblock, data for smaller
660 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
661
662 Sblocks consist internally of sdata structures, one for each
663 Lisp_String. The sdata structure points to the Lisp_String it
664 belongs to. The Lisp_String points back to the `u.data' member of
665 its sdata structure.
666
667 When a Lisp_String is freed during GC, it is put back on
668 string_free_list, and its `data' member and its sdata's `string'
669 pointer is set to null. The size of the string is recorded in the
670 `u.nbytes' member of the sdata. So, sdata structures that are no
671 longer used, can be easily recognized, and it's easy to compact the
672 sblocks of small strings which we do in compact_small_strings. */
673
674 /* Size in bytes of an sblock structure used for small strings. This
675 is 8192 minus malloc overhead. */
676
677 #define SBLOCK_SIZE 8188
678
679 /* Strings larger than this are considered large strings. String data
680 for large strings is allocated from individual sblocks. */
681
682 #define LARGE_STRING_BYTES 1024
683
684 /* Structure describing string memory sub-allocated from an sblock.
685 This is where the contents of Lisp strings are stored. */
686
687 struct sdata
688 {
689 /* Back-pointer to the string this sdata belongs to. If null, this
690 structure is free, and the NBYTES member of the union below
691 contains the string byte size (the same value that STRING_BYTES
692 would return if STRING were non-null). If non-null, STRING_BYTES
693 (STRING) is the size of the data, and DATA contains the string's
694 contents. */
695 struct Lisp_String *string;
696
697 union
698 {
699 /* When STRING in non-null. */
700 unsigned char data[1];
701
702 /* When STRING is null. */
703 EMACS_INT nbytes;
704 } u;
705 };
706
707 /* Structure describing a block of memory which is sub-allocated to
708 obtain string data memory for strings. Blocks for small strings
709 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
710 as large as needed. */
711
712 struct sblock
713 {
714 /* Next in list. */
715 struct sblock *next;
716
717 /* Pointer to the next free sdata block. This points past the end
718 of the sblock if there isn't any space left in this block. */
719 struct sdata *next_free;
720
721 /* Start of data. */
722 struct sdata first_data;
723 };
724
725 /* Number of Lisp strings in a string_block structure. The 1020 is
726 1024 minus malloc overhead. */
727
728 #define STRINGS_IN_STRING_BLOCK \
729 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
730
731 /* Structure describing a block from which Lisp_String structures
732 are allocated. */
733
734 struct string_block
735 {
736 struct string_block *next;
737 struct Lisp_String strings[STRINGS_IN_STRING_BLOCK];
738 };
739
740 /* Head and tail of the list of sblock structures holding Lisp string
741 data. We always allocate from current_sblock. The NEXT pointers
742 in the sblock structures go from oldest_sblock to current_sblock. */
743
744 static struct sblock *oldest_sblock, *current_sblock;
745
746 /* List of sblocks for large strings. */
747
748 static struct sblock *large_sblocks;
749
750 /* List of string_block structures, and how many there are. */
751
752 static struct string_block *string_blocks;
753 static int n_string_blocks;
754
755 /* Free-list of Lisp_Strings. */
756
757 static struct Lisp_String *string_free_list;
758
759 /* Number of live and free Lisp_Strings. */
760
761 static int total_strings, total_free_strings;
762
763 /* Number of bytes used by live strings. */
764
765 static int total_string_size;
766
767 /* Given a pointer to a Lisp_String S which is on the free-list
768 string_free_list, return a pointer to its successor in the
769 free-list. */
770
771 #define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
772
773 /* Return a pointer to the sdata structure belonging to Lisp string S.
774 S must be live, i.e. S->data must not be null. S->data is actually
775 a pointer to the `u.data' member of its sdata structure; the
776 structure starts at a constant offset in front of that. */
777
778 #define SDATA_OF_STRING(S) \
779 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *)))
780
781 /* Value is the size of an sdata structure large enough to hold NBYTES
782 bytes of string data. The value returned includes a terminating
783 NUL byte, the size of the sdata structure, and padding. */
784
785 #define SDATA_SIZE(NBYTES) \
786 ((sizeof (struct Lisp_String *) \
787 + (NBYTES) + 1 \
788 + sizeof (EMACS_INT) - 1) \
789 & ~(sizeof (EMACS_INT) - 1))
790
791
792 /* Initialize string allocation. Called from init_alloc_once. */
793
794 void
795 init_strings ()
796 {
797 total_strings = total_free_strings = total_string_size = 0;
798 oldest_sblock = current_sblock = large_sblocks = NULL;
799 string_blocks = NULL;
800 n_string_blocks = 0;
801 string_free_list = NULL;
802 }
803
804
805 /* Return a new Lisp_String. */
806
807 static struct Lisp_String *
808 allocate_string ()
809 {
810 struct Lisp_String *s;
811
812 /* If the free-list is empty, allocate a new string_block, and
813 add all the Lisp_Strings in it to the free-list. */
814 if (string_free_list == NULL)
815 {
816 struct string_block *b;
817 int i;
818
819 b = (struct string_block *) lisp_malloc (sizeof *b);
820 VALIDATE_LISP_STORAGE (b, sizeof *b);
821 bzero (b, sizeof *b);
822 b->next = string_blocks;
823 string_blocks = b;
824 ++n_string_blocks;
825
826 for (i = STRINGS_IN_STRING_BLOCK - 1; i >= 0; --i)
827 {
828 s = b->strings + i;
829 NEXT_FREE_LISP_STRING (s) = string_free_list;
830 string_free_list = s;
831 }
832
833 total_free_strings += STRINGS_IN_STRING_BLOCK;
834 }
835
836 /* Pop a Lisp_String off the free-list. */
837 s = string_free_list;
838 string_free_list = NEXT_FREE_LISP_STRING (s);
839
840 /* Probably not strictly necessary, but play it safe. */
841 bzero (s, sizeof *s);
842
843 --total_free_strings;
844 ++total_strings;
845 ++strings_consed;
846 consing_since_gc += sizeof *s;
847
848 return s;
849 }
850
851
852 /* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
853 plus a NUL byte at the end. Allocate an sdata structure for S, and
854 set S->data to its `u.data' member. Store a NUL byte at the end of
855 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
856 S->data if it was initially non-null. */
857
858 void
859 allocate_string_data (s, nchars, nbytes)
860 struct Lisp_String *s;
861 int nchars, nbytes;
862 {
863 struct sdata *data;
864 struct sblock *b;
865 int needed;
866
867 /* Determine the number of bytes needed to store NBYTES bytes
868 of string data. */
869 needed = SDATA_SIZE (nbytes);
870
871 if (nbytes > LARGE_STRING_BYTES)
872 {
873 int size = sizeof *b - sizeof (struct sdata) + needed;
874
875 #ifdef DOUG_LEA_MALLOC
876 /* Prevent mmap'ing the chunk (which is potentially very large). */
877 mallopt (M_MMAP_MAX, 0);
878 #endif
879
880 b = (struct sblock *) lisp_malloc (size);
881
882 #ifdef DOUG_LEA_MALLOC
883 /* Back to a reasonable maximum of mmap'ed areas. */
884 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
885 #endif
886
887 b->next_free = &b->first_data;
888 b->first_data.string = NULL;
889 b->next = large_sblocks;
890 large_sblocks = b;
891 }
892 else if (current_sblock == NULL
893 || (((char *) current_sblock + SBLOCK_SIZE
894 - (char *) current_sblock->next_free)
895 < needed))
896 {
897 /* Not enough room in the current sblock. */
898 b = (struct sblock *) lisp_malloc (SBLOCK_SIZE);
899 b->next_free = &b->first_data;
900 b->first_data.string = NULL;
901 b->next = NULL;
902
903 if (current_sblock)
904 current_sblock->next = b;
905 else
906 oldest_sblock = b;
907 current_sblock = b;
908 }
909 else
910 b = current_sblock;
911
912 /* If S had already data assigned, mark that as free by setting
913 its string back-pointer to null, and recording the size of
914 the data in it.. */
915 if (s->data)
916 {
917 data = SDATA_OF_STRING (s);
918 data->u.nbytes = GC_STRING_BYTES (s);
919 data->string = NULL;
920 }
921
922 data = b->next_free;
923 data->string = s;
924 s->data = data->u.data;
925 s->size = nchars;
926 s->size_byte = nbytes;
927 s->data[nbytes] = '\0';
928 b->next_free = (struct sdata *) ((char *) data + needed);
929
930 consing_since_gc += needed;
931 }
932
933
934 /* Sweep and compact strings. */
935
936 static void
937 sweep_strings ()
938 {
939 struct string_block *b, *next;
940 struct string_block *live_blocks = NULL;
941
942 string_free_list = NULL;
943 total_strings = total_free_strings = 0;
944 total_string_size = 0;
945
946 /* Scan strings_blocks, free Lisp_Strings that aren't marked. */
947 for (b = string_blocks; b; b = next)
948 {
949 int i, nfree = 0;
950 struct Lisp_String *free_list_before = string_free_list;
951
952 next = b->next;
953
954 for (i = 0; i < STRINGS_IN_STRING_BLOCK; ++i)
955 {
956 struct Lisp_String *s = b->strings + i;
957
958 if (s->data)
959 {
960 /* String was not on free-list before. */
961 if (STRING_MARKED_P (s))
962 {
963 /* String is live; unmark it and its intervals. */
964 UNMARK_STRING (s);
965
966 if (!NULL_INTERVAL_P (s->intervals))
967 UNMARK_BALANCE_INTERVALS (s->intervals);
968
969 ++total_strings;
970 total_string_size += STRING_BYTES (s);
971 }
972 else
973 {
974 /* String is dead. Put it on the free-list. */
975 struct sdata *data = SDATA_OF_STRING (s);
976
977 /* Save the size of S in its sdata so that we know
978 how large that is. Reset the sdata's string
979 back-pointer so that we know it's free. */
980 data->u.nbytes = GC_STRING_BYTES (s);
981 data->string = NULL;
982
983 /* Reset the strings's `data' member so that we
984 know it's free. */
985 s->data = NULL;
986
987 /* Put the string on the free-list. */
988 NEXT_FREE_LISP_STRING (s) = string_free_list;
989 string_free_list = s;
990 ++nfree;
991 }
992 }
993 else
994 {
995 /* S was on the free-list before. Put it there again. */
996 NEXT_FREE_LISP_STRING (s) = string_free_list;
997 string_free_list = s;
998 ++nfree;
999 }
1000 }
1001
1002 /* Free blocks that are contain free Lisp_Strings only, except
1003 the first two of them. */
1004 if (nfree == STRINGS_IN_STRING_BLOCK
1005 && total_free_strings > STRINGS_IN_STRING_BLOCK)
1006 {
1007 lisp_free (b);
1008 --n_string_blocks;
1009 string_free_list = free_list_before;
1010 }
1011 else
1012 {
1013 total_free_strings += nfree;
1014 b->next = live_blocks;
1015 live_blocks = b;
1016 }
1017 }
1018
1019 string_blocks = live_blocks;
1020 free_large_strings ();
1021 compact_small_strings ();
1022 }
1023
1024
1025 /* Free dead large strings. */
1026
1027 static void
1028 free_large_strings ()
1029 {
1030 struct sblock *b, *next;
1031 struct sblock *live_blocks = NULL;
1032
1033 for (b = large_sblocks; b; b = next)
1034 {
1035 next = b->next;
1036
1037 if (b->first_data.string == NULL)
1038 lisp_free (b);
1039 else
1040 {
1041 b->next = live_blocks;
1042 live_blocks = b;
1043 }
1044 }
1045
1046 large_sblocks = live_blocks;
1047 }
1048
1049
1050 /* Compact data of small strings. Free sblocks that don't contain
1051 data of live strings after compaction. */
1052
1053 static void
1054 compact_small_strings ()
1055 {
1056 struct sblock *b, *tb, *next;
1057 struct sdata *from, *to, *end, *tb_end;
1058 struct sdata *to_end, *from_end;
1059
1060 /* TB is the sblock we copy to, TO is the sdata within TB we copy
1061 to, and TB_END is the end of TB. */
1062 tb = oldest_sblock;
1063 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
1064 to = &tb->first_data;
1065
1066 /* Step through the blocks from the oldest to the youngest. We
1067 expect that old blocks will stabilize over time, so that less
1068 copying will happen this way. */
1069 for (b = oldest_sblock; b; b = b->next)
1070 {
1071 end = b->next_free;
1072 xassert ((char *) end <= (char *) b + SBLOCK_SIZE);
1073
1074 for (from = &b->first_data; from < end; from = from_end)
1075 {
1076 /* Compute the next FROM here because copying below may
1077 overwrite data we need to compute it. */
1078 int nbytes;
1079
1080 if (from->string)
1081 nbytes = GC_STRING_BYTES (from->string);
1082 else
1083 nbytes = from->u.nbytes;
1084
1085 nbytes = SDATA_SIZE (nbytes);
1086 from_end = (struct sdata *) ((char *) from + nbytes);
1087
1088 /* FROM->string non-null means it's alive. Copy its data. */
1089 if (from->string)
1090 {
1091 /* If TB is full, proceed with the next sblock. */
1092 to_end = (struct sdata *) ((char *) to + nbytes);
1093 if (to_end > tb_end)
1094 {
1095 tb->next_free = to;
1096 tb = tb->next;
1097 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
1098 to = &tb->first_data;
1099 to_end = (struct sdata *) ((char *) to + nbytes);
1100 }
1101
1102 /* Copy, and update the string's `data' pointer. */
1103 if (from != to)
1104 {
1105 bcopy (from, to, nbytes);
1106 to->string->data = to->u.data;
1107 }
1108
1109 /* Advance past the sdata we copied to. */
1110 to = to_end;
1111 }
1112 }
1113 }
1114
1115 /* The rest of the sblocks following TB don't contain live data, so
1116 we can free them. */
1117 for (b = tb->next; b; b = next)
1118 {
1119 next = b->next;
1120 lisp_free (b);
1121 }
1122
1123 tb->next_free = to;
1124 tb->next = NULL;
1125 current_sblock = tb;
1126 }
1127
1128
1129 DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
1130 "Return a newly created string of length LENGTH, with each element being INIT.\n\
1131 Both LENGTH and INIT must be numbers.")
1132 (length, init)
1133 Lisp_Object length, init;
1134 {
1135 register Lisp_Object val;
1136 register unsigned char *p, *end;
1137 int c, nbytes;
1138
1139 CHECK_NATNUM (length, 0);
1140 CHECK_NUMBER (init, 1);
1141
1142 c = XINT (init);
1143 if (SINGLE_BYTE_CHAR_P (c))
1144 {
1145 nbytes = XINT (length);
1146 val = make_uninit_string (nbytes);
1147 p = XSTRING (val)->data;
1148 end = p + XSTRING (val)->size;
1149 while (p != end)
1150 *p++ = c;
1151 }
1152 else
1153 {
1154 unsigned char str[4];
1155 int len = CHAR_STRING (c, str);
1156
1157 nbytes = len * XINT (length);
1158 val = make_uninit_multibyte_string (XINT (length), nbytes);
1159 p = XSTRING (val)->data;
1160 end = p + nbytes;
1161 while (p != end)
1162 {
1163 bcopy (str, p, len);
1164 p += len;
1165 }
1166 }
1167
1168 *p = 0;
1169 return val;
1170 }
1171
1172
1173 DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
1174 "Return a new bool-vector of length LENGTH, using INIT for as each element.\n\
1175 LENGTH must be a number. INIT matters only in whether it is t or nil.")
1176 (length, init)
1177 Lisp_Object length, init;
1178 {
1179 register Lisp_Object val;
1180 struct Lisp_Bool_Vector *p;
1181 int real_init, i;
1182 int length_in_chars, length_in_elts, bits_per_value;
1183
1184 CHECK_NATNUM (length, 0);
1185
1186 bits_per_value = sizeof (EMACS_INT) * BITS_PER_CHAR;
1187
1188 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
1189 length_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1) / BITS_PER_CHAR);
1190
1191 /* We must allocate one more elements than LENGTH_IN_ELTS for the
1192 slot `size' of the struct Lisp_Bool_Vector. */
1193 val = Fmake_vector (make_number (length_in_elts + 1), Qnil);
1194 p = XBOOL_VECTOR (val);
1195 /* Get rid of any bits that would cause confusion. */
1196 p->vector_size = 0;
1197 XSETBOOL_VECTOR (val, p);
1198 p->size = XFASTINT (length);
1199
1200 real_init = (NILP (init) ? 0 : -1);
1201 for (i = 0; i < length_in_chars ; i++)
1202 p->data[i] = real_init;
1203 /* Clear the extraneous bits in the last byte. */
1204 if (XINT (length) != length_in_chars * BITS_PER_CHAR)
1205 XBOOL_VECTOR (val)->data[length_in_chars - 1]
1206 &= (1 << (XINT (length) % BITS_PER_CHAR)) - 1;
1207
1208 return val;
1209 }
1210
1211
1212 /* Make a string from NBYTES bytes at CONTENTS, and compute the number
1213 of characters from the contents. This string may be unibyte or
1214 multibyte, depending on the contents. */
1215
1216 Lisp_Object
1217 make_string (contents, nbytes)
1218 char *contents;
1219 int nbytes;
1220 {
1221 register Lisp_Object val;
1222 int nchars = chars_in_text (contents, nbytes);
1223 val = make_uninit_multibyte_string (nchars, nbytes);
1224 bcopy (contents, XSTRING (val)->data, nbytes);
1225 if (STRING_BYTES (XSTRING (val)) == XSTRING (val)->size)
1226 SET_STRING_BYTES (XSTRING (val), -1);
1227 return val;
1228 }
1229
1230
1231 /* Make an unibyte string from LENGTH bytes at CONTENTS. */
1232
1233 Lisp_Object
1234 make_unibyte_string (contents, length)
1235 char *contents;
1236 int length;
1237 {
1238 register Lisp_Object val;
1239 val = make_uninit_string (length);
1240 bcopy (contents, XSTRING (val)->data, length);
1241 SET_STRING_BYTES (XSTRING (val), -1);
1242 return val;
1243 }
1244
1245
1246 /* Make a multibyte string from NCHARS characters occupying NBYTES
1247 bytes at CONTENTS. */
1248
1249 Lisp_Object
1250 make_multibyte_string (contents, nchars, nbytes)
1251 char *contents;
1252 int nchars, nbytes;
1253 {
1254 register Lisp_Object val;
1255 val = make_uninit_multibyte_string (nchars, nbytes);
1256 bcopy (contents, XSTRING (val)->data, nbytes);
1257 return val;
1258 }
1259
1260
1261 /* Make a string from NCHARS characters occupying NBYTES bytes at
1262 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
1263
1264 Lisp_Object
1265 make_string_from_bytes (contents, nchars, nbytes)
1266 char *contents;
1267 int nchars, nbytes;
1268 {
1269 register Lisp_Object val;
1270 val = make_uninit_multibyte_string (nchars, nbytes);
1271 bcopy (contents, XSTRING (val)->data, nbytes);
1272 if (STRING_BYTES (XSTRING (val)) == XSTRING (val)->size)
1273 SET_STRING_BYTES (XSTRING (val), -1);
1274 return val;
1275 }
1276
1277
1278 /* Make a string from NCHARS characters occupying NBYTES bytes at
1279 CONTENTS. The argument MULTIBYTE controls whether to label the
1280 string as multibyte. */
1281
1282 Lisp_Object
1283 make_specified_string (contents, nchars, nbytes, multibyte)
1284 char *contents;
1285 int nchars, nbytes;
1286 int multibyte;
1287 {
1288 register Lisp_Object val;
1289 val = make_uninit_multibyte_string (nchars, nbytes);
1290 bcopy (contents, XSTRING (val)->data, nbytes);
1291 if (!multibyte)
1292 SET_STRING_BYTES (XSTRING (val), -1);
1293 return val;
1294 }
1295
1296
1297 /* Make a string from the data at STR, treating it as multibyte if the
1298 data warrants. */
1299
1300 Lisp_Object
1301 build_string (str)
1302 char *str;
1303 {
1304 return make_string (str, strlen (str));
1305 }
1306
1307
1308 /* Return an unibyte Lisp_String set up to hold LENGTH characters
1309 occupying LENGTH bytes. */
1310
1311 Lisp_Object
1312 make_uninit_string (length)
1313 int length;
1314 {
1315 Lisp_Object val;
1316 val = make_uninit_multibyte_string (length, length);
1317 SET_STRING_BYTES (XSTRING (val), -1);
1318 return val;
1319 }
1320
1321
1322 /* Return a multibyte Lisp_String set up to hold NCHARS characters
1323 which occupy NBYTES bytes. */
1324
1325 Lisp_Object
1326 make_uninit_multibyte_string (nchars, nbytes)
1327 int nchars, nbytes;
1328 {
1329 Lisp_Object string;
1330 struct Lisp_String *s;
1331
1332 if (nchars < 0)
1333 abort ();
1334
1335 s = allocate_string ();
1336 allocate_string_data (s, nchars, nbytes);
1337 XSETSTRING (string, s);
1338 string_chars_consed += nbytes;
1339 return string;
1340 }
1341
1342
1343
1344 /***********************************************************************
1345 Float Allocation
1346 ***********************************************************************/
600 1347
601 #ifdef LISP_FLOAT_TYPE 1348 #ifdef LISP_FLOAT_TYPE
602 /* Allocation of float cells, just like conses */ 1349
603 /* We store float cells inside of float_blocks, allocating a new 1350 /* We store float cells inside of float_blocks, allocating a new
604 float_block with malloc whenever necessary. Float cells reclaimed by 1351 float_block with malloc whenever necessary. Float cells reclaimed
605 GC are put on a free list to be reallocated before allocating 1352 by GC are put on a free list to be reallocated before allocating
606 any new float cells from the latest float_block. 1353 any new float cells from the latest float_block.
607 1354
608 Each float_block is just under 1020 bytes long, 1355 Each float_block is just under 1020 bytes long, since malloc really
609 since malloc really allocates in units of powers of two 1356 allocates in units of powers of two and uses 4 bytes for its own
610 and uses 4 bytes for its own overhead. */ 1357 overhead. */
611 1358
612 #define FLOAT_BLOCK_SIZE \ 1359 #define FLOAT_BLOCK_SIZE \
613 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float)) 1360 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float))
614 1361
615 struct float_block 1362 struct float_block
616 { 1363 {
617 struct float_block *next; 1364 struct float_block *next;
618 struct Lisp_Float floats[FLOAT_BLOCK_SIZE]; 1365 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
619 }; 1366 };
620 1367
621 struct float_block *float_block; 1368 struct float_block *float_block;
622 int float_block_index; 1369 int float_block_index;
623 1370
624 /* Total number of float blocks now in use. */ 1371 /* Total number of float blocks now in use. */
1372
625 int n_float_blocks; 1373 int n_float_blocks;
626 1374
627 struct Lisp_Float *float_free_list; 1375 struct Lisp_Float *float_free_list;
628 1376
629 void 1377 void
636 float_free_list = 0; 1384 float_free_list = 0;
637 n_float_blocks = 1; 1385 n_float_blocks = 1;
638 } 1386 }
639 1387
640 /* Explicitly free a float cell. */ 1388 /* Explicitly free a float cell. */
1389
641 void 1390 void
642 free_float (ptr) 1391 free_float (ptr)
643 struct Lisp_Float *ptr; 1392 struct Lisp_Float *ptr;
644 { 1393 {
645 *(struct Lisp_Float **)&ptr->data = float_free_list; 1394 *(struct Lisp_Float **)&ptr->data = float_free_list;
672 float_block_index = 0; 1421 float_block_index = 0;
673 n_float_blocks++; 1422 n_float_blocks++;
674 } 1423 }
675 XSETFLOAT (val, &float_block->floats[float_block_index++]); 1424 XSETFLOAT (val, &float_block->floats[float_block_index++]);
676 } 1425 }
1426
677 XFLOAT_DATA (val) = float_value; 1427 XFLOAT_DATA (val) = float_value;
678 XSETFASTINT (XFLOAT (val)->type, 0); /* bug chasing -wsr */ 1428 XSETFASTINT (XFLOAT (val)->type, 0); /* bug chasing -wsr */
679 consing_since_gc += sizeof (struct Lisp_Float); 1429 consing_since_gc += sizeof (struct Lisp_Float);
680 floats_consed++; 1430 floats_consed++;
681 return val; 1431 return val;
682 } 1432 }
683 1433
684 #endif /* LISP_FLOAT_TYPE */ 1434 #endif /* LISP_FLOAT_TYPE */
1435
1436
685 1437
686 /* Allocation of cons cells */ 1438 /***********************************************************************
1439 Cons Allocation
1440 ***********************************************************************/
1441
687 /* We store cons cells inside of cons_blocks, allocating a new 1442 /* We store cons cells inside of cons_blocks, allocating a new
688 cons_block with malloc whenever necessary. Cons cells reclaimed by 1443 cons_block with malloc whenever necessary. Cons cells reclaimed by
689 GC are put on a free list to be reallocated before allocating 1444 GC are put on a free list to be reallocated before allocating
690 any new cons cells from the latest cons_block. 1445 any new cons cells from the latest cons_block.
691 1446
695 1450
696 #define CONS_BLOCK_SIZE \ 1451 #define CONS_BLOCK_SIZE \
697 ((1020 - sizeof (struct cons_block *)) / sizeof (struct Lisp_Cons)) 1452 ((1020 - sizeof (struct cons_block *)) / sizeof (struct Lisp_Cons))
698 1453
699 struct cons_block 1454 struct cons_block
700 { 1455 {
701 struct cons_block *next; 1456 struct cons_block *next;
702 struct Lisp_Cons conses[CONS_BLOCK_SIZE]; 1457 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
703 }; 1458 };
704 1459
705 struct cons_block *cons_block; 1460 struct cons_block *cons_block;
706 int cons_block_index; 1461 int cons_block_index;
707 1462
708 struct Lisp_Cons *cons_free_list; 1463 struct Lisp_Cons *cons_free_list;
709 1464
710 /* Total number of cons blocks now in use. */ 1465 /* Total number of cons blocks now in use. */
1466
711 int n_cons_blocks; 1467 int n_cons_blocks;
712 1468
713 void 1469 void
714 init_cons () 1470 init_cons ()
715 { 1471 {
757 cons_block_index = 0; 1513 cons_block_index = 0;
758 n_cons_blocks++; 1514 n_cons_blocks++;
759 } 1515 }
760 XSETCONS (val, &cons_block->conses[cons_block_index++]); 1516 XSETCONS (val, &cons_block->conses[cons_block_index++]);
761 } 1517 }
1518
762 XCAR (val) = car; 1519 XCAR (val) = car;
763 XCDR (val) = cdr; 1520 XCDR (val) = cdr;
764 consing_since_gc += sizeof (struct Lisp_Cons); 1521 consing_since_gc += sizeof (struct Lisp_Cons);
765 cons_cells_consed++; 1522 cons_cells_consed++;
766 return val; 1523 return val;
767 } 1524 }
1525
768 1526
769 /* Make a list of 2, 3, 4 or 5 specified objects. */ 1527 /* Make a list of 2, 3, 4 or 5 specified objects. */
770 1528
771 Lisp_Object 1529 Lisp_Object
772 list2 (arg1, arg2) 1530 list2 (arg1, arg2)
829 val = Qnil; 1587 val = Qnil;
830 while (size-- > 0) 1588 while (size-- > 0)
831 val = Fcons (init, val); 1589 val = Fcons (init, val);
832 return val; 1590 return val;
833 } 1591 }
1592
1593
834 1594
835 /* Allocation of vectors */ 1595 /***********************************************************************
1596 Vector Allocation
1597 ***********************************************************************/
836 1598
837 struct Lisp_Vector *all_vectors; 1599 struct Lisp_Vector *all_vectors;
838 1600
839 /* Total number of vectorlike objects now in use. */ 1601 /* Total number of vector-like objects now in use. */
1602
840 int n_vectors; 1603 int n_vectors;
841 1604
842 struct Lisp_Vector * 1605 struct Lisp_Vector *
843 allocate_vectorlike (len) 1606 allocate_vectorlike (len)
844 EMACS_INT len; 1607 EMACS_INT len;
845 { 1608 {
846 struct Lisp_Vector *p; 1609 struct Lisp_Vector *p;
847 1610
848 #ifdef DOUG_LEA_MALLOC 1611 #ifdef DOUG_LEA_MALLOC
849 /* Prevent mmap'ing the chunk (which is potentially very large). */ 1612 /* Prevent mmap'ing the chunk (which is potentially very large).. */
850 mallopt (M_MMAP_MAX, 0); 1613 mallopt (M_MMAP_MAX, 0);
851 #endif 1614 #endif
852 p = (struct Lisp_Vector *)lisp_malloc (sizeof (struct Lisp_Vector) 1615 p = (struct Lisp_Vector *)lisp_malloc (sizeof (struct Lisp_Vector)
853 + (len - 1) * sizeof (Lisp_Object)); 1616 + (len - 1) * sizeof (Lisp_Object));
854 #ifdef DOUG_LEA_MALLOC 1617 #ifdef DOUG_LEA_MALLOC
855 /* Back to a reasonable maximum of mmap'ed areas. */ 1618 /* Back to a reasonable maximum of mmap'ed areas. */
856 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); 1619 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
857 #endif 1620 #endif
858 VALIDATE_LISP_STORAGE (p, 0); 1621 VALIDATE_LISP_STORAGE (p, 0);
976 p->contents[index] = args[index]; 1739 p->contents[index] = args[index];
977 } 1740 }
978 XSETCOMPILED (val, p); 1741 XSETCOMPILED (val, p);
979 return val; 1742 return val;
980 } 1743 }
1744
981 1745
982 /* Allocation of symbols. 1746 /***********************************************************************
983 Just like allocation of conses! 1747 Symbol Allocation
984 1748 ***********************************************************************/
985 Each symbol_block is just under 1020 bytes long, 1749
986 since malloc really allocates in units of powers of two 1750 /* Each symbol_block is just under 1020 bytes long, since malloc
987 and uses 4 bytes for its own overhead. */ 1751 really allocates in units of powers of two and uses 4 bytes for its
1752 own overhead. */
988 1753
989 #define SYMBOL_BLOCK_SIZE \ 1754 #define SYMBOL_BLOCK_SIZE \
990 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol)) 1755 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
991 1756
992 struct symbol_block 1757 struct symbol_block
993 { 1758 {
994 struct symbol_block *next; 1759 struct symbol_block *next;
995 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE]; 1760 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
996 }; 1761 };
997 1762
998 struct symbol_block *symbol_block; 1763 struct symbol_block *symbol_block;
999 int symbol_block_index; 1764 int symbol_block_index;
1000 1765
1001 struct Lisp_Symbol *symbol_free_list; 1766 struct Lisp_Symbol *symbol_free_list;
1002 1767
1003 /* Total number of symbol blocks now in use. */ 1768 /* Total number of symbol blocks now in use. */
1769
1004 int n_symbol_blocks; 1770 int n_symbol_blocks;
1005 1771
1006 void 1772 void
1007 init_symbol () 1773 init_symbol ()
1008 { 1774 {
1042 symbol_block_index = 0; 1808 symbol_block_index = 0;
1043 n_symbol_blocks++; 1809 n_symbol_blocks++;
1044 } 1810 }
1045 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index++]); 1811 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index++]);
1046 } 1812 }
1813
1047 p = XSYMBOL (val); 1814 p = XSYMBOL (val);
1048 p->name = XSTRING (name); 1815 p->name = XSTRING (name);
1049 p->obarray = Qnil; 1816 p->obarray = Qnil;
1050 p->plist = Qnil; 1817 p->plist = Qnil;
1051 p->value = Qunbound; 1818 p->value = Qunbound;
1053 p->next = 0; 1820 p->next = 0;
1054 consing_since_gc += sizeof (struct Lisp_Symbol); 1821 consing_since_gc += sizeof (struct Lisp_Symbol);
1055 symbols_consed++; 1822 symbols_consed++;
1056 return val; 1823 return val;
1057 } 1824 }
1825
1826
1058 1827
1828 /***********************************************************************
1829 Marker Allocation
1830 ***********************************************************************/
1831
1059 /* Allocation of markers and other objects that share that structure. 1832 /* Allocation of markers and other objects that share that structure.
1060 Works like allocation of conses. */ 1833 Works like allocation of conses. */
1061 1834
1062 #define MARKER_BLOCK_SIZE \ 1835 #define MARKER_BLOCK_SIZE \
1063 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc)) 1836 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
1064 1837
1065 struct marker_block 1838 struct marker_block
1066 { 1839 {
1067 struct marker_block *next; 1840 struct marker_block *next;
1068 union Lisp_Misc markers[MARKER_BLOCK_SIZE]; 1841 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
1069 }; 1842 };
1070 1843
1071 struct marker_block *marker_block; 1844 struct marker_block *marker_block;
1072 int marker_block_index; 1845 int marker_block_index;
1073 1846
1074 union Lisp_Misc *marker_free_list; 1847 union Lisp_Misc *marker_free_list;
1075 1848
1076 /* Total number of marker blocks now in use. */ 1849 /* Total number of marker blocks now in use. */
1850
1077 int n_marker_blocks; 1851 int n_marker_blocks;
1078 1852
1079 void 1853 void
1080 init_marker () 1854 init_marker ()
1081 { 1855 {
1086 marker_free_list = 0; 1860 marker_free_list = 0;
1087 n_marker_blocks = 1; 1861 n_marker_blocks = 1;
1088 } 1862 }
1089 1863
1090 /* Return a newly allocated Lisp_Misc object, with no substructure. */ 1864 /* Return a newly allocated Lisp_Misc object, with no substructure. */
1865
1091 Lisp_Object 1866 Lisp_Object
1092 allocate_misc () 1867 allocate_misc ()
1093 { 1868 {
1094 Lisp_Object val; 1869 Lisp_Object val;
1095 1870
1110 marker_block_index = 0; 1885 marker_block_index = 0;
1111 n_marker_blocks++; 1886 n_marker_blocks++;
1112 } 1887 }
1113 XSETMISC (val, &marker_block->markers[marker_block_index++]); 1888 XSETMISC (val, &marker_block->markers[marker_block_index++]);
1114 } 1889 }
1890
1115 consing_since_gc += sizeof (union Lisp_Misc); 1891 consing_since_gc += sizeof (union Lisp_Misc);
1116 misc_objects_consed++; 1892 misc_objects_consed++;
1117 return val; 1893 return val;
1118 } 1894 }
1119 1895
1147 XMISC (marker)->u_free.chain = marker_free_list; 1923 XMISC (marker)->u_free.chain = marker_free_list;
1148 marker_free_list = XMISC (marker); 1924 marker_free_list = XMISC (marker);
1149 1925
1150 total_free_markers++; 1926 total_free_markers++;
1151 } 1927 }
1152 1928
1153 /* Allocation of strings */
1154
1155 /* Strings reside inside of string_blocks. The entire data of the string,
1156 both the size and the contents, live in part of the `chars' component of a string_block.
1157 The `pos' component is the index within `chars' of the first free byte.
1158
1159 first_string_block points to the first string_block ever allocated.
1160 Each block points to the next one with its `next' field.
1161 The `prev' fields chain in reverse order.
1162 The last one allocated is the one currently being filled.
1163 current_string_block points to it.
1164
1165 The string_blocks that hold individual large strings
1166 go in a separate chain, started by large_string_blocks. */
1167
1168
1169 /* String blocks contain this many useful bytes.
1170 8188 is power of 2, minus 4 for malloc overhead. */
1171 #define STRING_BLOCK_SIZE (8188 - sizeof (struct string_block_head))
1172
1173 /* A string bigger than this gets its own specially-made string block
1174 if it doesn't fit in the current one. */
1175 #define STRING_BLOCK_OUTSIZE 1024
1176
1177 struct string_block_head
1178 {
1179 struct string_block *next, *prev;
1180 EMACS_INT pos;
1181 };
1182
1183 struct string_block
1184 {
1185 struct string_block *next, *prev;
1186 EMACS_INT pos;
1187 char chars[STRING_BLOCK_SIZE];
1188 };
1189
1190 /* This points to the string block we are now allocating strings. */
1191
1192 struct string_block *current_string_block;
1193
1194 /* This points to the oldest string block, the one that starts the chain. */
1195
1196 struct string_block *first_string_block;
1197
1198 /* Last string block in chain of those made for individual large strings. */
1199
1200 struct string_block *large_string_blocks;
1201
1202 /* If SIZE is the length of a string, this returns how many bytes
1203 the string occupies in a string_block (including padding). */
1204
1205 #define STRING_FULLSIZE(size) (((size) + 1 + STRING_BASE_SIZE + STRING_PAD - 1) \
1206 & ~(STRING_PAD - 1))
1207 /* Add 1 for the null terminator,
1208 and add STRING_PAD - 1 as part of rounding up. */
1209
1210 #define STRING_PAD (sizeof (EMACS_INT))
1211 /* Size of the stuff in the string not including its data. */
1212 #define STRING_BASE_SIZE (((sizeof (struct Lisp_String) - 1) / STRING_PAD) * STRING_PAD)
1213
1214 #if 0
1215 #define STRING_FULLSIZE(SIZE) \
1216 (((SIZE) + 2 * sizeof (EMACS_INT)) & ~(sizeof (EMACS_INT) - 1))
1217 #endif
1218
1219 /* Total number of string blocks now in use. */
1220 int n_string_blocks;
1221
1222 void
1223 init_strings ()
1224 {
1225 current_string_block = (struct string_block *) lisp_malloc (sizeof (struct string_block));
1226 first_string_block = current_string_block;
1227 consing_since_gc += sizeof (struct string_block);
1228 current_string_block->next = 0;
1229 current_string_block->prev = 0;
1230 current_string_block->pos = 0;
1231 large_string_blocks = 0;
1232 n_string_blocks = 1;
1233 }
1234
1235 DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
1236 "Return a newly created string of length LENGTH, with each element being INIT.\n\
1237 Both LENGTH and INIT must be numbers.")
1238 (length, init)
1239 Lisp_Object length, init;
1240 {
1241 register Lisp_Object val;
1242 register unsigned char *p, *end;
1243 int c, nbytes;
1244
1245 CHECK_NATNUM (length, 0);
1246 CHECK_NUMBER (init, 1);
1247
1248 c = XINT (init);
1249 if (SINGLE_BYTE_CHAR_P (c))
1250 {
1251 nbytes = XINT (length);
1252 val = make_uninit_string (nbytes);
1253 p = XSTRING (val)->data;
1254 end = p + XSTRING (val)->size;
1255 while (p != end)
1256 *p++ = c;
1257 }
1258 else
1259 {
1260 unsigned char str[4];
1261 int len = CHAR_STRING (c, str);
1262
1263 nbytes = len * XINT (length);
1264 val = make_uninit_multibyte_string (XINT (length), nbytes);
1265 p = XSTRING (val)->data;
1266 end = p + nbytes;
1267 while (p != end)
1268 {
1269 bcopy (str, p, len);
1270 p += len;
1271 }
1272 }
1273 *p = 0;
1274 return val;
1275 }
1276
1277 DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
1278 "Return a new bool-vector of length LENGTH, using INIT for as each element.\n\
1279 LENGTH must be a number. INIT matters only in whether it is t or nil.")
1280 (length, init)
1281 Lisp_Object length, init;
1282 {
1283 register Lisp_Object val;
1284 struct Lisp_Bool_Vector *p;
1285 int real_init, i;
1286 int length_in_chars, length_in_elts, bits_per_value;
1287
1288 CHECK_NATNUM (length, 0);
1289
1290 bits_per_value = sizeof (EMACS_INT) * BITS_PER_CHAR;
1291
1292 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
1293 length_in_chars = ((XFASTINT (length) + BITS_PER_CHAR - 1) / BITS_PER_CHAR);
1294
1295 /* We must allocate one more elements than LENGTH_IN_ELTS for the
1296 slot `size' of the struct Lisp_Bool_Vector. */
1297 val = Fmake_vector (make_number (length_in_elts + 1), Qnil);
1298 p = XBOOL_VECTOR (val);
1299 /* Get rid of any bits that would cause confusion. */
1300 p->vector_size = 0;
1301 XSETBOOL_VECTOR (val, p);
1302 p->size = XFASTINT (length);
1303
1304 real_init = (NILP (init) ? 0 : -1);
1305 for (i = 0; i < length_in_chars ; i++)
1306 p->data[i] = real_init;
1307 /* Clear the extraneous bits in the last byte. */
1308 if (XINT (length) != length_in_chars * BITS_PER_CHAR)
1309 XBOOL_VECTOR (val)->data[length_in_chars - 1]
1310 &= (1 << (XINT (length) % BITS_PER_CHAR)) - 1;
1311
1312 return val;
1313 }
1314
1315 /* Make a string from NBYTES bytes at CONTENTS,
1316 and compute the number of characters from the contents.
1317 This string may be unibyte or multibyte, depending on the contents. */
1318
1319 Lisp_Object
1320 make_string (contents, nbytes)
1321 char *contents;
1322 int nbytes;
1323 {
1324 register Lisp_Object val;
1325 int nchars = chars_in_text (contents, nbytes);
1326 val = make_uninit_multibyte_string (nchars, nbytes);
1327 bcopy (contents, XSTRING (val)->data, nbytes);
1328 if (STRING_BYTES (XSTRING (val)) == XSTRING (val)->size)
1329 SET_STRING_BYTES (XSTRING (val), -1);
1330 return val;
1331 }
1332
1333 /* Make a unibyte string from LENGTH bytes at CONTENTS. */
1334
1335 Lisp_Object
1336 make_unibyte_string (contents, length)
1337 char *contents;
1338 int length;
1339 {
1340 register Lisp_Object val;
1341 val = make_uninit_string (length);
1342 bcopy (contents, XSTRING (val)->data, length);
1343 SET_STRING_BYTES (XSTRING (val), -1);
1344 return val;
1345 }
1346
1347 /* Make a multibyte string from NCHARS characters
1348 occupying NBYTES bytes at CONTENTS. */
1349
1350 Lisp_Object
1351 make_multibyte_string (contents, nchars, nbytes)
1352 char *contents;
1353 int nchars, nbytes;
1354 {
1355 register Lisp_Object val;
1356 val = make_uninit_multibyte_string (nchars, nbytes);
1357 bcopy (contents, XSTRING (val)->data, nbytes);
1358 return val;
1359 }
1360
1361 /* Make a string from NCHARS characters
1362 occupying NBYTES bytes at CONTENTS.
1363 It is a multibyte string if NBYTES != NCHARS. */
1364
1365 Lisp_Object
1366 make_string_from_bytes (contents, nchars, nbytes)
1367 char *contents;
1368 int nchars, nbytes;
1369 {
1370 register Lisp_Object val;
1371 val = make_uninit_multibyte_string (nchars, nbytes);
1372 bcopy (contents, XSTRING (val)->data, nbytes);
1373 if (STRING_BYTES (XSTRING (val)) == XSTRING (val)->size)
1374 SET_STRING_BYTES (XSTRING (val), -1);
1375 return val;
1376 }
1377
1378 /* Make a string from NCHARS characters
1379 occupying NBYTES bytes at CONTENTS.
1380 The argument MULTIBYTE controls whether to label the
1381 string as multibyte. */
1382
1383 Lisp_Object
1384 make_specified_string (contents, nchars, nbytes, multibyte)
1385 char *contents;
1386 int nchars, nbytes;
1387 int multibyte;
1388 {
1389 register Lisp_Object val;
1390 val = make_uninit_multibyte_string (nchars, nbytes);
1391 bcopy (contents, XSTRING (val)->data, nbytes);
1392 if (!multibyte)
1393 SET_STRING_BYTES (XSTRING (val), -1);
1394 return val;
1395 }
1396
1397 /* Make a string from the data at STR,
1398 treating it as multibyte if the data warrants. */
1399
1400 Lisp_Object
1401 build_string (str)
1402 char *str;
1403 {
1404 return make_string (str, strlen (str));
1405 }
1406
1407 Lisp_Object
1408 make_uninit_string (length)
1409 int length;
1410 {
1411 Lisp_Object val;
1412 val = make_uninit_multibyte_string (length, length);
1413 SET_STRING_BYTES (XSTRING (val), -1);
1414 return val;
1415 }
1416
1417 Lisp_Object
1418 make_uninit_multibyte_string (length, length_byte)
1419 int length, length_byte;
1420 {
1421 register Lisp_Object val;
1422 register int fullsize = STRING_FULLSIZE (length_byte);
1423
1424 if (length < 0) abort ();
1425
1426 if (fullsize <= STRING_BLOCK_SIZE - current_string_block->pos)
1427 /* This string can fit in the current string block */
1428 {
1429 XSETSTRING (val,
1430 ((struct Lisp_String *)
1431 (current_string_block->chars + current_string_block->pos)));
1432 current_string_block->pos += fullsize;
1433 }
1434 else if (fullsize > STRING_BLOCK_OUTSIZE)
1435 /* This string gets its own string block */
1436 {
1437 register struct string_block *new;
1438 #ifdef DOUG_LEA_MALLOC
1439 /* Prevent mmap'ing the chunk (which is potentially very large). */
1440 mallopt (M_MMAP_MAX, 0);
1441 #endif
1442 new = (struct string_block *) lisp_malloc (sizeof (struct string_block_head) + fullsize);
1443 #ifdef DOUG_LEA_MALLOC
1444 /* Back to a reasonable maximum of mmap'ed areas. */
1445 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1446 #endif
1447 n_string_blocks++;
1448 VALIDATE_LISP_STORAGE (new, 0);
1449 consing_since_gc += sizeof (struct string_block_head) + fullsize;
1450 new->pos = fullsize;
1451 new->next = large_string_blocks;
1452 large_string_blocks = new;
1453 XSETSTRING (val,
1454 ((struct Lisp_String *)
1455 ((struct string_block_head *)new + 1)));
1456 }
1457 else
1458 /* Make a new current string block and start it off with this string */
1459 {
1460 register struct string_block *new;
1461 new = (struct string_block *) lisp_malloc (sizeof (struct string_block));
1462 n_string_blocks++;
1463 VALIDATE_LISP_STORAGE (new, sizeof *new);
1464 consing_since_gc += sizeof (struct string_block);
1465 current_string_block->next = new;
1466 new->prev = current_string_block;
1467 new->next = 0;
1468 current_string_block = new;
1469 new->pos = fullsize;
1470 XSETSTRING (val,
1471 (struct Lisp_String *) current_string_block->chars);
1472 }
1473
1474 string_chars_consed += fullsize;
1475 XSTRING (val)->size = length;
1476 SET_STRING_BYTES (XSTRING (val), length_byte);
1477 XSTRING (val)->data[length_byte] = 0;
1478 INITIALIZE_INTERVAL (XSTRING (val), NULL_INTERVAL);
1479
1480 return val;
1481 }
1482 1929
1483 /* Return a newly created vector or string with specified arguments as 1930 /* Return a newly created vector or string with specified arguments as
1484 elements. If all the arguments are characters that can fit 1931 elements. If all the arguments are characters that can fit
1485 in a string of events, make a string; otherwise, make a vector. 1932 in a string of events, make a string; otherwise, make a vector.
1486 1933
1516 } 1963 }
1517 1964
1518 return result; 1965 return result;
1519 } 1966 }
1520 } 1967 }
1968
1969
1521 1970
1522 /* Pure storage management. */ 1971 /***********************************************************************
1523 1972 Pure Storage Management
1524 /* Must get an error if pure storage is full, 1973 ***********************************************************************/
1525 since if it cannot hold a large string 1974
1526 it may be able to hold conses that point to that string; 1975 /* Return a string allocated in pure space. DATA is a buffer holding
1527 then the string is not protected from gc. */ 1976 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
1977 non-zero means make the result string multibyte.
1978
1979 Must get an error if pure storage is full, since if it cannot hold
1980 a large string it may be able to hold conses that point to that
1981 string; then the string is not protected from gc. */
1528 1982
1529 Lisp_Object 1983 Lisp_Object
1530 make_pure_string (data, length, length_byte, multibyte) 1984 make_pure_string (data, nchars, nbytes, multibyte)
1531 char *data; 1985 char *data;
1532 int length; 1986 int nchars, nbytes;
1533 int length_byte;
1534 int multibyte; 1987 int multibyte;
1535 { 1988 {
1536 1989 Lisp_Object string;
1537 register Lisp_Object new; 1990 struct Lisp_String *s;
1538 register int size = STRING_FULLSIZE (length_byte); 1991 int string_size, data_size;
1539 1992
1540 if (pureptr + size > PURESIZE) 1993 #define PAD(SZ) (((SZ) + sizeof (EMACS_INT) - 1) & ~(sizeof (EMACS_INT) - 1))
1994
1995 string_size = PAD (sizeof (struct Lisp_String));
1996 data_size = PAD (nbytes + 1);
1997
1998 #undef PAD
1999
2000 if (pureptr + string_size + data_size > PURESIZE)
1541 error ("Pure Lisp storage exhausted"); 2001 error ("Pure Lisp storage exhausted");
1542 XSETSTRING (new, PUREBEG + pureptr); 2002
1543 XSTRING (new)->size = length; 2003 s = (struct Lisp_String *) (PUREBEG + pureptr);
1544 SET_STRING_BYTES (XSTRING (new), (multibyte ? length_byte : -1)); 2004 pureptr += string_size;
1545 bcopy (data, XSTRING (new)->data, length_byte); 2005 s->data = (unsigned char *) (PUREBEG + pureptr);
1546 XSTRING (new)->data[length_byte] = 0; 2006 pureptr += data_size;
1547 2007
1548 /* We must give strings in pure storage some kind of interval. So we 2008 s->size = nchars;
1549 give them a null one. */ 2009 s->size_byte = multibyte ? nbytes : -1;
1550 XSTRING (new)->intervals = NULL_INTERVAL; 2010 bcopy (data, s->data, nbytes);
1551 pureptr += size; 2011 s->data[nbytes] = '\0';
1552 return new; 2012 s->intervals = NULL_INTERVAL;
1553 } 2013
2014 XSETSTRING (string, s);
2015 return string;
2016 }
2017
1554 2018
1555 Lisp_Object 2019 Lisp_Object
1556 pure_cons (car, cdr) 2020 pure_cons (car, cdr)
1557 Lisp_Object car, cdr; 2021 Lisp_Object car, cdr;
1558 { 2022 {
1667 else if (MARKERP (obj)) 2131 else if (MARKERP (obj))
1668 error ("Attempt to copy a marker to pure storage"); 2132 error ("Attempt to copy a marker to pure storage");
1669 else 2133 else
1670 return obj; 2134 return obj;
1671 } 2135 }
2136
1672 2137
1673 /* Recording what needs to be marked for gc. */ 2138 /* Recording what needs to be marked for gc. */
1674 2139
1675 struct gcpro *gcprolist; 2140 struct gcpro *gcprolist;
1676 2141
1678 2143
1679 Lisp_Object *staticvec[NSTATICS] = {0}; 2144 Lisp_Object *staticvec[NSTATICS] = {0};
1680 2145
1681 int staticidx = 0; 2146 int staticidx = 0;
1682 2147
1683 /* Put an entry in staticvec, pointing at the variable whose address is given */ 2148 /* Put an entry in staticvec, pointing at the variable with address
2149 VARADDRESS. */
1684 2150
1685 void 2151 void
1686 staticpro (varaddress) 2152 staticpro (varaddress)
1687 Lisp_Object *varaddress; 2153 Lisp_Object *varaddress;
1688 { 2154 {
1690 if (staticidx >= NSTATICS) 2156 if (staticidx >= NSTATICS)
1691 abort (); 2157 abort ();
1692 } 2158 }
1693 2159
1694 struct catchtag 2160 struct catchtag
1695 { 2161 {
1696 Lisp_Object tag; 2162 Lisp_Object tag;
1697 Lisp_Object val; 2163 Lisp_Object val;
1698 struct catchtag *next; 2164 struct catchtag *next;
1699 #if 0 /* We don't need this for GC purposes */ 2165 #if 0 /* We don't need this for GC purposes */
1700 jmp_buf jmp; 2166 jmp_buf jmp;
1701 #endif 2167 #endif
1702 }; 2168 };
1703 2169
1704 struct backtrace 2170 struct backtrace
1705 { 2171 {
1706 struct backtrace *next; 2172 struct backtrace *next;
1707 Lisp_Object *function; 2173 Lisp_Object *function;
1708 Lisp_Object *args; /* Points to vector of args. */ 2174 Lisp_Object *args; /* Points to vector of args. */
1709 int nargs; /* length of vector */ 2175 int nargs; /* Length of vector. */
1710 /* if nargs is UNEVALLED, args points to slot holding list of unevalled args */ 2176 /* If nargs is UNEVALLED, args points to slot holding list of
1711 char evalargs; 2177 unevalled args. */
1712 }; 2178 char evalargs;
2179 };
2180
1713 2181
1714 /* Garbage collection! */ 2182 /* Garbage collection! */
1715 2183
1716 /* Temporarily prevent garbage collection. */ 2184 /* Temporarily prevent garbage collection. */
1717 2185
1732 DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "", 2200 DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
1733 "Reclaim storage for Lisp objects no longer needed.\n\ 2201 "Reclaim storage for Lisp objects no longer needed.\n\
1734 Returns info on amount of space in use:\n\ 2202 Returns info on amount of space in use:\n\
1735 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)\n\ 2203 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)\n\
1736 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS\n\ 2204 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS\n\
1737 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS))\n\ 2205 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS\n\
2206 (USED-STRINGS . FREE-STRINGS))\n\
1738 Garbage collection happens automatically if you cons more than\n\ 2207 Garbage collection happens automatically if you cons more than\n\
1739 `gc-cons-threshold' bytes of Lisp data since previous garbage collection.") 2208 `gc-cons-threshold' bytes of Lisp data since previous garbage collection.")
1740 () 2209 ()
1741 { 2210 {
1742 register struct gcpro *tail; 2211 register struct gcpro *tail;
1745 struct handler *handler; 2214 struct handler *handler;
1746 register struct backtrace *backlist; 2215 register struct backtrace *backlist;
1747 char stack_top_variable; 2216 char stack_top_variable;
1748 register int i; 2217 register int i;
1749 int message_p; 2218 int message_p;
2219 Lisp_Object total[7];
1750 2220
1751 /* In case user calls debug_print during GC, 2221 /* In case user calls debug_print during GC,
1752 don't let that cause a recursive GC. */ 2222 don't let that cause a recursive GC. */
1753 consing_since_gc = 0; 2223 consing_since_gc = 0;
1754 2224
1804 } 2274 }
1805 2275
1806 gc_in_progress = 1; 2276 gc_in_progress = 1;
1807 2277
1808 /* clear_marks (); */ 2278 /* clear_marks (); */
1809
1810 /* In each "large string", set the MARKBIT of the size field.
1811 That enables mark_object to recognize them. */
1812 {
1813 register struct string_block *b;
1814 for (b = large_string_blocks; b; b = b->next)
1815 ((struct Lisp_String *)(&b->chars[0]))->size |= MARKBIT;
1816 }
1817 2279
1818 /* Mark all the special slots that serve as the roots of accessibility. 2280 /* Mark all the special slots that serve as the roots of accessibility.
1819 2281
1820 Usually the special slots to mark are contained in particular structures. 2282 Usually the special slots to mark are contained in particular structures.
1821 Then we know no slot is marked twice because the structures don't overlap. 2283 Then we know no slot is marked twice because the structures don't overlap.
1944 else 2406 else
1945 message1_nolog ("Garbage collecting...done"); 2407 message1_nolog ("Garbage collecting...done");
1946 } 2408 }
1947 2409
1948 pop_message (); 2410 pop_message ();
1949 2411
1950 return Fcons (Fcons (make_number (total_conses), 2412 total[0] = Fcons (make_number (total_conses),
1951 make_number (total_free_conses)), 2413 make_number (total_free_conses));
1952 Fcons (Fcons (make_number (total_symbols), 2414 total[1] = Fcons (make_number (total_symbols),
1953 make_number (total_free_symbols)), 2415 make_number (total_free_symbols));
1954 Fcons (Fcons (make_number (total_markers), 2416 total[2] = Fcons (make_number (total_markers),
1955 make_number (total_free_markers)), 2417 make_number (total_free_markers));
1956 Fcons (make_number (total_string_size), 2418 total[3] = Fcons (make_number (total_string_size),
1957 Fcons (make_number (total_vector_size), 2419 make_number (total_vector_size));
1958 Fcons (Fcons
1959 #ifdef LISP_FLOAT_TYPE 2420 #ifdef LISP_FLOAT_TYPE
1960 (make_number (total_floats), 2421 total[4] = Fcons (make_number (total_floats),
1961 make_number (total_free_floats)), 2422 make_number (total_free_floats));
1962 #else /* not LISP_FLOAT_TYPE */ 2423 #else
1963 (make_number (0), make_number (0)), 2424 total[4] = Fcons (make_number (0), make_number (0));
1964 #endif /* not LISP_FLOAT_TYPE */ 2425 #endif
1965 Fcons (Fcons 2426 total[5] = Fcons (make_number (total_intervals),
1966 (make_number (total_intervals), 2427 make_number (total_free_intervals));
1967 make_number (total_free_intervals)), 2428 total[6] = Fcons (make_number (total_strings),
1968 Qnil))))))); 2429 make_number (total_free_strings));
2430
2431 return Flist (7, total);
1969 } 2432 }
1970 2433
1971 #if 0 2434 #if 0
1972 static void 2435 static void
1973 clear_marks () 2436 clear_marks ()
2035 struct glyph_matrix *matrix; 2498 struct glyph_matrix *matrix;
2036 { 2499 {
2037 struct glyph_row *row = matrix->rows; 2500 struct glyph_row *row = matrix->rows;
2038 struct glyph_row *end = row + matrix->nrows; 2501 struct glyph_row *end = row + matrix->nrows;
2039 2502
2040 while (row < end) 2503 for (; row < end; ++row)
2041 { 2504 if (row->enabled_p)
2042 if (row->enabled_p) 2505 {
2043 { 2506 int area;
2044 int area; 2507 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
2045 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area) 2508 {
2046 { 2509 struct glyph *glyph = row->glyphs[area];
2047 struct glyph *glyph = row->glyphs[area]; 2510 struct glyph *end_glyph = glyph + row->used[area];
2048 struct glyph *end_glyph = glyph + row->used[area]; 2511
2049 2512 for (; glyph < end_glyph; ++glyph)
2050 while (glyph < end_glyph) 2513 if (GC_STRINGP (glyph->object)
2051 { 2514 && !STRING_MARKED_P (XSTRING (glyph->object)))
2052 if (GC_STRINGP (glyph->object)) 2515 mark_object (&glyph->object);
2053 mark_object (&glyph->object); 2516 }
2054 ++glyph; 2517 }
2055 }
2056 }
2057 }
2058
2059 ++row;
2060 }
2061 } 2518 }
2062 2519
2063 /* Mark Lisp faces in the face cache C. */ 2520 /* Mark Lisp faces in the face cache C. */
2064 2521
2065 static void 2522 static void
2112 #endif /* HAVE_X_WINDOWS */ 2569 #endif /* HAVE_X_WINDOWS */
2113 2570
2114 2571
2115 2572
2116 /* Mark reference to a Lisp_Object. 2573 /* Mark reference to a Lisp_Object.
2117 If the object referred to has not been seen yet, recursively mark 2574 If the object referred to has not been seen yet, recursively mark
2118 all the references contained in it. 2575 all the references contained in it. */
2119
2120 If the object referenced is a short string, the referencing slot
2121 is threaded into a chain of such slots, pointed to from
2122 the `size' field of the string. The actual string size
2123 lives in the last slot in the chain. We recognize the end
2124 because it is < (unsigned) STRING_BLOCK_SIZE. */
2125 2576
2126 #define LAST_MARKED_SIZE 500 2577 #define LAST_MARKED_SIZE 500
2127 Lisp_Object *last_marked[LAST_MARKED_SIZE]; 2578 Lisp_Object *last_marked[LAST_MARKED_SIZE];
2128 int last_marked_index; 2579 int last_marked_index;
2129 2580
2150 switch (SWITCH_ENUM_CAST (XGCTYPE (obj))) 2601 switch (SWITCH_ENUM_CAST (XGCTYPE (obj)))
2151 { 2602 {
2152 case Lisp_String: 2603 case Lisp_String:
2153 { 2604 {
2154 register struct Lisp_String *ptr = XSTRING (obj); 2605 register struct Lisp_String *ptr = XSTRING (obj);
2155
2156 MARK_INTERVAL_TREE (ptr->intervals); 2606 MARK_INTERVAL_TREE (ptr->intervals);
2157 if (ptr->size & MARKBIT) 2607 MARK_STRING (ptr);
2158 /* A large string. Just set ARRAY_MARK_FLAG. */
2159 ptr->size |= ARRAY_MARK_FLAG;
2160 else
2161 {
2162 /* A small string. Put this reference
2163 into the chain of references to it.
2164 If the address includes MARKBIT, put that bit elsewhere
2165 when we store OBJPTR into the size field. */
2166
2167 if (XMARKBIT (*objptr))
2168 {
2169 XSETFASTINT (*objptr, ptr->size);
2170 XMARK (*objptr);
2171 }
2172 else
2173 XSETFASTINT (*objptr, ptr->size);
2174
2175 if ((EMACS_INT) objptr & DONT_COPY_FLAG)
2176 abort ();
2177 ptr->size = (EMACS_INT) objptr;
2178 if (ptr->size & MARKBIT)
2179 ptr->size ^= MARKBIT | DONT_COPY_FLAG;
2180 }
2181 } 2608 }
2182 break; 2609 break;
2183 2610
2184 case Lisp_Vectorlike: 2611 case Lisp_Vectorlike:
2185 if (GC_BUFFERP (obj)) 2612 if (GC_BUFFERP (obj))
2188 mark_buffer (obj); 2615 mark_buffer (obj);
2189 } 2616 }
2190 else if (GC_SUBRP (obj)) 2617 else if (GC_SUBRP (obj))
2191 break; 2618 break;
2192 else if (GC_COMPILEDP (obj)) 2619 else if (GC_COMPILEDP (obj))
2193 /* We could treat this just like a vector, but it is better 2620 /* We could treat this just like a vector, but it is better to
2194 to save the COMPILED_CONSTANTS element for last and avoid recursion 2621 save the COMPILED_CONSTANTS element for last and avoid
2195 there. */ 2622 recursion there. */
2196 { 2623 {
2197 register struct Lisp_Vector *ptr = XVECTOR (obj); 2624 register struct Lisp_Vector *ptr = XVECTOR (obj);
2198 register EMACS_INT size = ptr->size; 2625 register EMACS_INT size = ptr->size;
2199 /* See comment above under Lisp_Vector. */ 2626 /* See comment above under Lisp_Vector. */
2200 struct Lisp_Vector *volatile ptr1 = ptr; 2627 struct Lisp_Vector *volatile ptr1 = ptr;
2358 if (XMARKBIT (ptr->plist)) break; 2785 if (XMARKBIT (ptr->plist)) break;
2359 XMARK (ptr->plist); 2786 XMARK (ptr->plist);
2360 mark_object ((Lisp_Object *) &ptr->value); 2787 mark_object ((Lisp_Object *) &ptr->value);
2361 mark_object (&ptr->function); 2788 mark_object (&ptr->function);
2362 mark_object (&ptr->plist); 2789 mark_object (&ptr->plist);
2363 XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String); 2790 MARK_INTERVAL_TREE (ptr->name->intervals);
2364 mark_object ((Lisp_Object *) &ptr->name); 2791 MARK_STRING (ptr->name);
2792
2365 /* Note that we do not mark the obarray of the symbol. 2793 /* Note that we do not mark the obarray of the symbol.
2366 It is safe not to do so because nothing accesses that 2794 It is safe not to do so because nothing accesses that
2367 slot except to check whether it is nil. */ 2795 slot except to check whether it is nil. */
2368 ptr = ptr->next; 2796 ptr = ptr->next;
2369 if (ptr) 2797 if (ptr)
2517 2945
2518 mark_object (&XCDR (tail)); 2946 mark_object (&XCDR (tail));
2519 } 2947 }
2520 else 2948 else
2521 mark_object (&buffer->undo_list); 2949 mark_object (&buffer->undo_list);
2522
2523 #if 0
2524 mark_object (buffer->syntax_table);
2525
2526 /* Mark the various string-pointers in the buffer object.
2527 Since the strings may be relocated, we must mark them
2528 in their actual slots. So gc_sweep must convert each slot
2529 back to an ordinary C pointer. */
2530 XSETSTRING (*(Lisp_Object *)&buffer->upcase_table, buffer->upcase_table);
2531 mark_object ((Lisp_Object *)&buffer->upcase_table);
2532 XSETSTRING (*(Lisp_Object *)&buffer->downcase_table, buffer->downcase_table);
2533 mark_object ((Lisp_Object *)&buffer->downcase_table);
2534
2535 XSETSTRING (*(Lisp_Object *)&buffer->sort_table, buffer->sort_table);
2536 mark_object ((Lisp_Object *)&buffer->sort_table);
2537 XSETSTRING (*(Lisp_Object *)&buffer->folding_sort_table, buffer->folding_sort_table);
2538 mark_object ((Lisp_Object *)&buffer->folding_sort_table);
2539 #endif
2540 2950
2541 for (ptr = &buffer->name + 1; 2951 for (ptr = &buffer->name + 1;
2542 (char *)ptr < (char *)buffer + sizeof (struct buffer); 2952 (char *)ptr < (char *)buffer + sizeof (struct buffer);
2543 ptr++) 2953 ptr++)
2544 mark_object (ptr); 2954 mark_object (ptr);
2628 break; 3038 break;
2629 3039
2630 case Lisp_String: 3040 case Lisp_String:
2631 { 3041 {
2632 struct Lisp_String *s = XSTRING (obj); 3042 struct Lisp_String *s = XSTRING (obj);
2633 3043 survives_p = STRING_MARKED_P (s);
2634 if (s->size & MARKBIT)
2635 survives_p = s->size & ARRAY_MARK_FLAG;
2636 else
2637 survives_p = (s->size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE;
2638 } 3044 }
2639 break; 3045 break;
2640 3046
2641 case Lisp_Vectorlike: 3047 case Lisp_Vectorlike:
2642 if (GC_BUFFERP (obj)) 3048 if (GC_BUFFERP (obj))
2673 { 3079 {
2674 /* Remove or mark entries in weak hash tables. 3080 /* Remove or mark entries in weak hash tables.
2675 This must be done before any object is unmarked. */ 3081 This must be done before any object is unmarked. */
2676 sweep_weak_hash_tables (); 3082 sweep_weak_hash_tables ();
2677 3083
2678 total_string_size = 0; 3084 sweep_strings ();
2679 compact_strings ();
2680 3085
2681 /* Put all unmarked conses on free list */ 3086 /* Put all unmarked conses on free list */
2682 { 3087 {
2683 register struct cons_block *cblk; 3088 register struct cons_block *cblk;
2684 struct cons_block **cprev = &cons_block; 3089 struct cons_block **cprev = &cons_block;
2845 this_free++; 3250 this_free++;
2846 } 3251 }
2847 else 3252 else
2848 { 3253 {
2849 num_used++; 3254 num_used++;
2850 sblk->symbols[i].name 3255 UNMARK_STRING (sblk->symbols[i].name);
2851 = XSTRING (*(Lisp_Object *) &sblk->symbols[i].name);
2852 XUNMARK (sblk->symbols[i].plist); 3256 XUNMARK (sblk->symbols[i].plist);
2853 } 3257 }
2854 lim = SYMBOL_BLOCK_SIZE; 3258 lim = SYMBOL_BLOCK_SIZE;
2855 /* If this block contains only free symbols and we have already 3259 /* If this block contains only free symbols and we have already
2856 seen more than two blocks worth of free symbols then deallocate 3260 seen more than two blocks worth of free symbols then deallocate
2871 } 3275 }
2872 total_symbols = num_used; 3276 total_symbols = num_used;
2873 total_free_symbols = num_free; 3277 total_free_symbols = num_free;
2874 } 3278 }
2875 3279
2876 #ifndef standalone
2877 /* Put all unmarked misc's on free list. 3280 /* Put all unmarked misc's on free list.
2878 For a marker, first unchain it from the buffer it points into. */ 3281 For a marker, first unchain it from the buffer it points into. */
2879 { 3282 {
2880 register struct marker_block *mblk; 3283 register struct marker_block *mblk;
2881 struct marker_block **mprev = &marker_block; 3284 struct marker_block **mprev = &marker_block;
2979 } 3382 }
2980 else 3383 else
2981 { 3384 {
2982 XUNMARK (buffer->name); 3385 XUNMARK (buffer->name);
2983 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer)); 3386 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
2984
2985 #if 0
2986 /* Each `struct Lisp_String *' was turned into a Lisp_Object
2987 for purposes of marking and relocation.
2988 Turn them back into C pointers now. */
2989 buffer->upcase_table
2990 = XSTRING (*(Lisp_Object *)&buffer->upcase_table);
2991 buffer->downcase_table
2992 = XSTRING (*(Lisp_Object *)&buffer->downcase_table);
2993 buffer->sort_table
2994 = XSTRING (*(Lisp_Object *)&buffer->sort_table);
2995 buffer->folding_sort_table
2996 = XSTRING (*(Lisp_Object *)&buffer->folding_sort_table);
2997 #endif
2998
2999 prev = buffer, buffer = buffer->next; 3387 prev = buffer, buffer = buffer->next;
3000 } 3388 }
3001 } 3389 }
3002
3003 #endif /* standalone */
3004 3390
3005 /* Free all unmarked vectors */ 3391 /* Free all unmarked vectors */
3006 { 3392 {
3007 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next; 3393 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
3008 total_vector_size = 0; 3394 total_vector_size = 0;
3033 else 3419 else
3034 total_vector_size += vector->size; 3420 total_vector_size += vector->size;
3035 prev = vector, vector = vector->next; 3421 prev = vector, vector = vector->next;
3036 } 3422 }
3037 } 3423 }
3038 3424 }
3039 /* Free all "large strings" not marked with ARRAY_MARK_FLAG. */ 3425
3040 { 3426
3041 register struct string_block *sb = large_string_blocks, *prev = 0, *next; 3427
3042 struct Lisp_String *s;
3043
3044 while (sb)
3045 {
3046 s = (struct Lisp_String *) &sb->chars[0];
3047 if (s->size & ARRAY_MARK_FLAG)
3048 {
3049 ((struct Lisp_String *)(&sb->chars[0]))->size
3050 &= ~ARRAY_MARK_FLAG & ~MARKBIT;
3051 UNMARK_BALANCE_INTERVALS (s->intervals);
3052 total_string_size += ((struct Lisp_String *)(&sb->chars[0]))->size;
3053 prev = sb, sb = sb->next;
3054 }
3055 else
3056 {
3057 if (prev)
3058 prev->next = sb->next;
3059 else
3060 large_string_blocks = sb->next;
3061 next = sb->next;
3062 lisp_free (sb);
3063 sb = next;
3064 n_string_blocks--;
3065 }
3066 }
3067 }
3068 }
3069
3070 /* Compactify strings, relocate references, and free empty string blocks. */
3071
3072 static void
3073 compact_strings ()
3074 {
3075 /* String block of old strings we are scanning. */
3076 register struct string_block *from_sb;
3077 /* A preceding string block (or maybe the same one)
3078 where we are copying the still-live strings to. */
3079 register struct string_block *to_sb;
3080 int pos;
3081 int to_pos;
3082
3083 to_sb = first_string_block;
3084 to_pos = 0;
3085
3086 /* Scan each existing string block sequentially, string by string. */
3087 for (from_sb = first_string_block; from_sb; from_sb = from_sb->next)
3088 {
3089 pos = 0;
3090 /* POS is the index of the next string in the block. */
3091 while (pos < from_sb->pos)
3092 {
3093 register struct Lisp_String *nextstr
3094 = (struct Lisp_String *) &from_sb->chars[pos];
3095
3096 register struct Lisp_String *newaddr;
3097 register EMACS_INT size = nextstr->size;
3098 EMACS_INT size_byte = nextstr->size_byte;
3099
3100 /* NEXTSTR is the old address of the next string.
3101 Just skip it if it isn't marked. */
3102 if (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
3103 {
3104 /* It is marked, so its size field is really a chain of refs.
3105 Find the end of the chain, where the actual size lives. */
3106 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
3107 {
3108 if (size & DONT_COPY_FLAG)
3109 size ^= MARKBIT | DONT_COPY_FLAG;
3110 size = *(EMACS_INT *)size & ~MARKBIT;
3111 }
3112
3113 if (size_byte < 0)
3114 size_byte = size;
3115
3116 total_string_size += size_byte;
3117
3118 /* If it won't fit in TO_SB, close it out,
3119 and move to the next sb. Keep doing so until
3120 TO_SB reaches a large enough, empty enough string block.
3121 We know that TO_SB cannot advance past FROM_SB here
3122 since FROM_SB is large enough to contain this string.
3123 Any string blocks skipped here
3124 will be patched out and freed later. */
3125 while (to_pos + STRING_FULLSIZE (size_byte)
3126 > max (to_sb->pos, STRING_BLOCK_SIZE))
3127 {
3128 to_sb->pos = to_pos;
3129 to_sb = to_sb->next;
3130 to_pos = 0;
3131 }
3132 /* Compute new address of this string
3133 and update TO_POS for the space being used. */
3134 newaddr = (struct Lisp_String *) &to_sb->chars[to_pos];
3135 to_pos += STRING_FULLSIZE (size_byte);
3136
3137 /* Copy the string itself to the new place. */
3138 if (nextstr != newaddr)
3139 bcopy (nextstr, newaddr, STRING_FULLSIZE (size_byte));
3140
3141 /* Go through NEXTSTR's chain of references
3142 and make each slot in the chain point to
3143 the new address of this string. */
3144 size = newaddr->size;
3145 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
3146 {
3147 register Lisp_Object *objptr;
3148 if (size & DONT_COPY_FLAG)
3149 size ^= MARKBIT | DONT_COPY_FLAG;
3150 objptr = (Lisp_Object *)size;
3151
3152 size = XFASTINT (*objptr) & ~MARKBIT;
3153 if (XMARKBIT (*objptr))
3154 {
3155 XSETSTRING (*objptr, newaddr);
3156 XMARK (*objptr);
3157 }
3158 else
3159 XSETSTRING (*objptr, newaddr);
3160 }
3161 /* Store the actual size in the size field. */
3162 newaddr->size = size;
3163
3164 /* Now that the string has been relocated, rebalance its
3165 interval tree, and update the tree's parent pointer. */
3166 if (! NULL_INTERVAL_P (newaddr->intervals))
3167 {
3168 UNMARK_BALANCE_INTERVALS (newaddr->intervals);
3169 XSETSTRING (* (Lisp_Object *) &newaddr->intervals->parent,
3170 newaddr);
3171 }
3172 }
3173 else if (size_byte < 0)
3174 size_byte = size;
3175
3176 pos += STRING_FULLSIZE (size_byte);
3177 }
3178 }
3179
3180 /* Close out the last string block still used and free any that follow. */
3181 to_sb->pos = to_pos;
3182 current_string_block = to_sb;
3183
3184 from_sb = to_sb->next;
3185 to_sb->next = 0;
3186 while (from_sb)
3187 {
3188 to_sb = from_sb->next;
3189 lisp_free (from_sb);
3190 n_string_blocks--;
3191 from_sb = to_sb;
3192 }
3193
3194 /* Free any empty string blocks further back in the chain.
3195 This loop will never free first_string_block, but it is very
3196 unlikely that that one will become empty, so why bother checking? */
3197
3198 from_sb = first_string_block;
3199 while ((to_sb = from_sb->next) != 0)
3200 {
3201 if (to_sb->pos == 0)
3202 {
3203 if ((from_sb->next = to_sb->next) != 0)
3204 from_sb->next->prev = from_sb;
3205 lisp_free (to_sb);
3206 n_string_blocks--;
3207 }
3208 else
3209 from_sb = to_sb;
3210 }
3211 }
3212 3428
3213 /* Debugging aids. */ 3429 /* Debugging aids. */
3214 3430
3215 DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0, 3431 DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
3216 "Return the address of the last byte Emacs has allocated, divided by 1024.\n\ 3432 "Return the address of the last byte Emacs has allocated, divided by 1024.\n\
3229 "Return a list of counters that measure how much consing there has been.\n\ 3445 "Return a list of counters that measure how much consing there has been.\n\
3230 Each of these counters increments for a certain kind of object.\n\ 3446 Each of these counters increments for a certain kind of object.\n\
3231 The counters wrap around from the largest positive integer to zero.\n\ 3447 The counters wrap around from the largest positive integer to zero.\n\
3232 Garbage collection does not decrease them.\n\ 3448 Garbage collection does not decrease them.\n\
3233 The elements of the value are as follows:\n\ 3449 The elements of the value are as follows:\n\
3234 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS)\n\ 3450 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)\n\
3235 All are in units of 1 = one object consed\n\ 3451 All are in units of 1 = one object consed\n\
3236 except for VECTOR-CELLS and STRING-CHARS, which count the total length of\n\ 3452 except for VECTOR-CELLS and STRING-CHARS, which count the total length of\n\
3237 objects consed.\n\ 3453 objects consed.\n\
3238 MISCS include overlays, markers, and some internal types.\n\ 3454 MISCS include overlays, markers, and some internal types.\n\
3239 Frames, windows, buffers, and subprocesses count as vectors\n\ 3455 Frames, windows, buffers, and subprocesses count as vectors\n\
3240 (but the contents of a buffer's text do not count here).") 3456 (but the contents of a buffer's text do not count here).")
3241 () 3457 ()
3242 { 3458 {
3243 Lisp_Object lisp_cons_cells_consed; 3459 Lisp_Object consed[8];
3244 Lisp_Object lisp_floats_consed; 3460
3245 Lisp_Object lisp_vector_cells_consed; 3461 XSETINT (consed[0],
3246 Lisp_Object lisp_symbols_consed;
3247 Lisp_Object lisp_string_chars_consed;
3248 Lisp_Object lisp_misc_objects_consed;
3249 Lisp_Object lisp_intervals_consed;
3250
3251 XSETINT (lisp_cons_cells_consed,
3252 cons_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1))); 3462 cons_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3253 XSETINT (lisp_floats_consed, 3463 XSETINT (consed[1],
3254 floats_consed & ~(((EMACS_INT) 1) << (VALBITS - 1))); 3464 floats_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3255 XSETINT (lisp_vector_cells_consed, 3465 XSETINT (consed[2],
3256 vector_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1))); 3466 vector_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3257 XSETINT (lisp_symbols_consed, 3467 XSETINT (consed[3],
3258 symbols_consed & ~(((EMACS_INT) 1) << (VALBITS - 1))); 3468 symbols_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3259 XSETINT (lisp_string_chars_consed, 3469 XSETINT (consed[4],
3260 string_chars_consed & ~(((EMACS_INT) 1) << (VALBITS - 1))); 3470 string_chars_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3261 XSETINT (lisp_misc_objects_consed, 3471 XSETINT (consed[5],
3262 misc_objects_consed & ~(((EMACS_INT) 1) << (VALBITS - 1))); 3472 misc_objects_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3263 XSETINT (lisp_intervals_consed, 3473 XSETINT (consed[6],
3264 intervals_consed & ~(((EMACS_INT) 1) << (VALBITS - 1))); 3474 intervals_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3265 3475 XSETINT (consed[7],
3266 return Fcons (lisp_cons_cells_consed, 3476 strings_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
3267 Fcons (lisp_floats_consed, 3477
3268 Fcons (lisp_vector_cells_consed, 3478 return Flist (8, consed);
3269 Fcons (lisp_symbols_consed,
3270 Fcons (lisp_string_chars_consed,
3271 Fcons (lisp_misc_objects_consed,
3272 Fcons (lisp_intervals_consed,
3273 Qnil)))))));
3274 } 3479 }
3275 3480
3276 /* Initialization */ 3481 /* Initialization */
3277 3482
3278 void 3483 void
3359 "Number of miscellaneous objects that have been consed so far."); 3564 "Number of miscellaneous objects that have been consed so far.");
3360 3565
3361 DEFVAR_INT ("intervals-consed", &intervals_consed, 3566 DEFVAR_INT ("intervals-consed", &intervals_consed,
3362 "Number of intervals that have been consed so far."); 3567 "Number of intervals that have been consed so far.");
3363 3568
3569 DEFVAR_INT ("strings-consed", &strings_consed,
3570 "Number of strings that have been consed so far.");
3571
3364 #if 0 3572 #if 0
3365 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used, 3573 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used,
3366 "Number of bytes of unshared memory allocated in this session."); 3574 "Number of bytes of unshared memory allocated in this session.");
3367 3575
3368 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused, 3576 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused,