comparison src/alloc.c @ 428:3ecd8885ac67 r21-2-22

Import from CVS: tag r21-2-22
author cvs
date Mon, 13 Aug 2007 11:28:15 +0200
parents
children 84b14dcb0985
comparison
equal deleted inserted replaced
427:0a0253eac470 428:3ecd8885ac67
1 /* Storage allocation and gc for XEmacs Lisp interpreter.
2 Copyright (C) 1985-1998 Free Software Foundation, Inc.
3 Copyright (C) 1995 Sun Microsystems, Inc.
4 Copyright (C) 1995, 1996 Ben Wing.
5
6 This file is part of XEmacs.
7
8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with XEmacs; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /* Synched up with: FSF 19.28, Mule 2.0. Substantially different from
24 FSF. */
25
26 /* Authorship:
27
28 FSF: Original version; a long time ago.
29 Mly: Significantly rewritten to use new 3-bit tags and
30 nicely abstracted object definitions, for 19.8.
31 JWZ: Improved code to keep track of purespace usage and
32 issue nice purespace and GC stats.
33 Ben Wing: Cleaned up frob-block lrecord code, added error-checking
34 and various changes for Mule, for 19.12.
35 Added bit vectors for 19.13.
36 Added lcrecord lists for 19.14.
37 slb: Lots of work on the purification and dump time code.
38 Synched Doug Lea malloc support from Emacs 20.2.
39 og: Killed the purespace. Portable dumper.
40 */
41
42 #include <config.h>
43 #include "lisp.h"
44
45 #include "backtrace.h"
46 #include "buffer.h"
47 #include "bytecode.h"
48 #include "chartab.h"
49 #include "device.h"
50 #include "elhash.h"
51 #include "events.h"
52 #include "extents.h"
53 #include "frame.h"
54 #include "glyphs.h"
55 #include "opaque.h"
56 #include "redisplay.h"
57 #include "specifier.h"
58 #include "sysfile.h"
59 #include "window.h"
60 #include "console-stream.h"
61
62 #ifdef DOUG_LEA_MALLOC
63 #include <malloc.h>
64 #endif
65
66 #ifdef HAVE_MMAP
67 #include <unistd.h>
68 #include <sys/mman.h>
69 #endif
70
71 #ifdef PDUMP
72 typedef struct
73 {
74 const struct lrecord_description *desc;
75 int count;
76 } pdump_reloc_table;
77
78 static char *pdump_rt_list = 0;
79 #endif
80
81 EXFUN (Fgarbage_collect, 0);
82
83 /* Return the true size of a struct with a variable-length array field. */
84 #define STRETCHY_STRUCT_SIZEOF(stretchy_struct_type, \
85 stretchy_array_field, \
86 stretchy_array_length) \
87 (offsetof (stretchy_struct_type, stretchy_array_field) + \
88 (offsetof (stretchy_struct_type, stretchy_array_field[1]) - \
89 offsetof (stretchy_struct_type, stretchy_array_field[0])) * \
90 (stretchy_array_length))
91
92 #if 0 /* this is _way_ too slow to be part of the standard debug options */
93 #if defined(DEBUG_XEMACS) && defined(MULE)
94 #define VERIFY_STRING_CHARS_INTEGRITY
95 #endif
96 #endif
97
98 /* Define this to use malloc/free with no freelist for all datatypes,
99 the hope being that some debugging tools may help detect
100 freed memory references */
101 #ifdef USE_DEBUG_MALLOC /* Taking the above comment at face value -slb */
102 #include <dmalloc.h>
103 #define ALLOC_NO_POOLS
104 #endif
105
106 #ifdef DEBUG_XEMACS
107 static int debug_allocation;
108 static int debug_allocation_backtrace_length;
109 #endif
110
111 /* Number of bytes of consing done since the last gc */
112 EMACS_INT consing_since_gc;
113 #define INCREMENT_CONS_COUNTER_1(size) (consing_since_gc += (size))
114
115 #define debug_allocation_backtrace() \
116 do { \
117 if (debug_allocation_backtrace_length > 0) \
118 debug_short_backtrace (debug_allocation_backtrace_length); \
119 } while (0)
120
121 #ifdef DEBUG_XEMACS
122 #define INCREMENT_CONS_COUNTER(foosize, type) \
123 do { \
124 if (debug_allocation) \
125 { \
126 stderr_out ("allocating %s (size %ld)\n", type, (long)foosize); \
127 debug_allocation_backtrace (); \
128 } \
129 INCREMENT_CONS_COUNTER_1 (foosize); \
130 } while (0)
131 #define NOSEEUM_INCREMENT_CONS_COUNTER(foosize, type) \
132 do { \
133 if (debug_allocation > 1) \
134 { \
135 stderr_out ("allocating noseeum %s (size %ld)\n", type, (long)foosize); \
136 debug_allocation_backtrace (); \
137 } \
138 INCREMENT_CONS_COUNTER_1 (foosize); \
139 } while (0)
140 #else
141 #define INCREMENT_CONS_COUNTER(size, type) INCREMENT_CONS_COUNTER_1 (size)
142 #define NOSEEUM_INCREMENT_CONS_COUNTER(size, type) \
143 INCREMENT_CONS_COUNTER_1 (size)
144 #endif
145
146 #define DECREMENT_CONS_COUNTER(size) do { \
147 consing_since_gc -= (size); \
148 if (consing_since_gc < 0) \
149 consing_since_gc = 0; \
150 } while (0)
151
152 /* Number of bytes of consing since gc before another gc should be done. */
153 EMACS_INT gc_cons_threshold;
154
155 /* Nonzero during gc */
156 int gc_in_progress;
157
158 /* Number of times GC has happened at this level or below.
159 * Level 0 is most volatile, contrary to usual convention.
160 * (Of course, there's only one level at present) */
161 EMACS_INT gc_generation_number[1];
162
163 /* This is just for use by the printer, to allow things to print uniquely */
164 static int lrecord_uid_counter;
165
166 /* Nonzero when calling certain hooks or doing other things where
167 a GC would be bad */
168 int gc_currently_forbidden;
169
170 /* Hooks. */
171 Lisp_Object Vpre_gc_hook, Qpre_gc_hook;
172 Lisp_Object Vpost_gc_hook, Qpost_gc_hook;
173
174 /* "Garbage collecting" */
175 Lisp_Object Vgc_message;
176 Lisp_Object Vgc_pointer_glyph;
177 static CONST char gc_default_message[] = "Garbage collecting";
178 Lisp_Object Qgarbage_collecting;
179
180 #ifndef VIRT_ADDR_VARIES
181 extern
182 #endif /* VIRT_ADDR_VARIES */
183 EMACS_INT malloc_sbrk_used;
184
185 #ifndef VIRT_ADDR_VARIES
186 extern
187 #endif /* VIRT_ADDR_VARIES */
188 EMACS_INT malloc_sbrk_unused;
189
190 /* Non-zero means we're in the process of doing the dump */
191 int purify_flag;
192
193 #ifdef ERROR_CHECK_TYPECHECK
194
195 Error_behavior ERROR_ME, ERROR_ME_NOT, ERROR_ME_WARN;
196
197 #endif
198
199 int
200 c_readonly (Lisp_Object obj)
201 {
202 return POINTER_TYPE_P (XTYPE (obj)) && C_READONLY (obj);
203 }
204
205 int
206 lisp_readonly (Lisp_Object obj)
207 {
208 return POINTER_TYPE_P (XTYPE (obj)) && LISP_READONLY (obj);
209 }
210
211
212 /* Maximum amount of C stack to save when a GC happens. */
213
214 #ifndef MAX_SAVE_STACK
215 #define MAX_SAVE_STACK 0 /* 16000 */
216 #endif
217
218 /* Non-zero means ignore malloc warnings. Set during initialization. */
219 int ignore_malloc_warnings;
220
221
222 static void *breathing_space;
223
224 void
225 release_breathing_space (void)
226 {
227 if (breathing_space)
228 {
229 void *tmp = breathing_space;
230 breathing_space = 0;
231 xfree (tmp);
232 }
233 }
234
235 /* malloc calls this if it finds we are near exhausting storage */
236 void
237 malloc_warning (CONST char *str)
238 {
239 if (ignore_malloc_warnings)
240 return;
241
242 warn_when_safe
243 (Qmemory, Qcritical,
244 "%s\n"
245 "Killing some buffers may delay running out of memory.\n"
246 "However, certainly by the time you receive the 95%% warning,\n"
247 "you should clean up, kill this Emacs, and start a new one.",
248 str);
249 }
250
251 /* Called if malloc returns zero */
252 DOESNT_RETURN
253 memory_full (void)
254 {
255 /* Force a GC next time eval is called.
256 It's better to loop garbage-collecting (we might reclaim enough
257 to win) than to loop beeping and barfing "Memory exhausted"
258 */
259 consing_since_gc = gc_cons_threshold + 1;
260 release_breathing_space ();
261
262 /* Flush some histories which might conceivably contain garbalogical
263 inhibitors. */
264 if (!NILP (Fboundp (Qvalues)))
265 Fset (Qvalues, Qnil);
266 Vcommand_history = Qnil;
267
268 error ("Memory exhausted");
269 }
270
271 /* like malloc and realloc but check for no memory left, and block input. */
272
273 #ifdef xmalloc
274 #undef xmalloc
275 #endif
276
277 void *
278 xmalloc (size_t size)
279 {
280 void *val = malloc (size);
281
282 if (!val && (size != 0)) memory_full ();
283 return val;
284 }
285
286 #ifdef xcalloc
287 #undef xcalloc
288 #endif
289
290 static void *
291 xcalloc (size_t nelem, size_t elsize)
292 {
293 void *val = calloc (nelem, elsize);
294
295 if (!val && (nelem != 0)) memory_full ();
296 return val;
297 }
298
299 void *
300 xmalloc_and_zero (size_t size)
301 {
302 return xcalloc (size, sizeof (char));
303 }
304
305 #ifdef xrealloc
306 #undef xrealloc
307 #endif
308
309 void *
310 xrealloc (void *block, size_t size)
311 {
312 /* We must call malloc explicitly when BLOCK is 0, since some
313 reallocs don't do this. */
314 void *val = block ? realloc (block, size) : malloc (size);
315
316 if (!val && (size != 0)) memory_full ();
317 return val;
318 }
319
320 void
321 #ifdef ERROR_CHECK_MALLOC
322 xfree_1 (void *block)
323 #else
324 xfree (void *block)
325 #endif
326 {
327 #ifdef ERROR_CHECK_MALLOC
328 /* Unbelievably, calling free() on 0xDEADBEEF doesn't cause an
329 error until much later on for many system mallocs, such as
330 the one that comes with Solaris 2.3. FMH!! */
331 assert (block != (void *) 0xDEADBEEF);
332 assert (block);
333 #endif /* ERROR_CHECK_MALLOC */
334 free (block);
335 }
336
337 #ifdef ERROR_CHECK_GC
338
339 #if SIZEOF_INT == 4
340 typedef unsigned int four_byte_t;
341 #elif SIZEOF_LONG == 4
342 typedef unsigned long four_byte_t;
343 #elif SIZEOF_SHORT == 4
344 typedef unsigned short four_byte_t;
345 #else
346 What kind of strange-ass system are we running on?
347 #endif
348
349 static void
350 deadbeef_memory (void *ptr, size_t size)
351 {
352 four_byte_t *ptr4 = (four_byte_t *) ptr;
353 size_t beefs = size >> 2;
354
355 /* In practice, size will always be a multiple of four. */
356 while (beefs--)
357 (*ptr4++) = 0xDEADBEEF;
358 }
359
360 #else /* !ERROR_CHECK_GC */
361
362
363 #define deadbeef_memory(ptr, size)
364
365 #endif /* !ERROR_CHECK_GC */
366
367 #ifdef xstrdup
368 #undef xstrdup
369 #endif
370
371 char *
372 xstrdup (CONST char *str)
373 {
374 int len = strlen (str) + 1; /* for stupid terminating 0 */
375
376 void *val = xmalloc (len);
377 if (val == 0) return 0;
378 return (char *) memcpy (val, str, len);
379 }
380
381 #ifdef NEED_STRDUP
382 char *
383 strdup (CONST char *s)
384 {
385 return xstrdup (s);
386 }
387 #endif /* NEED_STRDUP */
388
389
390 static void *
391 allocate_lisp_storage (size_t size)
392 {
393 return xmalloc (size);
394 }
395
396
397 /* lrecords are chained together through their "next.v" field.
398 * After doing the mark phase, the GC will walk this linked
399 * list and free any record which hasn't been marked.
400 */
401 static struct lcrecord_header *all_lcrecords;
402
403 void *
404 alloc_lcrecord (size_t size, CONST struct lrecord_implementation *implementation)
405 {
406 struct lcrecord_header *lcheader;
407
408 #ifdef ERROR_CHECK_GC
409 if (implementation->static_size == 0)
410 assert (implementation->size_in_bytes_method);
411 else
412 assert (implementation->static_size == size);
413 #endif
414
415 lcheader = (struct lcrecord_header *) allocate_lisp_storage (size);
416 set_lheader_implementation (&(lcheader->lheader), implementation);
417 lcheader->next = all_lcrecords;
418 #if 1 /* mly prefers to see small ID numbers */
419 lcheader->uid = lrecord_uid_counter++;
420 #else /* jwz prefers to see real addrs */
421 lcheader->uid = (int) &lcheader;
422 #endif
423 lcheader->free = 0;
424 all_lcrecords = lcheader;
425 INCREMENT_CONS_COUNTER (size, implementation->name);
426 return lcheader;
427 }
428
429 #if 0 /* Presently unused */
430 /* Very, very poor man's EGC?
431 * This may be slow and thrash pages all over the place.
432 * Only call it if you really feel you must (and if the
433 * lrecord was fairly recently allocated).
434 * Otherwise, just let the GC do its job -- that's what it's there for
435 */
436 void
437 free_lcrecord (struct lcrecord_header *lcrecord)
438 {
439 if (all_lcrecords == lcrecord)
440 {
441 all_lcrecords = lcrecord->next;
442 }
443 else
444 {
445 struct lrecord_header *header = all_lcrecords;
446 for (;;)
447 {
448 struct lrecord_header *next = header->next;
449 if (next == lcrecord)
450 {
451 header->next = lrecord->next;
452 break;
453 }
454 else if (next == 0)
455 abort ();
456 else
457 header = next;
458 }
459 }
460 if (lrecord->implementation->finalizer)
461 lrecord->implementation->finalizer (lrecord, 0);
462 xfree (lrecord);
463 return;
464 }
465 #endif /* Unused */
466
467
468 static void
469 disksave_object_finalization_1 (void)
470 {
471 struct lcrecord_header *header;
472
473 for (header = all_lcrecords; header; header = header->next)
474 {
475 if (LHEADER_IMPLEMENTATION(&header->lheader)->finalizer &&
476 !header->free)
477 ((LHEADER_IMPLEMENTATION(&header->lheader)->finalizer)
478 (header, 1));
479 }
480 }
481
482 /* Semi-kludge -- lrecord_symbol_value_forward objects get stuck
483 in CONST space and you get SEGV's if you attempt to mark them.
484 This sits in lheader->implementation->marker. */
485
486 Lisp_Object
487 this_one_is_unmarkable (Lisp_Object obj)
488 {
489 abort ();
490 return Qnil;
491 }
492
493
494 /************************************************************************/
495 /* Debugger support */
496 /************************************************************************/
497 /* Give gdb/dbx enough information to decode Lisp Objects. We make
498 sure certain symbols are always defined, so gdb doesn't complain
499 about expressions in src/gdbinit. See src/gdbinit or src/dbxrc to
500 see how this is used. */
501
502 EMACS_UINT dbg_valmask = ((1UL << VALBITS) - 1) << GCBITS;
503 EMACS_UINT dbg_typemask = (1UL << GCTYPEBITS) - 1;
504
505 #ifdef USE_UNION_TYPE
506 unsigned char dbg_USE_UNION_TYPE = 1;
507 #else
508 unsigned char dbg_USE_UNION_TYPE = 0;
509 #endif
510
511 unsigned char Lisp_Type_Int = 100;
512 unsigned char Lisp_Type_Cons = 101;
513 unsigned char Lisp_Type_String = 102;
514 unsigned char Lisp_Type_Vector = 103;
515 unsigned char Lisp_Type_Symbol = 104;
516
517 #ifndef MULE
518 unsigned char lrecord_char_table_entry;
519 unsigned char lrecord_charset;
520 #ifndef FILE_CODING
521 unsigned char lrecord_coding_system;
522 #endif
523 #endif
524
525 #ifndef HAVE_TOOLBARS
526 unsigned char lrecord_toolbar_button;
527 #endif
528
529 #ifndef TOOLTALK
530 unsigned char lrecord_tooltalk_message;
531 unsigned char lrecord_tooltalk_pattern;
532 #endif
533
534 #ifndef HAVE_DATABASE
535 unsigned char lrecord_database;
536 #endif
537
538 unsigned char dbg_valbits = VALBITS;
539 unsigned char dbg_gctypebits = GCTYPEBITS;
540
541 /* Macros turned into functions for ease of debugging.
542 Debuggers don't know about macros! */
543 int dbg_eq (Lisp_Object obj1, Lisp_Object obj2);
544 int
545 dbg_eq (Lisp_Object obj1, Lisp_Object obj2)
546 {
547 return EQ (obj1, obj2);
548 }
549
550
551 /************************************************************************/
552 /* Fixed-size type macros */
553 /************************************************************************/
554
555 /* For fixed-size types that are commonly used, we malloc() large blocks
556 of memory at a time and subdivide them into chunks of the correct
557 size for an object of that type. This is more efficient than
558 malloc()ing each object separately because we save on malloc() time
559 and overhead due to the fewer number of malloc()ed blocks, and
560 also because we don't need any extra pointers within each object
561 to keep them threaded together for GC purposes. For less common
562 (and frequently large-size) types, we use lcrecords, which are
563 malloc()ed individually and chained together through a pointer
564 in the lcrecord header. lcrecords do not need to be fixed-size
565 (i.e. two objects of the same type need not have the same size;
566 however, the size of a particular object cannot vary dynamically).
567 It is also much easier to create a new lcrecord type because no
568 additional code needs to be added to alloc.c. Finally, lcrecords
569 may be more efficient when there are only a small number of them.
570
571 The types that are stored in these large blocks (or "frob blocks")
572 are cons, float, compiled-function, symbol, marker, extent, event,
573 and string.
574
575 Note that strings are special in that they are actually stored in
576 two parts: a structure containing information about the string, and
577 the actual data associated with the string. The former structure
578 (a struct Lisp_String) is a fixed-size structure and is managed the
579 same way as all the other such types. This structure contains a
580 pointer to the actual string data, which is stored in structures of
581 type struct string_chars_block. Each string_chars_block consists
582 of a pointer to a struct Lisp_String, followed by the data for that
583 string, followed by another pointer to a struct Lisp_String,
584 followed by the data for that string, etc. At GC time, the data in
585 these blocks is compacted by searching sequentially through all the
586 blocks and compressing out any holes created by unmarked strings.
587 Strings that are more than a certain size (bigger than the size of
588 a string_chars_block, although something like half as big might
589 make more sense) are malloc()ed separately and not stored in
590 string_chars_blocks. Furthermore, no one string stretches across
591 two string_chars_blocks.
592
593 Vectors are each malloc()ed separately, similar to lcrecords.
594
595 In the following discussion, we use conses, but it applies equally
596 well to the other fixed-size types.
597
598 We store cons cells inside of cons_blocks, allocating a new
599 cons_block with malloc() whenever necessary. Cons cells reclaimed
600 by GC are put on a free list to be reallocated before allocating
601 any new cons cells from the latest cons_block. Each cons_block is
602 just under 2^n - MALLOC_OVERHEAD bytes long, since malloc (at least
603 the versions in malloc.c and gmalloc.c) really allocates in units
604 of powers of two and uses 4 bytes for its own overhead.
605
606 What GC actually does is to search through all the cons_blocks,
607 from the most recently allocated to the oldest, and put all
608 cons cells that are not marked (whether or not they're already
609 free) on a cons_free_list. The cons_free_list is a stack, and
610 so the cons cells in the oldest-allocated cons_block end up
611 at the head of the stack and are the first to be reallocated.
612 If any cons_block is entirely free, it is freed with free()
613 and its cons cells removed from the cons_free_list. Because
614 the cons_free_list ends up basically in memory order, we have
615 a high locality of reference (assuming a reasonable turnover
616 of allocating and freeing) and have a reasonable probability
617 of entirely freeing up cons_blocks that have been more recently
618 allocated. This stage is called the "sweep stage" of GC, and
619 is executed after the "mark stage", which involves starting
620 from all places that are known to point to in-use Lisp objects
621 (e.g. the obarray, where are all symbols are stored; the
622 current catches and condition-cases; the backtrace list of
623 currently executing functions; the gcpro list; etc.) and
624 recursively marking all objects that are accessible.
625
626 At the beginning of the sweep stage, the conses in the cons
627 blocks are in one of three states: in use and marked, in use
628 but not marked, and not in use (already freed). Any conses
629 that are marked have been marked in the mark stage just
630 executed, because as part of the sweep stage we unmark any
631 marked objects. The way we tell whether or not a cons cell
632 is in use is through the FREE_STRUCT_P macro. This basically
633 looks at the first 4 bytes (or however many bytes a pointer
634 fits in) to see if all the bits in those bytes are 1. The
635 resulting value (0xFFFFFFFF) is not a valid pointer and is
636 not a valid Lisp_Object. All current fixed-size types have
637 a pointer or Lisp_Object as their first element with the
638 exception of strings; they have a size value, which can
639 never be less than zero, and so 0xFFFFFFFF is invalid for
640 strings as well. Now assuming that a cons cell is in use,
641 the way we tell whether or not it is marked is to look at
642 the mark bit of its car (each Lisp_Object has one bit
643 reserved as a mark bit, in case it's needed). Note that
644 different types of objects use different fields to indicate
645 whether the object is marked, but the principle is the same.
646
647 Conses on the free_cons_list are threaded through a pointer
648 stored in the bytes directly after the bytes that are set
649 to 0xFFFFFFFF (we cannot overwrite these because the cons
650 is still in a cons_block and needs to remain marked as
651 not in use for the next time that GC happens). This
652 implies that all fixed-size types must be at least big
653 enough to store two pointers, which is indeed the case
654 for all current fixed-size types.
655
656 Some types of objects need additional "finalization" done
657 when an object is converted from in use to not in use;
658 this is the purpose of the ADDITIONAL_FREE_type macro.
659 For example, markers need to be removed from the chain
660 of markers that is kept in each buffer. This is because
661 markers in a buffer automatically disappear if the marker
662 is no longer referenced anywhere (the same does not
663 apply to extents, however).
664
665 WARNING: Things are in an extremely bizarre state when
666 the ADDITIONAL_FREE_type macros are called, so beware!
667
668 When ERROR_CHECK_GC is defined, we do things differently
669 so as to maximize our chances of catching places where
670 there is insufficient GCPROing. The thing we want to
671 avoid is having an object that we're using but didn't
672 GCPRO get freed by GC and then reallocated while we're
673 in the process of using it -- this will result in something
674 seemingly unrelated getting trashed, and is extremely
675 difficult to track down. If the object gets freed but
676 not reallocated, we can usually catch this because we
677 set all bytes of a freed object to 0xDEADBEEF. (The
678 first four bytes, however, are 0xFFFFFFFF, and the next
679 four are a pointer used to chain freed objects together;
680 we play some tricks with this pointer to make it more
681 bogus, so crashes are more likely to occur right away.)
682
683 We want freed objects to stay free as long as possible,
684 so instead of doing what we do above, we maintain the
685 free objects in a first-in first-out queue. We also
686 don't recompute the free list each GC, unlike above;
687 this ensures that the queue ordering is preserved.
688 [This means that we are likely to have worse locality
689 of reference, and that we can never free a frob block
690 once it's allocated. (Even if we know that all cells
691 in it are free, there's no easy way to remove all those
692 cells from the free list because the objects on the
693 free list are unlikely to be in memory order.)]
694 Furthermore, we never take objects off the free list
695 unless there's a large number (usually 1000, but
696 varies depending on type) of them already on the list.
697 This way, we ensure that an object that gets freed will
698 remain free for the next 1000 (or whatever) times that
699 an object of that type is allocated.
700 */
701
702 #ifndef MALLOC_OVERHEAD
703 #ifdef GNU_MALLOC
704 #define MALLOC_OVERHEAD 0
705 #elif defined (rcheck)
706 #define MALLOC_OVERHEAD 20
707 #else
708 #define MALLOC_OVERHEAD 8
709 #endif
710 #endif /* MALLOC_OVERHEAD */
711
712 #if !defined(HAVE_MMAP) || defined(DOUG_LEA_MALLOC)
713 /* If we released our reserve (due to running out of memory),
714 and we have a fair amount free once again,
715 try to set aside another reserve in case we run out once more.
716
717 This is called when a relocatable block is freed in ralloc.c. */
718 void refill_memory_reserve (void);
719 void
720 refill_memory_reserve ()
721 {
722 if (breathing_space == 0)
723 breathing_space = (char *) malloc (4096 - MALLOC_OVERHEAD);
724 }
725 #endif
726
727 #ifdef ALLOC_NO_POOLS
728 # define TYPE_ALLOC_SIZE(type, structtype) 1
729 #else
730 # define TYPE_ALLOC_SIZE(type, structtype) \
731 ((2048 - MALLOC_OVERHEAD - sizeof (struct type##_block *)) \
732 / sizeof (structtype))
733 #endif /* ALLOC_NO_POOLS */
734
735 #define DECLARE_FIXED_TYPE_ALLOC(type, structtype) \
736 \
737 struct type##_block \
738 { \
739 struct type##_block *prev; \
740 structtype block[TYPE_ALLOC_SIZE (type, structtype)]; \
741 }; \
742 \
743 static struct type##_block *current_##type##_block; \
744 static int current_##type##_block_index; \
745 \
746 static structtype *type##_free_list; \
747 static structtype *type##_free_list_tail; \
748 \
749 static void \
750 init_##type##_alloc (void) \
751 { \
752 current_##type##_block = 0; \
753 current_##type##_block_index = \
754 countof (current_##type##_block->block); \
755 type##_free_list = 0; \
756 type##_free_list_tail = 0; \
757 } \
758 \
759 static int gc_count_num_##type##_in_use; \
760 static int gc_count_num_##type##_freelist
761
762 #define ALLOCATE_FIXED_TYPE_FROM_BLOCK(type, result) do { \
763 if (current_##type##_block_index \
764 == countof (current_##type##_block->block)) \
765 { \
766 struct type##_block *AFTFB_new = (struct type##_block *) \
767 allocate_lisp_storage (sizeof (struct type##_block)); \
768 AFTFB_new->prev = current_##type##_block; \
769 current_##type##_block = AFTFB_new; \
770 current_##type##_block_index = 0; \
771 } \
772 (result) = \
773 &(current_##type##_block->block[current_##type##_block_index++]); \
774 } while (0)
775
776 /* Allocate an instance of a type that is stored in blocks.
777 TYPE is the "name" of the type, STRUCTTYPE is the corresponding
778 structure type. */
779
780 #ifdef ERROR_CHECK_GC
781
782 /* Note: if you get crashes in this function, suspect incorrect calls
783 to free_cons() and friends. This happened once because the cons
784 cell was not GC-protected and was getting collected before
785 free_cons() was called. */
786
787 #define ALLOCATE_FIXED_TYPE_1(type, structtype, result) \
788 do \
789 { \
790 if (gc_count_num_##type##_freelist > \
791 MINIMUM_ALLOWED_FIXED_TYPE_CELLS_##type) \
792 { \
793 result = type##_free_list; \
794 /* Before actually using the chain pointer, we complement all its \
795 bits; see FREE_FIXED_TYPE(). */ \
796 type##_free_list = \
797 (structtype *) ~(unsigned long) \
798 (* (structtype **) ((char *) result + sizeof (void *))); \
799 gc_count_num_##type##_freelist--; \
800 } \
801 else \
802 ALLOCATE_FIXED_TYPE_FROM_BLOCK (type, result); \
803 MARK_STRUCT_AS_NOT_FREE (result); \
804 } while (0)
805
806 #else /* !ERROR_CHECK_GC */
807
808 #define ALLOCATE_FIXED_TYPE_1(type, structtype, result) \
809 do \
810 { \
811 if (type##_free_list) \
812 { \
813 result = type##_free_list; \
814 type##_free_list = \
815 * (structtype **) ((char *) result + sizeof (void *)); \
816 } \
817 else \
818 ALLOCATE_FIXED_TYPE_FROM_BLOCK (type, result); \
819 MARK_STRUCT_AS_NOT_FREE (result); \
820 } while (0)
821
822 #endif /* !ERROR_CHECK_GC */
823
824 #define ALLOCATE_FIXED_TYPE(type, structtype, result) \
825 do \
826 { \
827 ALLOCATE_FIXED_TYPE_1 (type, structtype, result); \
828 INCREMENT_CONS_COUNTER (sizeof (structtype), #type); \
829 } while (0)
830
831 #define NOSEEUM_ALLOCATE_FIXED_TYPE(type, structtype, result) \
832 do \
833 { \
834 ALLOCATE_FIXED_TYPE_1 (type, structtype, result); \
835 NOSEEUM_INCREMENT_CONS_COUNTER (sizeof (structtype), #type); \
836 } while (0)
837
838 /* INVALID_POINTER_VALUE should be a value that is invalid as a pointer
839 to a Lisp object and invalid as an actual Lisp_Object value. We have
840 to make sure that this value cannot be an integer in Lisp_Object form.
841 0xFFFFFFFF could be so on a 64-bit system, so we extend it to 64 bits.
842 On a 32-bit system, the type bits will be non-zero, making the value
843 be a pointer, and the pointer will be misaligned.
844
845 Even if Emacs is run on some weirdo system that allows and allocates
846 byte-aligned pointers, this pointer is at the very top of the address
847 space and so it's almost inconceivable that it could ever be valid. */
848
849 #if INTBITS == 32
850 # define INVALID_POINTER_VALUE 0xFFFFFFFF
851 #elif INTBITS == 48
852 # define INVALID_POINTER_VALUE 0xFFFFFFFFFFFF
853 #elif INTBITS == 64
854 # define INVALID_POINTER_VALUE 0xFFFFFFFFFFFFFFFF
855 #else
856 You have some weird system and need to supply a reasonable value here.
857 #endif
858
859 #define FREE_STRUCT_P(ptr) \
860 (* (void **) ptr == (void *) INVALID_POINTER_VALUE)
861 #define MARK_STRUCT_AS_FREE(ptr) \
862 (* (void **) ptr = (void *) INVALID_POINTER_VALUE)
863 #define MARK_STRUCT_AS_NOT_FREE(ptr) \
864 (* (void **) ptr = 0)
865
866 #ifdef ERROR_CHECK_GC
867
868 #define PUT_FIXED_TYPE_ON_FREE_LIST(type, structtype, ptr) \
869 do { if (type##_free_list_tail) \
870 { \
871 /* When we store the chain pointer, we complement all \
872 its bits; this should significantly increase its \
873 bogosity in case someone tries to use the value, and \
874 should make us dump faster if someone stores something \
875 over the pointer because when it gets un-complemented in \
876 ALLOCATED_FIXED_TYPE(), the resulting pointer will be \
877 extremely bogus. */ \
878 * (structtype **) \
879 ((char *) type##_free_list_tail + sizeof (void *)) = \
880 (structtype *) ~(unsigned long) ptr; \
881 } \
882 else \
883 type##_free_list = ptr; \
884 type##_free_list_tail = ptr; \
885 } while (0)
886
887 #else /* !ERROR_CHECK_GC */
888
889 #define PUT_FIXED_TYPE_ON_FREE_LIST(type, structtype, ptr) \
890 do { * (structtype **) ((char *) (ptr) + sizeof (void *)) = \
891 type##_free_list; \
892 type##_free_list = (ptr); \
893 } while (0)
894
895 #endif /* !ERROR_CHECK_GC */
896
897 /* TYPE and STRUCTTYPE are the same as in ALLOCATE_FIXED_TYPE(). */
898
899 #define FREE_FIXED_TYPE(type, structtype, ptr) do { \
900 structtype *FFT_ptr = (ptr); \
901 ADDITIONAL_FREE_##type (FFT_ptr); \
902 deadbeef_memory (FFT_ptr, sizeof (structtype)); \
903 PUT_FIXED_TYPE_ON_FREE_LIST (type, structtype, FFT_ptr); \
904 MARK_STRUCT_AS_FREE (FFT_ptr); \
905 } while (0)
906
907 /* Like FREE_FIXED_TYPE() but used when we are explicitly
908 freeing a structure through free_cons(), free_marker(), etc.
909 rather than through the normal process of sweeping.
910 We attempt to undo the changes made to the allocation counters
911 as a result of this structure being allocated. This is not
912 completely necessary but helps keep things saner: e.g. this way,
913 repeatedly allocating and freeing a cons will not result in
914 the consing-since-gc counter advancing, which would cause a GC
915 and somewhat defeat the purpose of explicitly freeing. */
916
917 #define FREE_FIXED_TYPE_WHEN_NOT_IN_GC(type, structtype, ptr) \
918 do { FREE_FIXED_TYPE (type, structtype, ptr); \
919 DECREMENT_CONS_COUNTER (sizeof (structtype)); \
920 gc_count_num_##type##_freelist++; \
921 } while (0)
922
923
924
925 /************************************************************************/
926 /* Cons allocation */
927 /************************************************************************/
928
929 DECLARE_FIXED_TYPE_ALLOC (cons, struct Lisp_Cons);
930 /* conses are used and freed so often that we set this really high */
931 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 20000 */
932 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 2000
933
934 static Lisp_Object
935 mark_cons (Lisp_Object obj)
936 {
937 if (NILP (XCDR (obj)))
938 return XCAR (obj);
939
940 mark_object (XCAR (obj));
941 return XCDR (obj);
942 }
943
944 static int
945 cons_equal (Lisp_Object ob1, Lisp_Object ob2, int depth)
946 {
947 while (internal_equal (XCAR (ob1), XCAR (ob2), depth + 1))
948 {
949 ob1 = XCDR (ob1);
950 ob2 = XCDR (ob2);
951 if (! CONSP (ob1) || ! CONSP (ob2))
952 return internal_equal (ob1, ob2, depth + 1);
953 }
954 return 0;
955 }
956
957 static const struct lrecord_description cons_description[] = {
958 { XD_LISP_OBJECT, offsetof(struct Lisp_Cons, car), 2 },
959 { XD_END }
960 };
961
962 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("cons", cons,
963 mark_cons, print_cons, 0,
964 cons_equal,
965 /*
966 * No `hash' method needed.
967 * internal_hash knows how to
968 * handle conses.
969 */
970 0,
971 cons_description,
972 struct Lisp_Cons);
973
974 DEFUN ("cons", Fcons, 2, 2, 0, /*
975 Create a new cons, give it CAR and CDR as components, and return it.
976 */
977 (car, cdr))
978 {
979 /* This cannot GC. */
980 Lisp_Object val;
981 struct Lisp_Cons *c;
982
983 ALLOCATE_FIXED_TYPE (cons, struct Lisp_Cons, c);
984 set_lheader_implementation (&(c->lheader), &lrecord_cons);
985 XSETCONS (val, c);
986 c->car = car;
987 c->cdr = cdr;
988 return val;
989 }
990
991 /* This is identical to Fcons() but it used for conses that we're
992 going to free later, and is useful when trying to track down
993 "real" consing. */
994 Lisp_Object
995 noseeum_cons (Lisp_Object car, Lisp_Object cdr)
996 {
997 Lisp_Object val;
998 struct Lisp_Cons *c;
999
1000 NOSEEUM_ALLOCATE_FIXED_TYPE (cons, struct Lisp_Cons, c);
1001 set_lheader_implementation (&(c->lheader), &lrecord_cons);
1002 XSETCONS (val, c);
1003 XCAR (val) = car;
1004 XCDR (val) = cdr;
1005 return val;
1006 }
1007
1008 DEFUN ("list", Flist, 0, MANY, 0, /*
1009 Return a newly created list with specified arguments as elements.
1010 Any number of arguments, even zero arguments, are allowed.
1011 */
1012 (int nargs, Lisp_Object *args))
1013 {
1014 Lisp_Object val = Qnil;
1015 Lisp_Object *argp = args + nargs;
1016
1017 while (argp > args)
1018 val = Fcons (*--argp, val);
1019 return val;
1020 }
1021
1022 Lisp_Object
1023 list1 (Lisp_Object obj0)
1024 {
1025 /* This cannot GC. */
1026 return Fcons (obj0, Qnil);
1027 }
1028
1029 Lisp_Object
1030 list2 (Lisp_Object obj0, Lisp_Object obj1)
1031 {
1032 /* This cannot GC. */
1033 return Fcons (obj0, Fcons (obj1, Qnil));
1034 }
1035
1036 Lisp_Object
1037 list3 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2)
1038 {
1039 /* This cannot GC. */
1040 return Fcons (obj0, Fcons (obj1, Fcons (obj2, Qnil)));
1041 }
1042
1043 Lisp_Object
1044 cons3 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2)
1045 {
1046 /* This cannot GC. */
1047 return Fcons (obj0, Fcons (obj1, obj2));
1048 }
1049
1050 Lisp_Object
1051 acons (Lisp_Object key, Lisp_Object value, Lisp_Object alist)
1052 {
1053 return Fcons (Fcons (key, value), alist);
1054 }
1055
1056 Lisp_Object
1057 list4 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2, Lisp_Object obj3)
1058 {
1059 /* This cannot GC. */
1060 return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Qnil))));
1061 }
1062
1063 Lisp_Object
1064 list5 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2, Lisp_Object obj3,
1065 Lisp_Object obj4)
1066 {
1067 /* This cannot GC. */
1068 return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Fcons (obj4, Qnil)))));
1069 }
1070
1071 Lisp_Object
1072 list6 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2, Lisp_Object obj3,
1073 Lisp_Object obj4, Lisp_Object obj5)
1074 {
1075 /* This cannot GC. */
1076 return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Fcons (obj4, Fcons (obj5, Qnil))))));
1077 }
1078
1079 DEFUN ("make-list", Fmake_list, 2, 2, 0, /*
1080 Return a new list of length LENGTH, with each element being INIT.
1081 */
1082 (length, init))
1083 {
1084 CHECK_NATNUM (length);
1085
1086 {
1087 Lisp_Object val = Qnil;
1088 size_t size = XINT (length);
1089
1090 while (size--)
1091 val = Fcons (init, val);
1092 return val;
1093 }
1094 }
1095
1096
1097 /************************************************************************/
1098 /* Float allocation */
1099 /************************************************************************/
1100
1101 #ifdef LISP_FLOAT_TYPE
1102
1103 DECLARE_FIXED_TYPE_ALLOC (float, struct Lisp_Float);
1104 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_float 1000
1105
1106 Lisp_Object
1107 make_float (double float_value)
1108 {
1109 Lisp_Object val;
1110 struct Lisp_Float *f;
1111
1112 ALLOCATE_FIXED_TYPE (float, struct Lisp_Float, f);
1113 set_lheader_implementation (&(f->lheader), &lrecord_float);
1114 float_data (f) = float_value;
1115 XSETFLOAT (val, f);
1116 return val;
1117 }
1118
1119 #endif /* LISP_FLOAT_TYPE */
1120
1121
1122 /************************************************************************/
1123 /* Vector allocation */
1124 /************************************************************************/
1125
1126 static Lisp_Object
1127 mark_vector (Lisp_Object obj)
1128 {
1129 Lisp_Vector *ptr = XVECTOR (obj);
1130 int len = vector_length (ptr);
1131 int i;
1132
1133 for (i = 0; i < len - 1; i++)
1134 mark_object (ptr->contents[i]);
1135 return (len > 0) ? ptr->contents[len - 1] : Qnil;
1136 }
1137
1138 static size_t
1139 size_vector (CONST void *lheader)
1140 {
1141 return STRETCHY_STRUCT_SIZEOF (Lisp_Vector, contents,
1142 ((Lisp_Vector *) lheader)->size);
1143 }
1144
1145 static int
1146 vector_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
1147 {
1148 int len = XVECTOR_LENGTH (obj1);
1149 if (len != XVECTOR_LENGTH (obj2))
1150 return 0;
1151
1152 {
1153 Lisp_Object *ptr1 = XVECTOR_DATA (obj1);
1154 Lisp_Object *ptr2 = XVECTOR_DATA (obj2);
1155 while (len--)
1156 if (!internal_equal (*ptr1++, *ptr2++, depth + 1))
1157 return 0;
1158 }
1159 return 1;
1160 }
1161
1162 static const struct lrecord_description vector_description[] = {
1163 { XD_LONG, offsetof(struct Lisp_Vector, size) },
1164 { XD_LISP_OBJECT, offsetof(struct Lisp_Vector, contents), XD_INDIRECT(0, 0) },
1165 { XD_END }
1166 };
1167
1168 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION("vector", vector,
1169 mark_vector, print_vector, 0,
1170 vector_equal,
1171 /*
1172 * No `hash' method needed for
1173 * vectors. internal_hash
1174 * knows how to handle vectors.
1175 */
1176 0,
1177 vector_description,
1178 size_vector, Lisp_Vector);
1179
1180 /* #### should allocate `small' vectors from a frob-block */
1181 static Lisp_Vector *
1182 make_vector_internal (size_t sizei)
1183 {
1184 /* no vector_next */
1185 size_t sizem = STRETCHY_STRUCT_SIZEOF (Lisp_Vector, contents, sizei);
1186 Lisp_Vector *p = (Lisp_Vector *) alloc_lcrecord (sizem, &lrecord_vector);
1187
1188 p->size = sizei;
1189 return p;
1190 }
1191
1192 Lisp_Object
1193 make_vector (size_t length, Lisp_Object init)
1194 {
1195 Lisp_Vector *vecp = make_vector_internal (length);
1196 Lisp_Object *p = vector_data (vecp);
1197
1198 while (length--)
1199 *p++ = init;
1200
1201 {
1202 Lisp_Object vector;
1203 XSETVECTOR (vector, vecp);
1204 return vector;
1205 }
1206 }
1207
1208 DEFUN ("make-vector", Fmake_vector, 2, 2, 0, /*
1209 Return a new vector of length LENGTH, with each element being INIT.
1210 See also the function `vector'.
1211 */
1212 (length, init))
1213 {
1214 CONCHECK_NATNUM (length);
1215 return make_vector (XINT (length), init);
1216 }
1217
1218 DEFUN ("vector", Fvector, 0, MANY, 0, /*
1219 Return a newly created vector with specified arguments as elements.
1220 Any number of arguments, even zero arguments, are allowed.
1221 */
1222 (int nargs, Lisp_Object *args))
1223 {
1224 Lisp_Vector *vecp = make_vector_internal (nargs);
1225 Lisp_Object *p = vector_data (vecp);
1226
1227 while (nargs--)
1228 *p++ = *args++;
1229
1230 {
1231 Lisp_Object vector;
1232 XSETVECTOR (vector, vecp);
1233 return vector;
1234 }
1235 }
1236
1237 Lisp_Object
1238 vector1 (Lisp_Object obj0)
1239 {
1240 return Fvector (1, &obj0);
1241 }
1242
1243 Lisp_Object
1244 vector2 (Lisp_Object obj0, Lisp_Object obj1)
1245 {
1246 Lisp_Object args[2];
1247 args[0] = obj0;
1248 args[1] = obj1;
1249 return Fvector (2, args);
1250 }
1251
1252 Lisp_Object
1253 vector3 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2)
1254 {
1255 Lisp_Object args[3];
1256 args[0] = obj0;
1257 args[1] = obj1;
1258 args[2] = obj2;
1259 return Fvector (3, args);
1260 }
1261
1262 #if 0 /* currently unused */
1263
1264 Lisp_Object
1265 vector4 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1266 Lisp_Object obj3)
1267 {
1268 Lisp_Object args[4];
1269 args[0] = obj0;
1270 args[1] = obj1;
1271 args[2] = obj2;
1272 args[3] = obj3;
1273 return Fvector (4, args);
1274 }
1275
1276 Lisp_Object
1277 vector5 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1278 Lisp_Object obj3, Lisp_Object obj4)
1279 {
1280 Lisp_Object args[5];
1281 args[0] = obj0;
1282 args[1] = obj1;
1283 args[2] = obj2;
1284 args[3] = obj3;
1285 args[4] = obj4;
1286 return Fvector (5, args);
1287 }
1288
1289 Lisp_Object
1290 vector6 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1291 Lisp_Object obj3, Lisp_Object obj4, Lisp_Object obj5)
1292 {
1293 Lisp_Object args[6];
1294 args[0] = obj0;
1295 args[1] = obj1;
1296 args[2] = obj2;
1297 args[3] = obj3;
1298 args[4] = obj4;
1299 args[5] = obj5;
1300 return Fvector (6, args);
1301 }
1302
1303 Lisp_Object
1304 vector7 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1305 Lisp_Object obj3, Lisp_Object obj4, Lisp_Object obj5,
1306 Lisp_Object obj6)
1307 {
1308 Lisp_Object args[7];
1309 args[0] = obj0;
1310 args[1] = obj1;
1311 args[2] = obj2;
1312 args[3] = obj3;
1313 args[4] = obj4;
1314 args[5] = obj5;
1315 args[6] = obj6;
1316 return Fvector (7, args);
1317 }
1318
1319 Lisp_Object
1320 vector8 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1321 Lisp_Object obj3, Lisp_Object obj4, Lisp_Object obj5,
1322 Lisp_Object obj6, Lisp_Object obj7)
1323 {
1324 Lisp_Object args[8];
1325 args[0] = obj0;
1326 args[1] = obj1;
1327 args[2] = obj2;
1328 args[3] = obj3;
1329 args[4] = obj4;
1330 args[5] = obj5;
1331 args[6] = obj6;
1332 args[7] = obj7;
1333 return Fvector (8, args);
1334 }
1335 #endif /* unused */
1336
1337 /************************************************************************/
1338 /* Bit Vector allocation */
1339 /************************************************************************/
1340
1341 static Lisp_Object all_bit_vectors;
1342
1343 /* #### should allocate `small' bit vectors from a frob-block */
1344 static struct Lisp_Bit_Vector *
1345 make_bit_vector_internal (size_t sizei)
1346 {
1347 size_t num_longs = BIT_VECTOR_LONG_STORAGE (sizei);
1348 size_t sizem = STRETCHY_STRUCT_SIZEOF (Lisp_Bit_Vector, bits, num_longs);
1349 Lisp_Bit_Vector *p = (Lisp_Bit_Vector *) allocate_lisp_storage (sizem);
1350 set_lheader_implementation (&(p->lheader), &lrecord_bit_vector);
1351
1352 INCREMENT_CONS_COUNTER (sizem, "bit-vector");
1353
1354 bit_vector_length (p) = sizei;
1355 bit_vector_next (p) = all_bit_vectors;
1356 /* make sure the extra bits in the last long are 0; the calling
1357 functions might not set them. */
1358 p->bits[num_longs - 1] = 0;
1359 XSETBIT_VECTOR (all_bit_vectors, p);
1360 return p;
1361 }
1362
1363 Lisp_Object
1364 make_bit_vector (size_t length, Lisp_Object init)
1365 {
1366 struct Lisp_Bit_Vector *p = make_bit_vector_internal (length);
1367 size_t num_longs = BIT_VECTOR_LONG_STORAGE (length);
1368
1369 CHECK_BIT (init);
1370
1371 if (ZEROP (init))
1372 memset (p->bits, 0, num_longs * sizeof (long));
1373 else
1374 {
1375 size_t bits_in_last = length & (LONGBITS_POWER_OF_2 - 1);
1376 memset (p->bits, ~0, num_longs * sizeof (long));
1377 /* But we have to make sure that the unused bits in the
1378 last long are 0, so that equal/hash is easy. */
1379 if (bits_in_last)
1380 p->bits[num_longs - 1] &= (1 << bits_in_last) - 1;
1381 }
1382
1383 {
1384 Lisp_Object bit_vector;
1385 XSETBIT_VECTOR (bit_vector, p);
1386 return bit_vector;
1387 }
1388 }
1389
1390 Lisp_Object
1391 make_bit_vector_from_byte_vector (unsigned char *bytevec, size_t length)
1392 {
1393 int i;
1394 Lisp_Bit_Vector *p = make_bit_vector_internal (length);
1395
1396 for (i = 0; i < length; i++)
1397 set_bit_vector_bit (p, i, bytevec[i]);
1398
1399 {
1400 Lisp_Object bit_vector;
1401 XSETBIT_VECTOR (bit_vector, p);
1402 return bit_vector;
1403 }
1404 }
1405
1406 DEFUN ("make-bit-vector", Fmake_bit_vector, 2, 2, 0, /*
1407 Return a new bit vector of length LENGTH. with each bit being INIT.
1408 Each element is set to INIT. See also the function `bit-vector'.
1409 */
1410 (length, init))
1411 {
1412 CONCHECK_NATNUM (length);
1413
1414 return make_bit_vector (XINT (length), init);
1415 }
1416
1417 DEFUN ("bit-vector", Fbit_vector, 0, MANY, 0, /*
1418 Return a newly created bit vector with specified arguments as elements.
1419 Any number of arguments, even zero arguments, are allowed.
1420 */
1421 (int nargs, Lisp_Object *args))
1422 {
1423 int i;
1424 Lisp_Bit_Vector *p = make_bit_vector_internal (nargs);
1425
1426 for (i = 0; i < nargs; i++)
1427 {
1428 CHECK_BIT (args[i]);
1429 set_bit_vector_bit (p, i, !ZEROP (args[i]));
1430 }
1431
1432 {
1433 Lisp_Object bit_vector;
1434 XSETBIT_VECTOR (bit_vector, p);
1435 return bit_vector;
1436 }
1437 }
1438
1439
1440 /************************************************************************/
1441 /* Compiled-function allocation */
1442 /************************************************************************/
1443
1444 DECLARE_FIXED_TYPE_ALLOC (compiled_function, Lisp_Compiled_Function);
1445 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_compiled_function 1000
1446
1447 static Lisp_Object
1448 make_compiled_function (void)
1449 {
1450 Lisp_Compiled_Function *f;
1451 Lisp_Object fun;
1452
1453 ALLOCATE_FIXED_TYPE (compiled_function, Lisp_Compiled_Function, f);
1454 set_lheader_implementation (&(f->lheader), &lrecord_compiled_function);
1455
1456 f->stack_depth = 0;
1457 f->specpdl_depth = 0;
1458 f->flags.documentationp = 0;
1459 f->flags.interactivep = 0;
1460 f->flags.domainp = 0; /* I18N3 */
1461 f->instructions = Qzero;
1462 f->constants = Qzero;
1463 f->arglist = Qnil;
1464 f->doc_and_interactive = Qnil;
1465 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
1466 f->annotated = Qnil;
1467 #endif
1468 XSETCOMPILED_FUNCTION (fun, f);
1469 return fun;
1470 }
1471
1472 DEFUN ("make-byte-code", Fmake_byte_code, 4, MANY, 0, /*
1473 Return a new compiled-function object.
1474 Usage: (arglist instructions constants stack-depth
1475 &optional doc-string interactive)
1476 Note that, unlike all other emacs-lisp functions, calling this with five
1477 arguments is NOT the same as calling it with six arguments, the last of
1478 which is nil. If the INTERACTIVE arg is specified as nil, then that means
1479 that this function was defined with `(interactive)'. If the arg is not
1480 specified, then that means the function is not interactive.
1481 This is terrible behavior which is retained for compatibility with old
1482 `.elc' files which expect these semantics.
1483 */
1484 (int nargs, Lisp_Object *args))
1485 {
1486 /* In a non-insane world this function would have this arglist...
1487 (arglist instructions constants stack_depth &optional doc_string interactive)
1488 */
1489 Lisp_Object fun = make_compiled_function ();
1490 Lisp_Compiled_Function *f = XCOMPILED_FUNCTION (fun);
1491
1492 Lisp_Object arglist = args[0];
1493 Lisp_Object instructions = args[1];
1494 Lisp_Object constants = args[2];
1495 Lisp_Object stack_depth = args[3];
1496 Lisp_Object doc_string = (nargs > 4) ? args[4] : Qnil;
1497 Lisp_Object interactive = (nargs > 5) ? args[5] : Qunbound;
1498
1499 if (nargs < 4 || nargs > 6)
1500 return Fsignal (Qwrong_number_of_arguments,
1501 list2 (intern ("make-byte-code"), make_int (nargs)));
1502
1503 /* Check for valid formal parameter list now, to allow us to use
1504 SPECBIND_FAST_UNSAFE() later in funcall_compiled_function(). */
1505 {
1506 Lisp_Object symbol, tail;
1507 EXTERNAL_LIST_LOOP_3 (symbol, arglist, tail)
1508 {
1509 CHECK_SYMBOL (symbol);
1510 if (EQ (symbol, Qt) ||
1511 EQ (symbol, Qnil) ||
1512 SYMBOL_IS_KEYWORD (symbol))
1513 signal_simple_error_2
1514 ("Invalid constant symbol in formal parameter list",
1515 symbol, arglist);
1516 }
1517 }
1518 f->arglist = arglist;
1519
1520 /* `instructions' is a string or a cons (string . int) for a
1521 lazy-loaded function. */
1522 if (CONSP (instructions))
1523 {
1524 CHECK_STRING (XCAR (instructions));
1525 CHECK_INT (XCDR (instructions));
1526 }
1527 else
1528 {
1529 CHECK_STRING (instructions);
1530 }
1531 f->instructions = instructions;
1532
1533 if (!NILP (constants))
1534 CHECK_VECTOR (constants);
1535 f->constants = constants;
1536
1537 CHECK_NATNUM (stack_depth);
1538 f->stack_depth = XINT (stack_depth);
1539
1540 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
1541 if (!NILP (Vcurrent_compiled_function_annotation))
1542 f->annotated = Fcopy (Vcurrent_compiled_function_annotation);
1543 else if (!NILP (Vload_file_name_internal_the_purecopy))
1544 f->annotated = Vload_file_name_internal_the_purecopy;
1545 else if (!NILP (Vload_file_name_internal))
1546 {
1547 struct gcpro gcpro1;
1548 GCPRO1 (fun); /* don't let fun get reaped */
1549 Vload_file_name_internal_the_purecopy =
1550 Ffile_name_nondirectory (Vload_file_name_internal);
1551 f->annotated = Vload_file_name_internal_the_purecopy;
1552 UNGCPRO;
1553 }
1554 #endif /* COMPILED_FUNCTION_ANNOTATION_HACK */
1555
1556 /* doc_string may be nil, string, int, or a cons (string . int).
1557 interactive may be list or string (or unbound). */
1558 f->doc_and_interactive = Qunbound;
1559 #ifdef I18N3
1560 if ((f->flags.domainp = !NILP (Vfile_domain)) != 0)
1561 f->doc_and_interactive = Vfile_domain;
1562 #endif
1563 if ((f->flags.interactivep = !UNBOUNDP (interactive)) != 0)
1564 {
1565 f->doc_and_interactive
1566 = (UNBOUNDP (f->doc_and_interactive) ? interactive :
1567 Fcons (interactive, f->doc_and_interactive));
1568 }
1569 if ((f->flags.documentationp = !NILP (doc_string)) != 0)
1570 {
1571 f->doc_and_interactive
1572 = (UNBOUNDP (f->doc_and_interactive) ? doc_string :
1573 Fcons (doc_string, f->doc_and_interactive));
1574 }
1575 if (UNBOUNDP (f->doc_and_interactive))
1576 f->doc_and_interactive = Qnil;
1577
1578 return fun;
1579 }
1580
1581
1582 /************************************************************************/
1583 /* Symbol allocation */
1584 /************************************************************************/
1585
1586 DECLARE_FIXED_TYPE_ALLOC (symbol, struct Lisp_Symbol);
1587 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_symbol 1000
1588
1589 DEFUN ("make-symbol", Fmake_symbol, 1, 1, 0, /*
1590 Return a newly allocated uninterned symbol whose name is NAME.
1591 Its value and function definition are void, and its property list is nil.
1592 */
1593 (name))
1594 {
1595 Lisp_Object val;
1596 struct Lisp_Symbol *p;
1597
1598 CHECK_STRING (name);
1599
1600 ALLOCATE_FIXED_TYPE (symbol, struct Lisp_Symbol, p);
1601 set_lheader_implementation (&(p->lheader), &lrecord_symbol);
1602 p->name = XSTRING (name);
1603 p->plist = Qnil;
1604 p->value = Qunbound;
1605 p->function = Qunbound;
1606 symbol_next (p) = 0;
1607 XSETSYMBOL (val, p);
1608 return val;
1609 }
1610
1611
1612 /************************************************************************/
1613 /* Extent allocation */
1614 /************************************************************************/
1615
1616 DECLARE_FIXED_TYPE_ALLOC (extent, struct extent);
1617 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_extent 1000
1618
1619 struct extent *
1620 allocate_extent (void)
1621 {
1622 struct extent *e;
1623
1624 ALLOCATE_FIXED_TYPE (extent, struct extent, e);
1625 set_lheader_implementation (&(e->lheader), &lrecord_extent);
1626 extent_object (e) = Qnil;
1627 set_extent_start (e, -1);
1628 set_extent_end (e, -1);
1629 e->plist = Qnil;
1630
1631 xzero (e->flags);
1632
1633 extent_face (e) = Qnil;
1634 e->flags.end_open = 1; /* default is for endpoints to behave like markers */
1635 e->flags.detachable = 1;
1636
1637 return e;
1638 }
1639
1640
1641 /************************************************************************/
1642 /* Event allocation */
1643 /************************************************************************/
1644
1645 DECLARE_FIXED_TYPE_ALLOC (event, struct Lisp_Event);
1646 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_event 1000
1647
1648 Lisp_Object
1649 allocate_event (void)
1650 {
1651 Lisp_Object val;
1652 struct Lisp_Event *e;
1653
1654 ALLOCATE_FIXED_TYPE (event, struct Lisp_Event, e);
1655 set_lheader_implementation (&(e->lheader), &lrecord_event);
1656
1657 XSETEVENT (val, e);
1658 return val;
1659 }
1660
1661
1662 /************************************************************************/
1663 /* Marker allocation */
1664 /************************************************************************/
1665
1666 DECLARE_FIXED_TYPE_ALLOC (marker, struct Lisp_Marker);
1667 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_marker 1000
1668
1669 DEFUN ("make-marker", Fmake_marker, 0, 0, 0, /*
1670 Return a new marker which does not point at any place.
1671 */
1672 ())
1673 {
1674 Lisp_Object val;
1675 struct Lisp_Marker *p;
1676
1677 ALLOCATE_FIXED_TYPE (marker, struct Lisp_Marker, p);
1678 set_lheader_implementation (&(p->lheader), &lrecord_marker);
1679 p->buffer = 0;
1680 p->memind = 0;
1681 marker_next (p) = 0;
1682 marker_prev (p) = 0;
1683 p->insertion_type = 0;
1684 XSETMARKER (val, p);
1685 return val;
1686 }
1687
1688 Lisp_Object
1689 noseeum_make_marker (void)
1690 {
1691 Lisp_Object val;
1692 struct Lisp_Marker *p;
1693
1694 NOSEEUM_ALLOCATE_FIXED_TYPE (marker, struct Lisp_Marker, p);
1695 set_lheader_implementation (&(p->lheader), &lrecord_marker);
1696 p->buffer = 0;
1697 p->memind = 0;
1698 marker_next (p) = 0;
1699 marker_prev (p) = 0;
1700 p->insertion_type = 0;
1701 XSETMARKER (val, p);
1702 return val;
1703 }
1704
1705
1706 /************************************************************************/
1707 /* String allocation */
1708 /************************************************************************/
1709
1710 /* The data for "short" strings generally resides inside of structs of type
1711 string_chars_block. The Lisp_String structure is allocated just like any
1712 other Lisp object (except for vectors), and these are freelisted when
1713 they get garbage collected. The data for short strings get compacted,
1714 but the data for large strings do not.
1715
1716 Previously Lisp_String structures were relocated, but this caused a lot
1717 of bus-errors because the C code didn't include enough GCPRO's for
1718 strings (since EVERY REFERENCE to a short string needed to be GCPRO'd so
1719 that the reference would get relocated).
1720
1721 This new method makes things somewhat bigger, but it is MUCH safer. */
1722
1723 DECLARE_FIXED_TYPE_ALLOC (string, struct Lisp_String);
1724 /* strings are used and freed quite often */
1725 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 10000 */
1726 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 1000
1727
1728 static Lisp_Object
1729 mark_string (Lisp_Object obj)
1730 {
1731 struct Lisp_String *ptr = XSTRING (obj);
1732
1733 if (CONSP (ptr->plist) && EXTENT_INFOP (XCAR (ptr->plist)))
1734 flush_cached_extent_info (XCAR (ptr->plist));
1735 return ptr->plist;
1736 }
1737
1738 static int
1739 string_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
1740 {
1741 Bytecount len;
1742 return (((len = XSTRING_LENGTH (obj1)) == XSTRING_LENGTH (obj2)) &&
1743 !memcmp (XSTRING_DATA (obj1), XSTRING_DATA (obj2), len));
1744 }
1745
1746 static const struct lrecord_description string_description[] = {
1747 { XD_BYTECOUNT, offsetof(Lisp_String, size) },
1748 { XD_OPAQUE_DATA_PTR, offsetof(Lisp_String, data), XD_INDIRECT(0, 1) },
1749 { XD_LISP_OBJECT, offsetof(Lisp_String, plist), 1 },
1750 { XD_END }
1751 };
1752
1753 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("string", string,
1754 mark_string, print_string,
1755 /*
1756 * No `finalize', or `hash' methods.
1757 * internal_hash already knows how
1758 * to hash strings and finalization
1759 * is done with the
1760 * ADDITIONAL_FREE_string macro,
1761 * which is the standard way to do
1762 * finalization when using
1763 * SWEEP_FIXED_TYPE_BLOCK().
1764 */
1765 0, string_equal, 0,
1766 string_description,
1767 struct Lisp_String);
1768
1769 /* String blocks contain this many useful bytes. */
1770 #define STRING_CHARS_BLOCK_SIZE \
1771 ((Bytecount) (8192 - MALLOC_OVERHEAD - \
1772 ((2 * sizeof (struct string_chars_block *)) \
1773 + sizeof (EMACS_INT))))
1774 /* Block header for small strings. */
1775 struct string_chars_block
1776 {
1777 EMACS_INT pos;
1778 struct string_chars_block *next;
1779 struct string_chars_block *prev;
1780 /* Contents of string_chars_block->string_chars are interleaved
1781 string_chars structures (see below) and the actual string data */
1782 unsigned char string_chars[STRING_CHARS_BLOCK_SIZE];
1783 };
1784
1785 static struct string_chars_block *first_string_chars_block;
1786 static struct string_chars_block *current_string_chars_block;
1787
1788 /* If SIZE is the length of a string, this returns how many bytes
1789 * the string occupies in string_chars_block->string_chars
1790 * (including alignment padding).
1791 */
1792 #define STRING_FULLSIZE(s) \
1793 ALIGN_SIZE (((s) + 1 + sizeof (struct Lisp_String *)),\
1794 ALIGNOF (struct Lisp_String *))
1795
1796 #define BIG_STRING_FULLSIZE_P(fullsize) ((fullsize) >= STRING_CHARS_BLOCK_SIZE)
1797 #define BIG_STRING_SIZE_P(size) (BIG_STRING_FULLSIZE_P (STRING_FULLSIZE(size)))
1798
1799 #define CHARS_TO_STRING_CHAR(x) \
1800 ((struct string_chars *) \
1801 (((char *) (x)) - (slot_offset (struct string_chars, chars[0]))))
1802
1803
1804 struct string_chars
1805 {
1806 struct Lisp_String *string;
1807 unsigned char chars[1];
1808 };
1809
1810 struct unused_string_chars
1811 {
1812 struct Lisp_String *string;
1813 EMACS_INT fullsize;
1814 };
1815
1816 static void
1817 init_string_chars_alloc (void)
1818 {
1819 first_string_chars_block = xnew (struct string_chars_block);
1820 first_string_chars_block->prev = 0;
1821 first_string_chars_block->next = 0;
1822 first_string_chars_block->pos = 0;
1823 current_string_chars_block = first_string_chars_block;
1824 }
1825
1826 static struct string_chars *
1827 allocate_string_chars_struct (struct Lisp_String *string_it_goes_with,
1828 EMACS_INT fullsize)
1829 {
1830 struct string_chars *s_chars;
1831
1832 /* Allocate the string's actual data */
1833 if (BIG_STRING_FULLSIZE_P (fullsize))
1834 {
1835 s_chars = (struct string_chars *) xmalloc (fullsize);
1836 }
1837 else if (fullsize <=
1838 (countof (current_string_chars_block->string_chars)
1839 - current_string_chars_block->pos))
1840 {
1841 /* This string can fit in the current string chars block */
1842 s_chars = (struct string_chars *)
1843 (current_string_chars_block->string_chars
1844 + current_string_chars_block->pos);
1845 current_string_chars_block->pos += fullsize;
1846 }
1847 else
1848 {
1849 /* Make a new current string chars block */
1850 struct string_chars_block *new_scb = xnew (struct string_chars_block);
1851
1852 current_string_chars_block->next = new_scb;
1853 new_scb->prev = current_string_chars_block;
1854 new_scb->next = 0;
1855 current_string_chars_block = new_scb;
1856 new_scb->pos = fullsize;
1857 s_chars = (struct string_chars *)
1858 current_string_chars_block->string_chars;
1859 }
1860
1861 s_chars->string = string_it_goes_with;
1862
1863 INCREMENT_CONS_COUNTER (fullsize, "string chars");
1864
1865 return s_chars;
1866 }
1867
1868 Lisp_Object
1869 make_uninit_string (Bytecount length)
1870 {
1871 struct Lisp_String *s;
1872 struct string_chars *s_chars;
1873 EMACS_INT fullsize = STRING_FULLSIZE (length);
1874 Lisp_Object val;
1875
1876 if ((length < 0) || (fullsize <= 0))
1877 abort ();
1878
1879 /* Allocate the string header */
1880 ALLOCATE_FIXED_TYPE (string, struct Lisp_String, s);
1881 set_lheader_implementation (&(s->lheader), &lrecord_string);
1882
1883 s_chars = allocate_string_chars_struct (s, fullsize);
1884
1885 set_string_data (s, &(s_chars->chars[0]));
1886 set_string_length (s, length);
1887 s->plist = Qnil;
1888
1889 set_string_byte (s, length, 0);
1890
1891 XSETSTRING (val, s);
1892 return val;
1893 }
1894
1895 #ifdef VERIFY_STRING_CHARS_INTEGRITY
1896 static void verify_string_chars_integrity (void);
1897 #endif
1898
1899 /* Resize the string S so that DELTA bytes can be inserted starting
1900 at POS. If DELTA < 0, it means deletion starting at POS. If
1901 POS < 0, resize the string but don't copy any characters. Use
1902 this if you're planning on completely overwriting the string.
1903 */
1904
1905 void
1906 resize_string (struct Lisp_String *s, Bytecount pos, Bytecount delta)
1907 {
1908 #ifdef VERIFY_STRING_CHARS_INTEGRITY
1909 verify_string_chars_integrity ();
1910 #endif
1911
1912 #ifdef ERROR_CHECK_BUFPOS
1913 if (pos >= 0)
1914 {
1915 assert (pos <= string_length (s));
1916 if (delta < 0)
1917 assert (pos + (-delta) <= string_length (s));
1918 }
1919 else
1920 {
1921 if (delta < 0)
1922 assert ((-delta) <= string_length (s));
1923 }
1924 #endif /* ERROR_CHECK_BUFPOS */
1925
1926 if (pos >= 0 && delta < 0)
1927 /* If DELTA < 0, the functions below will delete the characters
1928 before POS. We want to delete characters *after* POS, however,
1929 so convert this to the appropriate form. */
1930 pos += -delta;
1931
1932 if (delta == 0)
1933 /* simplest case: no size change. */
1934 return;
1935 else
1936 {
1937 Bytecount oldfullsize = STRING_FULLSIZE (string_length (s));
1938 Bytecount newfullsize = STRING_FULLSIZE (string_length (s) + delta);
1939
1940 if (oldfullsize == newfullsize)
1941 {
1942 /* next simplest case; size change but the necessary
1943 allocation size won't change (up or down; code somewhere
1944 depends on there not being any unused allocation space,
1945 modulo any alignment constraints). */
1946 if (pos >= 0)
1947 {
1948 Bufbyte *addroff = pos + string_data (s);
1949
1950 memmove (addroff + delta, addroff,
1951 /* +1 due to zero-termination. */
1952 string_length (s) + 1 - pos);
1953 }
1954 }
1955 else if (BIG_STRING_FULLSIZE_P (oldfullsize) &&
1956 BIG_STRING_FULLSIZE_P (newfullsize))
1957 {
1958 /* next simplest case; the string is big enough to be malloc()ed
1959 itself, so we just realloc.
1960
1961 It's important not to let the string get below the threshold
1962 for making big strings and still remain malloc()ed; if that
1963 were the case, repeated calls to this function on the same
1964 string could result in memory leakage. */
1965 set_string_data (s, (Bufbyte *) xrealloc (string_data (s),
1966 newfullsize));
1967 if (pos >= 0)
1968 {
1969 Bufbyte *addroff = pos + string_data (s);
1970
1971 memmove (addroff + delta, addroff,
1972 /* +1 due to zero-termination. */
1973 string_length (s) + 1 - pos);
1974 }
1975 }
1976 else
1977 {
1978 /* worst case. We make a new string_chars struct and copy
1979 the string's data into it, inserting/deleting the delta
1980 in the process. The old string data will either get
1981 freed by us (if it was malloc()ed) or will be reclaimed
1982 in the normal course of garbage collection. */
1983 struct string_chars *s_chars =
1984 allocate_string_chars_struct (s, newfullsize);
1985 Bufbyte *new_addr = &(s_chars->chars[0]);
1986 Bufbyte *old_addr = string_data (s);
1987 if (pos >= 0)
1988 {
1989 memcpy (new_addr, old_addr, pos);
1990 memcpy (new_addr + pos + delta, old_addr + pos,
1991 string_length (s) + 1 - pos);
1992 }
1993 set_string_data (s, new_addr);
1994 if (BIG_STRING_FULLSIZE_P (oldfullsize))
1995 xfree (old_addr);
1996 else
1997 {
1998 /* We need to mark this chunk of the string_chars_block
1999 as unused so that compact_string_chars() doesn't
2000 freak. */
2001 struct string_chars *old_s_chars =
2002 (struct string_chars *) ((char *) old_addr -
2003 sizeof (struct Lisp_String *));
2004 /* Sanity check to make sure we aren't hosed by strange
2005 alignment/padding. */
2006 assert (old_s_chars->string == s);
2007 MARK_STRUCT_AS_FREE (old_s_chars);
2008 ((struct unused_string_chars *) old_s_chars)->fullsize =
2009 oldfullsize;
2010 }
2011 }
2012
2013 set_string_length (s, string_length (s) + delta);
2014 /* If pos < 0, the string won't be zero-terminated.
2015 Terminate now just to make sure. */
2016 string_data (s)[string_length (s)] = '\0';
2017
2018 if (pos >= 0)
2019 {
2020 Lisp_Object string;
2021
2022 XSETSTRING (string, s);
2023 /* We also have to adjust all of the extent indices after the
2024 place we did the change. We say "pos - 1" because
2025 adjust_extents() is exclusive of the starting position
2026 passed to it. */
2027 adjust_extents (string, pos - 1, string_length (s),
2028 delta);
2029 }
2030 }
2031
2032 #ifdef VERIFY_STRING_CHARS_INTEGRITY
2033 verify_string_chars_integrity ();
2034 #endif
2035 }
2036
2037 #ifdef MULE
2038
2039 void
2040 set_string_char (struct Lisp_String *s, Charcount i, Emchar c)
2041 {
2042 Bufbyte newstr[MAX_EMCHAR_LEN];
2043 Bytecount bytoff = charcount_to_bytecount (string_data (s), i);
2044 Bytecount oldlen = charcount_to_bytecount (string_data (s) + bytoff, 1);
2045 Bytecount newlen = set_charptr_emchar (newstr, c);
2046
2047 if (oldlen != newlen)
2048 resize_string (s, bytoff, newlen - oldlen);
2049 /* Remember, string_data (s) might have changed so we can't cache it. */
2050 memcpy (string_data (s) + bytoff, newstr, newlen);
2051 }
2052
2053 #endif /* MULE */
2054
2055 DEFUN ("make-string", Fmake_string, 2, 2, 0, /*
2056 Return a new string of length LENGTH, with each character being INIT.
2057 LENGTH must be an integer and INIT must be a character.
2058 */
2059 (length, init))
2060 {
2061 CHECK_NATNUM (length);
2062 CHECK_CHAR_COERCE_INT (init);
2063 {
2064 Bufbyte init_str[MAX_EMCHAR_LEN];
2065 int len = set_charptr_emchar (init_str, XCHAR (init));
2066 Lisp_Object val = make_uninit_string (len * XINT (length));
2067
2068 if (len == 1)
2069 /* Optimize the single-byte case */
2070 memset (XSTRING_DATA (val), XCHAR (init), XSTRING_LENGTH (val));
2071 else
2072 {
2073 size_t i;
2074 Bufbyte *ptr = XSTRING_DATA (val);
2075
2076 for (i = XINT (length); i; i--)
2077 {
2078 Bufbyte *init_ptr = init_str;
2079 switch (len)
2080 {
2081 case 4: *ptr++ = *init_ptr++;
2082 case 3: *ptr++ = *init_ptr++;
2083 case 2: *ptr++ = *init_ptr++;
2084 case 1: *ptr++ = *init_ptr++;
2085 }
2086 }
2087 }
2088 return val;
2089 }
2090 }
2091
2092 DEFUN ("string", Fstring, 0, MANY, 0, /*
2093 Concatenate all the argument characters and make the result a string.
2094 */
2095 (int nargs, Lisp_Object *args))
2096 {
2097 Bufbyte *storage = alloca_array (Bufbyte, nargs * MAX_EMCHAR_LEN);
2098 Bufbyte *p = storage;
2099
2100 for (; nargs; nargs--, args++)
2101 {
2102 Lisp_Object lisp_char = *args;
2103 CHECK_CHAR_COERCE_INT (lisp_char);
2104 p += set_charptr_emchar (p, XCHAR (lisp_char));
2105 }
2106 return make_string (storage, p - storage);
2107 }
2108
2109
2110 /* Take some raw memory, which MUST already be in internal format,
2111 and package it up into a Lisp string. */
2112 Lisp_Object
2113 make_string (CONST Bufbyte *contents, Bytecount length)
2114 {
2115 Lisp_Object val;
2116
2117 /* Make sure we find out about bad make_string's when they happen */
2118 #if defined (ERROR_CHECK_BUFPOS) && defined (MULE)
2119 bytecount_to_charcount (contents, length); /* Just for the assertions */
2120 #endif
2121
2122 val = make_uninit_string (length);
2123 memcpy (XSTRING_DATA (val), contents, length);
2124 return val;
2125 }
2126
2127 /* Take some raw memory, encoded in some external data format,
2128 and convert it into a Lisp string. */
2129 Lisp_Object
2130 make_ext_string (CONST Extbyte *contents, EMACS_INT length,
2131 enum external_data_format fmt)
2132 {
2133 Bufbyte *intstr;
2134 Bytecount intlen;
2135
2136 GET_CHARPTR_INT_DATA_ALLOCA (contents, length, fmt, intstr, intlen);
2137 return make_string (intstr, intlen);
2138 }
2139
2140 Lisp_Object
2141 build_string (CONST char *str)
2142 {
2143 /* Some strlen's crash and burn if passed null. */
2144 return make_string ((CONST Bufbyte *) str, (str ? strlen(str) : 0));
2145 }
2146
2147 Lisp_Object
2148 build_ext_string (CONST char *str, enum external_data_format fmt)
2149 {
2150 /* Some strlen's crash and burn if passed null. */
2151 return make_ext_string ((CONST Extbyte *) str, (str ? strlen(str) : 0), fmt);
2152 }
2153
2154 Lisp_Object
2155 build_translated_string (CONST char *str)
2156 {
2157 return build_string (GETTEXT (str));
2158 }
2159
2160 Lisp_Object
2161 make_string_nocopy (CONST Bufbyte *contents, Bytecount length)
2162 {
2163 struct Lisp_String *s;
2164 Lisp_Object val;
2165
2166 /* Make sure we find out about bad make_string_nocopy's when they happen */
2167 #if defined (ERROR_CHECK_BUFPOS) && defined (MULE)
2168 bytecount_to_charcount (contents, length); /* Just for the assertions */
2169 #endif
2170
2171 /* Allocate the string header */
2172 ALLOCATE_FIXED_TYPE (string, struct Lisp_String, s);
2173 set_lheader_implementation (&(s->lheader), &lrecord_string);
2174 SET_C_READONLY_RECORD_HEADER (&s->lheader);
2175 s->plist = Qnil;
2176 set_string_data (s, (Bufbyte *)contents);
2177 set_string_length (s, length);
2178
2179 XSETSTRING (val, s);
2180 return val;
2181 }
2182
2183
2184 /************************************************************************/
2185 /* lcrecord lists */
2186 /************************************************************************/
2187
2188 /* Lcrecord lists are used to manage the allocation of particular
2189 sorts of lcrecords, to avoid calling alloc_lcrecord() (and thus
2190 malloc() and garbage-collection junk) as much as possible.
2191 It is similar to the Blocktype class.
2192
2193 It works like this:
2194
2195 1) Create an lcrecord-list object using make_lcrecord_list().
2196 This is often done at initialization. Remember to staticpro_nodump
2197 this object! The arguments to make_lcrecord_list() are the
2198 same as would be passed to alloc_lcrecord().
2199 2) Instead of calling alloc_lcrecord(), call allocate_managed_lcrecord()
2200 and pass the lcrecord-list earlier created.
2201 3) When done with the lcrecord, call free_managed_lcrecord().
2202 The standard freeing caveats apply: ** make sure there are no
2203 pointers to the object anywhere! **
2204 4) Calling free_managed_lcrecord() is just like kissing the
2205 lcrecord goodbye as if it were garbage-collected. This means:
2206 -- the contents of the freed lcrecord are undefined, and the
2207 contents of something produced by allocate_managed_lcrecord()
2208 are undefined, just like for alloc_lcrecord().
2209 -- the mark method for the lcrecord's type will *NEVER* be called
2210 on freed lcrecords.
2211 -- the finalize method for the lcrecord's type will be called
2212 at the time that free_managed_lcrecord() is called.
2213
2214 */
2215
2216 static Lisp_Object
2217 mark_lcrecord_list (Lisp_Object obj)
2218 {
2219 struct lcrecord_list *list = XLCRECORD_LIST (obj);
2220 Lisp_Object chain = list->free;
2221
2222 while (!NILP (chain))
2223 {
2224 struct lrecord_header *lheader = XRECORD_LHEADER (chain);
2225 struct free_lcrecord_header *free_header =
2226 (struct free_lcrecord_header *) lheader;
2227
2228 #ifdef ERROR_CHECK_GC
2229 CONST struct lrecord_implementation *implementation
2230 = LHEADER_IMPLEMENTATION(lheader);
2231
2232 /* There should be no other pointers to the free list. */
2233 assert (!MARKED_RECORD_HEADER_P (lheader));
2234 /* Only lcrecords should be here. */
2235 assert (!implementation->basic_p);
2236 /* Only free lcrecords should be here. */
2237 assert (free_header->lcheader.free);
2238 /* The type of the lcrecord must be right. */
2239 assert (implementation == list->implementation);
2240 /* So must the size. */
2241 assert (implementation->static_size == 0
2242 || implementation->static_size == list->size);
2243 #endif /* ERROR_CHECK_GC */
2244
2245 MARK_RECORD_HEADER (lheader);
2246 chain = free_header->chain;
2247 }
2248
2249 return Qnil;
2250 }
2251
2252 DEFINE_LRECORD_IMPLEMENTATION ("lcrecord-list", lcrecord_list,
2253 mark_lcrecord_list, internal_object_printer,
2254 0, 0, 0, 0, struct lcrecord_list);
2255 Lisp_Object
2256 make_lcrecord_list (size_t size,
2257 CONST struct lrecord_implementation *implementation)
2258 {
2259 struct lcrecord_list *p = alloc_lcrecord_type (struct lcrecord_list,
2260 &lrecord_lcrecord_list);
2261 Lisp_Object val;
2262
2263 p->implementation = implementation;
2264 p->size = size;
2265 p->free = Qnil;
2266 XSETLCRECORD_LIST (val, p);
2267 return val;
2268 }
2269
2270 Lisp_Object
2271 allocate_managed_lcrecord (Lisp_Object lcrecord_list)
2272 {
2273 struct lcrecord_list *list = XLCRECORD_LIST (lcrecord_list);
2274 if (!NILP (list->free))
2275 {
2276 Lisp_Object val = list->free;
2277 struct free_lcrecord_header *free_header =
2278 (struct free_lcrecord_header *) XPNTR (val);
2279
2280 #ifdef ERROR_CHECK_GC
2281 struct lrecord_header *lheader =
2282 (struct lrecord_header *) free_header;
2283 CONST struct lrecord_implementation *implementation
2284 = LHEADER_IMPLEMENTATION (lheader);
2285
2286 /* There should be no other pointers to the free list. */
2287 assert (!MARKED_RECORD_HEADER_P (lheader));
2288 /* Only lcrecords should be here. */
2289 assert (!implementation->basic_p);
2290 /* Only free lcrecords should be here. */
2291 assert (free_header->lcheader.free);
2292 /* The type of the lcrecord must be right. */
2293 assert (implementation == list->implementation);
2294 /* So must the size. */
2295 assert (implementation->static_size == 0
2296 || implementation->static_size == list->size);
2297 #endif /* ERROR_CHECK_GC */
2298 list->free = free_header->chain;
2299 free_header->lcheader.free = 0;
2300 return val;
2301 }
2302 else
2303 {
2304 Lisp_Object val;
2305
2306 XSETOBJ (val, Lisp_Type_Record,
2307 alloc_lcrecord (list->size, list->implementation));
2308 return val;
2309 }
2310 }
2311
2312 void
2313 free_managed_lcrecord (Lisp_Object lcrecord_list, Lisp_Object lcrecord)
2314 {
2315 struct lcrecord_list *list = XLCRECORD_LIST (lcrecord_list);
2316 struct free_lcrecord_header *free_header =
2317 (struct free_lcrecord_header *) XPNTR (lcrecord);
2318 struct lrecord_header *lheader =
2319 (struct lrecord_header *) free_header;
2320 CONST struct lrecord_implementation *implementation
2321 = LHEADER_IMPLEMENTATION (lheader);
2322
2323 #ifdef ERROR_CHECK_GC
2324 /* Make sure the size is correct. This will catch, for example,
2325 putting a window configuration on the wrong free list. */
2326 if (implementation->size_in_bytes_method)
2327 assert (implementation->size_in_bytes_method (lheader) == list->size);
2328 else
2329 assert (implementation->static_size == list->size);
2330 #endif /* ERROR_CHECK_GC */
2331
2332 if (implementation->finalizer)
2333 implementation->finalizer (lheader, 0);
2334 free_header->chain = list->free;
2335 free_header->lcheader.free = 1;
2336 list->free = lcrecord;
2337 }
2338
2339
2340
2341
2342 DEFUN ("purecopy", Fpurecopy, 1, 1, 0, /*
2343 Kept for compatibility, returns its argument.
2344 Old:
2345 Make a copy of OBJECT in pure storage.
2346 Recursively copies contents of vectors and cons cells.
2347 Does not copy symbols.
2348 */
2349 (obj))
2350 {
2351 return obj;
2352 }
2353
2354
2355
2356 /************************************************************************/
2357 /* Garbage Collection */
2358 /************************************************************************/
2359
2360 /* This will be used more extensively In The Future */
2361 static int last_lrecord_type_index_assigned;
2362
2363 CONST struct lrecord_implementation *lrecord_implementations_table[128];
2364 #define max_lrecord_type (countof (lrecord_implementations_table) - 1)
2365
2366 struct gcpro *gcprolist;
2367
2368 /* 415 used Mly 29-Jun-93 */
2369 /* 1327 used slb 28-Feb-98 */
2370 /* 1328 used og 03-Oct-99 (moving slowly, heh?) */
2371 #ifdef HAVE_SHLIB
2372 #define NSTATICS 4000
2373 #else
2374 #define NSTATICS 2000
2375 #endif
2376 /* Not "static" because of linker lossage on some systems */
2377 Lisp_Object *staticvec[NSTATICS]
2378 /* Force it into data space! */
2379 = {0};
2380 static int staticidx;
2381
2382 /* Put an entry in staticvec, pointing at the variable whose address is given
2383 */
2384 void
2385 staticpro (Lisp_Object *varaddress)
2386 {
2387 if (staticidx >= countof (staticvec))
2388 /* #### This is now a dubious abort() since this routine may be called */
2389 /* by Lisp attempting to load a DLL. */
2390 abort ();
2391 staticvec[staticidx++] = varaddress;
2392 }
2393
2394 /* Not "static" because of linker lossage on some systems */
2395 Lisp_Object *staticvec_nodump[200]
2396 /* Force it into data space! */
2397 = {0};
2398 static int staticidx_nodump;
2399
2400 /* Put an entry in staticvec_nodump, pointing at the variable whose address is given
2401 */
2402 void
2403 staticpro_nodump (Lisp_Object *varaddress)
2404 {
2405 if (staticidx_nodump >= countof (staticvec_nodump))
2406 /* #### This is now a dubious abort() since this routine may be called */
2407 /* by Lisp attempting to load a DLL. */
2408 abort ();
2409 staticvec_nodump[staticidx_nodump++] = varaddress;
2410 }
2411
2412 /* Not "static" because of linker lossage on some systems */
2413 struct {
2414 void *data;
2415 const struct struct_description *desc;
2416 } dumpstructvec[200];
2417
2418 static int dumpstructidx;
2419
2420 /* Put an entry in dumpstructvec, pointing at the variable whose address is given
2421 */
2422 void
2423 dumpstruct (void *varaddress, const struct struct_description *desc)
2424 {
2425 if (dumpstructidx >= countof (dumpstructvec))
2426 abort ();
2427 dumpstructvec[dumpstructidx].data = varaddress;
2428 dumpstructvec[dumpstructidx].desc = desc;
2429 dumpstructidx++;
2430 }
2431
2432 Lisp_Object *pdump_wirevec[50];
2433 static int pdump_wireidx;
2434
2435 /* Put an entry in pdump_wirevec, pointing at the variable whose address is given
2436 */
2437 void
2438 pdump_wire (Lisp_Object *varaddress)
2439 {
2440 if (pdump_wireidx >= countof (pdump_wirevec))
2441 abort ();
2442 pdump_wirevec[pdump_wireidx++] = varaddress;
2443 }
2444
2445
2446 Lisp_Object *pdump_wirevec_list[50];
2447 static int pdump_wireidx_list;
2448
2449 /* Put an entry in pdump_wirevec_list, pointing at the variable whose address is given
2450 */
2451 void
2452 pdump_wire_list (Lisp_Object *varaddress)
2453 {
2454 if (pdump_wireidx_list >= countof (pdump_wirevec_list))
2455 abort ();
2456 pdump_wirevec_list[pdump_wireidx_list++] = varaddress;
2457 }
2458
2459
2460 /* Mark reference to a Lisp_Object. If the object referred to has not been
2461 seen yet, recursively mark all the references contained in it. */
2462
2463 void
2464 mark_object (Lisp_Object obj)
2465 {
2466 tail_recurse:
2467
2468 #ifdef ERROR_CHECK_GC
2469 assert (! (EQ (obj, Qnull_pointer)));
2470 #endif
2471 /* Checks we used to perform */
2472 /* if (EQ (obj, Qnull_pointer)) return; */
2473 /* if (!POINTER_TYPE_P (XGCTYPE (obj))) return; */
2474 /* if (PURIFIED (XPNTR (obj))) return; */
2475
2476 if (XTYPE (obj) == Lisp_Type_Record)
2477 {
2478 struct lrecord_header *lheader = XRECORD_LHEADER (obj);
2479 #if defined (ERROR_CHECK_GC)
2480 assert (lheader->type <= last_lrecord_type_index_assigned);
2481 #endif
2482 if (C_READONLY_RECORD_HEADER_P (lheader))
2483 return;
2484
2485 if (! MARKED_RECORD_HEADER_P (lheader) &&
2486 ! UNMARKABLE_RECORD_HEADER_P (lheader))
2487 {
2488 CONST struct lrecord_implementation *implementation =
2489 LHEADER_IMPLEMENTATION (lheader);
2490 MARK_RECORD_HEADER (lheader);
2491 #ifdef ERROR_CHECK_GC
2492 if (!implementation->basic_p)
2493 assert (! ((struct lcrecord_header *) lheader)->free);
2494 #endif
2495 if (implementation->marker)
2496 {
2497 obj = implementation->marker (obj);
2498 if (!NILP (obj)) goto tail_recurse;
2499 }
2500 }
2501 }
2502 }
2503
2504 /* mark all of the conses in a list and mark the final cdr; but
2505 DO NOT mark the cars.
2506
2507 Use only for internal lists! There should never be other pointers
2508 to the cons cells, because if so, the cars will remain unmarked
2509 even when they maybe should be marked. */
2510 void
2511 mark_conses_in_list (Lisp_Object obj)
2512 {
2513 Lisp_Object rest;
2514
2515 for (rest = obj; CONSP (rest); rest = XCDR (rest))
2516 {
2517 if (CONS_MARKED_P (XCONS (rest)))
2518 return;
2519 MARK_CONS (XCONS (rest));
2520 }
2521
2522 mark_object (rest);
2523 }
2524
2525
2526 /* Find all structures not marked, and free them. */
2527
2528 static int gc_count_num_bit_vector_used, gc_count_bit_vector_total_size;
2529 static int gc_count_bit_vector_storage;
2530 static int gc_count_num_short_string_in_use;
2531 static int gc_count_string_total_size;
2532 static int gc_count_short_string_total_size;
2533
2534 /* static int gc_count_total_records_used, gc_count_records_total_size; */
2535
2536
2537 int
2538 lrecord_type_index (CONST struct lrecord_implementation *implementation)
2539 {
2540 int type_index = *(implementation->lrecord_type_index);
2541 /* Have to do this circuitous validation test because of problems
2542 dumping out initialized variables (ie can't set xxx_type_index to -1
2543 because that would make xxx_type_index read-only in a dumped emacs. */
2544 if (type_index < 0 || type_index > max_lrecord_type
2545 || lrecord_implementations_table[type_index] != implementation)
2546 {
2547 assert (last_lrecord_type_index_assigned < max_lrecord_type);
2548 type_index = ++last_lrecord_type_index_assigned;
2549 lrecord_implementations_table[type_index] = implementation;
2550 *(implementation->lrecord_type_index) = type_index;
2551 }
2552 return type_index;
2553 }
2554
2555 /* stats on lcrecords in use - kinda kludgy */
2556
2557 static struct
2558 {
2559 int instances_in_use;
2560 int bytes_in_use;
2561 int instances_freed;
2562 int bytes_freed;
2563 int instances_on_free_list;
2564 } lcrecord_stats [countof (lrecord_implementations_table)];
2565
2566 static void
2567 tick_lcrecord_stats (CONST struct lrecord_header *h, int free_p)
2568 {
2569 CONST struct lrecord_implementation *implementation =
2570 LHEADER_IMPLEMENTATION (h);
2571 int type_index = lrecord_type_index (implementation);
2572
2573 if (((struct lcrecord_header *) h)->free)
2574 {
2575 assert (!free_p);
2576 lcrecord_stats[type_index].instances_on_free_list++;
2577 }
2578 else
2579 {
2580 size_t sz = (implementation->size_in_bytes_method
2581 ? implementation->size_in_bytes_method (h)
2582 : implementation->static_size);
2583
2584 if (free_p)
2585 {
2586 lcrecord_stats[type_index].instances_freed++;
2587 lcrecord_stats[type_index].bytes_freed += sz;
2588 }
2589 else
2590 {
2591 lcrecord_stats[type_index].instances_in_use++;
2592 lcrecord_stats[type_index].bytes_in_use += sz;
2593 }
2594 }
2595 }
2596
2597
2598 /* Free all unmarked records */
2599 static void
2600 sweep_lcrecords_1 (struct lcrecord_header **prev, int *used)
2601 {
2602 struct lcrecord_header *header;
2603 int num_used = 0;
2604 /* int total_size = 0; */
2605
2606 xzero (lcrecord_stats); /* Reset all statistics to 0. */
2607
2608 /* First go through and call all the finalize methods.
2609 Then go through and free the objects. There used to
2610 be only one loop here, with the call to the finalizer
2611 occurring directly before the xfree() below. That
2612 is marginally faster but much less safe -- if the
2613 finalize method for an object needs to reference any
2614 other objects contained within it (and many do),
2615 we could easily be screwed by having already freed that
2616 other object. */
2617
2618 for (header = *prev; header; header = header->next)
2619 {
2620 struct lrecord_header *h = &(header->lheader);
2621 if (!C_READONLY_RECORD_HEADER_P(h)
2622 && !MARKED_RECORD_HEADER_P (h)
2623 && ! (header->free))
2624 {
2625 if (LHEADER_IMPLEMENTATION (h)->finalizer)
2626 LHEADER_IMPLEMENTATION (h)->finalizer (h, 0);
2627 }
2628 }
2629
2630 for (header = *prev; header; )
2631 {
2632 struct lrecord_header *h = &(header->lheader);
2633 if (C_READONLY_RECORD_HEADER_P(h) || MARKED_RECORD_HEADER_P (h))
2634 {
2635 if (MARKED_RECORD_HEADER_P (h))
2636 UNMARK_RECORD_HEADER (h);
2637 num_used++;
2638 /* total_size += n->implementation->size_in_bytes (h);*/
2639 /* ### May modify header->next on a C_READONLY lcrecord */
2640 prev = &(header->next);
2641 header = *prev;
2642 tick_lcrecord_stats (h, 0);
2643 }
2644 else
2645 {
2646 struct lcrecord_header *next = header->next;
2647 *prev = next;
2648 tick_lcrecord_stats (h, 1);
2649 /* used to call finalizer right here. */
2650 xfree (header);
2651 header = next;
2652 }
2653 }
2654 *used = num_used;
2655 /* *total = total_size; */
2656 }
2657
2658
2659 static void
2660 sweep_bit_vectors_1 (Lisp_Object *prev,
2661 int *used, int *total, int *storage)
2662 {
2663 Lisp_Object bit_vector;
2664 int num_used = 0;
2665 int total_size = 0;
2666 int total_storage = 0;
2667
2668 /* BIT_VECTORP fails because the objects are marked, which changes
2669 their implementation */
2670 for (bit_vector = *prev; !EQ (bit_vector, Qzero); )
2671 {
2672 Lisp_Bit_Vector *v = XBIT_VECTOR (bit_vector);
2673 int len = v->size;
2674 if (C_READONLY_RECORD_HEADER_P(&(v->lheader)) || MARKED_RECORD_P (bit_vector))
2675 {
2676 if (MARKED_RECORD_P (bit_vector))
2677 UNMARK_RECORD_HEADER (&(v->lheader));
2678 total_size += len;
2679 total_storage +=
2680 MALLOC_OVERHEAD +
2681 STRETCHY_STRUCT_SIZEOF (Lisp_Bit_Vector, bits,
2682 BIT_VECTOR_LONG_STORAGE (len));
2683 num_used++;
2684 /* ### May modify next on a C_READONLY bitvector */
2685 prev = &(bit_vector_next (v));
2686 bit_vector = *prev;
2687 }
2688 else
2689 {
2690 Lisp_Object next = bit_vector_next (v);
2691 *prev = next;
2692 xfree (v);
2693 bit_vector = next;
2694 }
2695 }
2696 *used = num_used;
2697 *total = total_size;
2698 *storage = total_storage;
2699 }
2700
2701 /* And the Lord said: Thou shalt use the `c-backslash-region' command
2702 to make macros prettier. */
2703
2704 #ifdef ERROR_CHECK_GC
2705
2706 #define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \
2707 do { \
2708 struct typename##_block *SFTB_current; \
2709 struct typename##_block **SFTB_prev; \
2710 int SFTB_limit; \
2711 int num_free = 0, num_used = 0; \
2712 \
2713 for (SFTB_prev = &current_##typename##_block, \
2714 SFTB_current = current_##typename##_block, \
2715 SFTB_limit = current_##typename##_block_index; \
2716 SFTB_current; \
2717 ) \
2718 { \
2719 int SFTB_iii; \
2720 \
2721 for (SFTB_iii = 0; SFTB_iii < SFTB_limit; SFTB_iii++) \
2722 { \
2723 obj_type *SFTB_victim = &(SFTB_current->block[SFTB_iii]); \
2724 \
2725 if (FREE_STRUCT_P (SFTB_victim)) \
2726 { \
2727 num_free++; \
2728 } \
2729 else if (C_READONLY_RECORD_HEADER_P (&SFTB_victim->lheader)) \
2730 { \
2731 num_used++; \
2732 } \
2733 else if (!MARKED_RECORD_HEADER_P (&SFTB_victim->lheader)) \
2734 { \
2735 num_free++; \
2736 FREE_FIXED_TYPE (typename, obj_type, SFTB_victim); \
2737 } \
2738 else \
2739 { \
2740 num_used++; \
2741 UNMARK_##typename (SFTB_victim); \
2742 } \
2743 } \
2744 SFTB_prev = &(SFTB_current->prev); \
2745 SFTB_current = SFTB_current->prev; \
2746 SFTB_limit = countof (current_##typename##_block->block); \
2747 } \
2748 \
2749 gc_count_num_##typename##_in_use = num_used; \
2750 gc_count_num_##typename##_freelist = num_free; \
2751 } while (0)
2752
2753 #else /* !ERROR_CHECK_GC */
2754
2755 #define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \
2756 do { \
2757 struct typename##_block *SFTB_current; \
2758 struct typename##_block **SFTB_prev; \
2759 int SFTB_limit; \
2760 int num_free = 0, num_used = 0; \
2761 \
2762 typename##_free_list = 0; \
2763 \
2764 for (SFTB_prev = &current_##typename##_block, \
2765 SFTB_current = current_##typename##_block, \
2766 SFTB_limit = current_##typename##_block_index; \
2767 SFTB_current; \
2768 ) \
2769 { \
2770 int SFTB_iii; \
2771 int SFTB_empty = 1; \
2772 obj_type *SFTB_old_free_list = typename##_free_list; \
2773 \
2774 for (SFTB_iii = 0; SFTB_iii < SFTB_limit; SFTB_iii++) \
2775 { \
2776 obj_type *SFTB_victim = &(SFTB_current->block[SFTB_iii]); \
2777 \
2778 if (FREE_STRUCT_P (SFTB_victim)) \
2779 { \
2780 num_free++; \
2781 PUT_FIXED_TYPE_ON_FREE_LIST (typename, obj_type, SFTB_victim); \
2782 } \
2783 else if (C_READONLY_RECORD_HEADER_P (&SFTB_victim->lheader)) \
2784 { \
2785 SFTB_empty = 0; \
2786 num_used++; \
2787 } \
2788 else if (!MARKED_RECORD_HEADER_P (&SFTB_victim->lheader)) \
2789 { \
2790 num_free++; \
2791 FREE_FIXED_TYPE (typename, obj_type, SFTB_victim); \
2792 } \
2793 else \
2794 { \
2795 SFTB_empty = 0; \
2796 num_used++; \
2797 UNMARK_##typename (SFTB_victim); \
2798 } \
2799 } \
2800 if (!SFTB_empty) \
2801 { \
2802 SFTB_prev = &(SFTB_current->prev); \
2803 SFTB_current = SFTB_current->prev; \
2804 } \
2805 else if (SFTB_current == current_##typename##_block \
2806 && !SFTB_current->prev) \
2807 { \
2808 /* No real point in freeing sole allocation block */ \
2809 break; \
2810 } \
2811 else \
2812 { \
2813 struct typename##_block *SFTB_victim_block = SFTB_current; \
2814 if (SFTB_victim_block == current_##typename##_block) \
2815 current_##typename##_block_index \
2816 = countof (current_##typename##_block->block); \
2817 SFTB_current = SFTB_current->prev; \
2818 { \
2819 *SFTB_prev = SFTB_current; \
2820 xfree (SFTB_victim_block); \
2821 /* Restore free list to what it was before victim was swept */ \
2822 typename##_free_list = SFTB_old_free_list; \
2823 num_free -= SFTB_limit; \
2824 } \
2825 } \
2826 SFTB_limit = countof (current_##typename##_block->block); \
2827 } \
2828 \
2829 gc_count_num_##typename##_in_use = num_used; \
2830 gc_count_num_##typename##_freelist = num_free; \
2831 } while (0)
2832
2833 #endif /* !ERROR_CHECK_GC */
2834
2835
2836
2837
2838 static void
2839 sweep_conses (void)
2840 {
2841 #define UNMARK_cons(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2842 #define ADDITIONAL_FREE_cons(ptr)
2843
2844 SWEEP_FIXED_TYPE_BLOCK (cons, struct Lisp_Cons);
2845 }
2846
2847 /* Explicitly free a cons cell. */
2848 void
2849 free_cons (struct Lisp_Cons *ptr)
2850 {
2851 #ifdef ERROR_CHECK_GC
2852 /* If the CAR is not an int, then it will be a pointer, which will
2853 always be four-byte aligned. If this cons cell has already been
2854 placed on the free list, however, its car will probably contain
2855 a chain pointer to the next cons on the list, which has cleverly
2856 had all its 0's and 1's inverted. This allows for a quick
2857 check to make sure we're not freeing something already freed. */
2858 if (POINTER_TYPE_P (XTYPE (ptr->car)))
2859 ASSERT_VALID_POINTER (XPNTR (ptr->car));
2860 #endif /* ERROR_CHECK_GC */
2861
2862 #ifndef ALLOC_NO_POOLS
2863 FREE_FIXED_TYPE_WHEN_NOT_IN_GC (cons, struct Lisp_Cons, ptr);
2864 #endif /* ALLOC_NO_POOLS */
2865 }
2866
2867 /* explicitly free a list. You **must make sure** that you have
2868 created all the cons cells that make up this list and that there
2869 are no pointers to any of these cons cells anywhere else. If there
2870 are, you will lose. */
2871
2872 void
2873 free_list (Lisp_Object list)
2874 {
2875 Lisp_Object rest, next;
2876
2877 for (rest = list; !NILP (rest); rest = next)
2878 {
2879 next = XCDR (rest);
2880 free_cons (XCONS (rest));
2881 }
2882 }
2883
2884 /* explicitly free an alist. You **must make sure** that you have
2885 created all the cons cells that make up this alist and that there
2886 are no pointers to any of these cons cells anywhere else. If there
2887 are, you will lose. */
2888
2889 void
2890 free_alist (Lisp_Object alist)
2891 {
2892 Lisp_Object rest, next;
2893
2894 for (rest = alist; !NILP (rest); rest = next)
2895 {
2896 next = XCDR (rest);
2897 free_cons (XCONS (XCAR (rest)));
2898 free_cons (XCONS (rest));
2899 }
2900 }
2901
2902 static void
2903 sweep_compiled_functions (void)
2904 {
2905 #define UNMARK_compiled_function(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2906 #define ADDITIONAL_FREE_compiled_function(ptr)
2907
2908 SWEEP_FIXED_TYPE_BLOCK (compiled_function, Lisp_Compiled_Function);
2909 }
2910
2911
2912 #ifdef LISP_FLOAT_TYPE
2913 static void
2914 sweep_floats (void)
2915 {
2916 #define UNMARK_float(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2917 #define ADDITIONAL_FREE_float(ptr)
2918
2919 SWEEP_FIXED_TYPE_BLOCK (float, struct Lisp_Float);
2920 }
2921 #endif /* LISP_FLOAT_TYPE */
2922
2923 static void
2924 sweep_symbols (void)
2925 {
2926 #define UNMARK_symbol(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2927 #define ADDITIONAL_FREE_symbol(ptr)
2928
2929 SWEEP_FIXED_TYPE_BLOCK (symbol, struct Lisp_Symbol);
2930 }
2931
2932 static void
2933 sweep_extents (void)
2934 {
2935 #define UNMARK_extent(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2936 #define ADDITIONAL_FREE_extent(ptr)
2937
2938 SWEEP_FIXED_TYPE_BLOCK (extent, struct extent);
2939 }
2940
2941 static void
2942 sweep_events (void)
2943 {
2944 #define UNMARK_event(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2945 #define ADDITIONAL_FREE_event(ptr)
2946
2947 SWEEP_FIXED_TYPE_BLOCK (event, struct Lisp_Event);
2948 }
2949
2950 static void
2951 sweep_markers (void)
2952 {
2953 #define UNMARK_marker(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2954 #define ADDITIONAL_FREE_marker(ptr) \
2955 do { Lisp_Object tem; \
2956 XSETMARKER (tem, ptr); \
2957 unchain_marker (tem); \
2958 } while (0)
2959
2960 SWEEP_FIXED_TYPE_BLOCK (marker, struct Lisp_Marker);
2961 }
2962
2963 /* Explicitly free a marker. */
2964 void
2965 free_marker (struct Lisp_Marker *ptr)
2966 {
2967 #ifdef ERROR_CHECK_GC
2968 /* Perhaps this will catch freeing an already-freed marker. */
2969 Lisp_Object temmy;
2970 XSETMARKER (temmy, ptr);
2971 assert (MARKERP (temmy));
2972 #endif /* ERROR_CHECK_GC */
2973
2974 #ifndef ALLOC_NO_POOLS
2975 FREE_FIXED_TYPE_WHEN_NOT_IN_GC (marker, struct Lisp_Marker, ptr);
2976 #endif /* ALLOC_NO_POOLS */
2977 }
2978
2979
2980 #if defined (MULE) && defined (VERIFY_STRING_CHARS_INTEGRITY)
2981
2982 static void
2983 verify_string_chars_integrity (void)
2984 {
2985 struct string_chars_block *sb;
2986
2987 /* Scan each existing string block sequentially, string by string. */
2988 for (sb = first_string_chars_block; sb; sb = sb->next)
2989 {
2990 int pos = 0;
2991 /* POS is the index of the next string in the block. */
2992 while (pos < sb->pos)
2993 {
2994 struct string_chars *s_chars =
2995 (struct string_chars *) &(sb->string_chars[pos]);
2996 struct Lisp_String *string;
2997 int size;
2998 int fullsize;
2999
3000 /* If the string_chars struct is marked as free (i.e. the STRING
3001 pointer is 0xFFFFFFFF) then this is an unused chunk of string
3002 storage. (See below.) */
3003
3004 if (FREE_STRUCT_P (s_chars))
3005 {
3006 fullsize = ((struct unused_string_chars *) s_chars)->fullsize;
3007 pos += fullsize;
3008 continue;
3009 }
3010
3011 string = s_chars->string;
3012 /* Must be 32-bit aligned. */
3013 assert ((((int) string) & 3) == 0);
3014
3015 size = string_length (string);
3016 fullsize = STRING_FULLSIZE (size);
3017
3018 assert (!BIG_STRING_FULLSIZE_P (fullsize));
3019 assert (string_data (string) == s_chars->chars);
3020 pos += fullsize;
3021 }
3022 assert (pos == sb->pos);
3023 }
3024 }
3025
3026 #endif /* MULE && ERROR_CHECK_GC */
3027
3028 /* Compactify string chars, relocating the reference to each --
3029 free any empty string_chars_block we see. */
3030 static void
3031 compact_string_chars (void)
3032 {
3033 struct string_chars_block *to_sb = first_string_chars_block;
3034 int to_pos = 0;
3035 struct string_chars_block *from_sb;
3036
3037 /* Scan each existing string block sequentially, string by string. */
3038 for (from_sb = first_string_chars_block; from_sb; from_sb = from_sb->next)
3039 {
3040 int from_pos = 0;
3041 /* FROM_POS is the index of the next string in the block. */
3042 while (from_pos < from_sb->pos)
3043 {
3044 struct string_chars *from_s_chars =
3045 (struct string_chars *) &(from_sb->string_chars[from_pos]);
3046 struct string_chars *to_s_chars;
3047 struct Lisp_String *string;
3048 int size;
3049 int fullsize;
3050
3051 /* If the string_chars struct is marked as free (i.e. the STRING
3052 pointer is 0xFFFFFFFF) then this is an unused chunk of string
3053 storage. This happens under Mule when a string's size changes
3054 in such a way that its fullsize changes. (Strings can change
3055 size because a different-length character can be substituted
3056 for another character.) In this case, after the bogus string
3057 pointer is the "fullsize" of this entry, i.e. how many bytes
3058 to skip. */
3059
3060 if (FREE_STRUCT_P (from_s_chars))
3061 {
3062 fullsize = ((struct unused_string_chars *) from_s_chars)->fullsize;
3063 from_pos += fullsize;
3064 continue;
3065 }
3066
3067 string = from_s_chars->string;
3068 assert (!(FREE_STRUCT_P (string)));
3069
3070 size = string_length (string);
3071 fullsize = STRING_FULLSIZE (size);
3072
3073 if (BIG_STRING_FULLSIZE_P (fullsize))
3074 abort ();
3075
3076 /* Just skip it if it isn't marked. */
3077 if (! MARKED_RECORD_HEADER_P (&(string->lheader)))
3078 {
3079 from_pos += fullsize;
3080 continue;
3081 }
3082
3083 /* If it won't fit in what's left of TO_SB, close TO_SB out
3084 and go on to the next string_chars_block. We know that TO_SB
3085 cannot advance past FROM_SB here since FROM_SB is large enough
3086 to currently contain this string. */
3087 if ((to_pos + fullsize) > countof (to_sb->string_chars))
3088 {
3089 to_sb->pos = to_pos;
3090 to_sb = to_sb->next;
3091 to_pos = 0;
3092 }
3093
3094 /* Compute new address of this string
3095 and update TO_POS for the space being used. */
3096 to_s_chars = (struct string_chars *) &(to_sb->string_chars[to_pos]);
3097
3098 /* Copy the string_chars to the new place. */
3099 if (from_s_chars != to_s_chars)
3100 memmove (to_s_chars, from_s_chars, fullsize);
3101
3102 /* Relocate FROM_S_CHARS's reference */
3103 set_string_data (string, &(to_s_chars->chars[0]));
3104
3105 from_pos += fullsize;
3106 to_pos += fullsize;
3107 }
3108 }
3109
3110 /* Set current to the last string chars block still used and
3111 free any that follow. */
3112 {
3113 struct string_chars_block *victim;
3114
3115 for (victim = to_sb->next; victim; )
3116 {
3117 struct string_chars_block *next = victim->next;
3118 xfree (victim);
3119 victim = next;
3120 }
3121
3122 current_string_chars_block = to_sb;
3123 current_string_chars_block->pos = to_pos;
3124 current_string_chars_block->next = 0;
3125 }
3126 }
3127
3128 #if 1 /* Hack to debug missing purecopy's */
3129 static int debug_string_purity;
3130
3131 static void
3132 debug_string_purity_print (struct Lisp_String *p)
3133 {
3134 Charcount i;
3135 Charcount s = string_char_length (p);
3136 putc ('\"', stderr);
3137 for (i = 0; i < s; i++)
3138 {
3139 Emchar ch = string_char (p, i);
3140 if (ch < 32 || ch >= 126)
3141 stderr_out ("\\%03o", ch);
3142 else if (ch == '\\' || ch == '\"')
3143 stderr_out ("\\%c", ch);
3144 else
3145 stderr_out ("%c", ch);
3146 }
3147 stderr_out ("\"\n");
3148 }
3149 #endif /* 1 */
3150
3151
3152 static void
3153 sweep_strings (void)
3154 {
3155 int num_small_used = 0, num_small_bytes = 0, num_bytes = 0;
3156 int debug = debug_string_purity;
3157
3158 #define UNMARK_string(ptr) \
3159 do { struct Lisp_String *p = (ptr); \
3160 int size = string_length (p); \
3161 UNMARK_RECORD_HEADER (&(p->lheader)); \
3162 num_bytes += size; \
3163 if (!BIG_STRING_SIZE_P (size)) \
3164 { num_small_bytes += size; \
3165 num_small_used++; \
3166 } \
3167 if (debug) debug_string_purity_print (p); \
3168 } while (0)
3169 #define ADDITIONAL_FREE_string(p) \
3170 do { int size = string_length (p); \
3171 if (BIG_STRING_SIZE_P (size)) \
3172 xfree_1 (CHARS_TO_STRING_CHAR (string_data (p))); \
3173 } while (0)
3174
3175 SWEEP_FIXED_TYPE_BLOCK (string, struct Lisp_String);
3176
3177 gc_count_num_short_string_in_use = num_small_used;
3178 gc_count_string_total_size = num_bytes;
3179 gc_count_short_string_total_size = num_small_bytes;
3180 }
3181
3182
3183 /* I hate duplicating all this crap! */
3184 int
3185 marked_p (Lisp_Object obj)
3186 {
3187 #ifdef ERROR_CHECK_GC
3188 assert (! (EQ (obj, Qnull_pointer)));
3189 #endif
3190 /* Checks we used to perform. */
3191 /* if (EQ (obj, Qnull_pointer)) return 1; */
3192 /* if (!POINTER_TYPE_P (XGCTYPE (obj))) return 1; */
3193 /* if (PURIFIED (XPNTR (obj))) return 1; */
3194
3195 if (XTYPE (obj) == Lisp_Type_Record)
3196 {
3197 struct lrecord_header *lheader = XRECORD_LHEADER (obj);
3198 #if defined (ERROR_CHECK_GC)
3199 assert (lheader->type <= last_lrecord_type_index_assigned);
3200 #endif
3201 return C_READONLY_RECORD_HEADER_P (lheader) || MARKED_RECORD_HEADER_P (lheader);
3202 }
3203 return 1;
3204 }
3205
3206 static void
3207 gc_sweep (void)
3208 {
3209 /* Free all unmarked records. Do this at the very beginning,
3210 before anything else, so that the finalize methods can safely
3211 examine items in the objects. sweep_lcrecords_1() makes
3212 sure to call all the finalize methods *before* freeing anything,
3213 to complete the safety. */
3214 {
3215 int ignored;
3216 sweep_lcrecords_1 (&all_lcrecords, &ignored);
3217 }
3218
3219 compact_string_chars ();
3220
3221 /* Finalize methods below (called through the ADDITIONAL_FREE_foo
3222 macros) must be *extremely* careful to make sure they're not
3223 referencing freed objects. The only two existing finalize
3224 methods (for strings and markers) pass muster -- the string
3225 finalizer doesn't look at anything but its own specially-
3226 created block, and the marker finalizer only looks at live
3227 buffers (which will never be freed) and at the markers before
3228 and after it in the chain (which, by induction, will never be
3229 freed because if so, they would have already removed themselves
3230 from the chain). */
3231
3232 /* Put all unmarked strings on free list, free'ing the string chars
3233 of large unmarked strings */
3234 sweep_strings ();
3235
3236 /* Put all unmarked conses on free list */
3237 sweep_conses ();
3238
3239 /* Free all unmarked bit vectors */
3240 sweep_bit_vectors_1 (&all_bit_vectors,
3241 &gc_count_num_bit_vector_used,
3242 &gc_count_bit_vector_total_size,
3243 &gc_count_bit_vector_storage);
3244
3245 /* Free all unmarked compiled-function objects */
3246 sweep_compiled_functions ();
3247
3248 #ifdef LISP_FLOAT_TYPE
3249 /* Put all unmarked floats on free list */
3250 sweep_floats ();
3251 #endif
3252
3253 /* Put all unmarked symbols on free list */
3254 sweep_symbols ();
3255
3256 /* Put all unmarked extents on free list */
3257 sweep_extents ();
3258
3259 /* Put all unmarked markers on free list.
3260 Dechain each one first from the buffer into which it points. */
3261 sweep_markers ();
3262
3263 sweep_events ();
3264
3265 #ifdef PDUMP
3266 /* Unmark all dumped objects */
3267 {
3268 int i;
3269 char *p = pdump_rt_list;
3270 if(p)
3271 for(;;)
3272 {
3273 pdump_reloc_table *rt = (pdump_reloc_table *)p;
3274 p += sizeof (pdump_reloc_table);
3275 if (rt->desc) {
3276 for (i=0; i<rt->count; i++)
3277 {
3278 UNMARK_RECORD_HEADER ((struct lrecord_header *)(*(EMACS_INT *)p));
3279 p += sizeof (EMACS_INT);
3280 }
3281 } else
3282 break;
3283 }
3284 }
3285 #endif
3286 }
3287
3288 /* Clearing for disksave. */
3289
3290 void
3291 disksave_object_finalization (void)
3292 {
3293 /* It's important that certain information from the environment not get
3294 dumped with the executable (pathnames, environment variables, etc.).
3295 To make it easier to tell when this has happened with strings(1) we
3296 clear some known-to-be-garbage blocks of memory, so that leftover
3297 results of old evaluation don't look like potential problems.
3298 But first we set some notable variables to nil and do one more GC,
3299 to turn those strings into garbage.
3300 */
3301
3302 /* Yeah, this list is pretty ad-hoc... */
3303 Vprocess_environment = Qnil;
3304 Vexec_directory = Qnil;
3305 Vdata_directory = Qnil;
3306 Vsite_directory = Qnil;
3307 Vdoc_directory = Qnil;
3308 Vconfigure_info_directory = Qnil;
3309 Vexec_path = Qnil;
3310 Vload_path = Qnil;
3311 /* Vdump_load_path = Qnil; */
3312 /* Release hash tables for locate_file */
3313 Flocate_file_clear_hashing (Qt);
3314 uncache_home_directory();
3315
3316 #if defined(LOADHIST) && !(defined(LOADHIST_DUMPED) || \
3317 defined(LOADHIST_BUILTIN))
3318 Vload_history = Qnil;
3319 #endif
3320 Vshell_file_name = Qnil;
3321
3322 garbage_collect_1 ();
3323
3324 /* Run the disksave finalization methods of all live objects. */
3325 disksave_object_finalization_1 ();
3326
3327 /* Zero out the uninitialized (really, unused) part of the containers
3328 for the live strings. */
3329 {
3330 struct string_chars_block *scb;
3331 for (scb = first_string_chars_block; scb; scb = scb->next)
3332 {
3333 int count = sizeof (scb->string_chars) - scb->pos;
3334
3335 assert (count >= 0 && count < STRING_CHARS_BLOCK_SIZE);
3336 if (count != 0) {
3337 /* from the block's fill ptr to the end */
3338 memset ((scb->string_chars + scb->pos), 0, count);
3339 }
3340 }
3341 }
3342
3343 /* There, that ought to be enough... */
3344
3345 }
3346
3347
3348 Lisp_Object
3349 restore_gc_inhibit (Lisp_Object val)
3350 {
3351 gc_currently_forbidden = XINT (val);
3352 return val;
3353 }
3354
3355 /* Maybe we want to use this when doing a "panic" gc after memory_full()? */
3356 static int gc_hooks_inhibited;
3357
3358
3359 void
3360 garbage_collect_1 (void)
3361 {
3362 #if MAX_SAVE_STACK > 0
3363 char stack_top_variable;
3364 extern char *stack_bottom;
3365 #endif
3366 struct frame *f;
3367 int speccount;
3368 int cursor_changed;
3369 Lisp_Object pre_gc_cursor;
3370 struct gcpro gcpro1;
3371
3372 if (gc_in_progress
3373 || gc_currently_forbidden
3374 || in_display
3375 || preparing_for_armageddon)
3376 return;
3377
3378 /* We used to call selected_frame() here.
3379
3380 The following functions cannot be called inside GC
3381 so we move to after the above tests. */
3382 {
3383 Lisp_Object frame;
3384 Lisp_Object device = Fselected_device (Qnil);
3385 if (NILP (device)) /* Could happen during startup, eg. if always_gc */
3386 return;
3387 frame = DEVICE_SELECTED_FRAME (XDEVICE (device));
3388 if (NILP (frame))
3389 signal_simple_error ("No frames exist on device", device);
3390 f = XFRAME (frame);
3391 }
3392
3393 pre_gc_cursor = Qnil;
3394 cursor_changed = 0;
3395
3396 GCPRO1 (pre_gc_cursor);
3397
3398 /* Very important to prevent GC during any of the following
3399 stuff that might run Lisp code; otherwise, we'll likely
3400 have infinite GC recursion. */
3401 speccount = specpdl_depth ();
3402 record_unwind_protect (restore_gc_inhibit,
3403 make_int (gc_currently_forbidden));
3404 gc_currently_forbidden = 1;
3405
3406 if (!gc_hooks_inhibited)
3407 run_hook_trapping_errors ("Error in pre-gc-hook", Qpre_gc_hook);
3408
3409 /* Now show the GC cursor/message. */
3410 if (!noninteractive)
3411 {
3412 if (FRAME_WIN_P (f))
3413 {
3414 Lisp_Object frame = make_frame (f);
3415 Lisp_Object cursor = glyph_image_instance (Vgc_pointer_glyph,
3416 FRAME_SELECTED_WINDOW (f),
3417 ERROR_ME_NOT, 1);
3418 pre_gc_cursor = f->pointer;
3419 if (POINTER_IMAGE_INSTANCEP (cursor)
3420 /* don't change if we don't know how to change back. */
3421 && POINTER_IMAGE_INSTANCEP (pre_gc_cursor))
3422 {
3423 cursor_changed = 1;
3424 Fset_frame_pointer (frame, cursor);
3425 }
3426 }
3427
3428 /* Don't print messages to the stream device. */
3429 if (!cursor_changed && !FRAME_STREAM_P (f))
3430 {
3431 char *msg = (STRINGP (Vgc_message)
3432 ? GETTEXT ((char *) XSTRING_DATA (Vgc_message))
3433 : 0);
3434 Lisp_Object args[2], whole_msg;
3435 args[0] = build_string (msg ? msg :
3436 GETTEXT ((CONST char *) gc_default_message));
3437 args[1] = build_string ("...");
3438 whole_msg = Fconcat (2, args);
3439 echo_area_message (f, (Bufbyte *) 0, whole_msg, 0, -1,
3440 Qgarbage_collecting);
3441 }
3442 }
3443
3444 /***** Now we actually start the garbage collection. */
3445
3446 gc_in_progress = 1;
3447
3448 gc_generation_number[0]++;
3449
3450 #if MAX_SAVE_STACK > 0
3451
3452 /* Save a copy of the contents of the stack, for debugging. */
3453 if (!purify_flag)
3454 {
3455 /* Static buffer in which we save a copy of the C stack at each GC. */
3456 static char *stack_copy;
3457 static size_t stack_copy_size;
3458
3459 ptrdiff_t stack_diff = &stack_top_variable - stack_bottom;
3460 size_t stack_size = (stack_diff > 0 ? stack_diff : -stack_diff);
3461 if (stack_size < MAX_SAVE_STACK)
3462 {
3463 if (stack_copy_size < stack_size)
3464 {
3465 stack_copy = (char *) xrealloc (stack_copy, stack_size);
3466 stack_copy_size = stack_size;
3467 }
3468
3469 memcpy (stack_copy,
3470 stack_diff > 0 ? stack_bottom : &stack_top_variable,
3471 stack_size);
3472 }
3473 }
3474 #endif /* MAX_SAVE_STACK > 0 */
3475
3476 /* Do some totally ad-hoc resource clearing. */
3477 /* #### generalize this? */
3478 clear_event_resource ();
3479 cleanup_specifiers ();
3480
3481 /* Mark all the special slots that serve as the roots of accessibility. */
3482
3483 { /* staticpro() */
3484 int i;
3485 for (i = 0; i < staticidx; i++)
3486 mark_object (*(staticvec[i]));
3487 for (i = 0; i < staticidx_nodump; i++)
3488 mark_object (*(staticvec_nodump[i]));
3489 }
3490
3491 { /* GCPRO() */
3492 struct gcpro *tail;
3493 int i;
3494 for (tail = gcprolist; tail; tail = tail->next)
3495 for (i = 0; i < tail->nvars; i++)
3496 mark_object (tail->var[i]);
3497 }
3498
3499 { /* specbind() */
3500 struct specbinding *bind;
3501 for (bind = specpdl; bind != specpdl_ptr; bind++)
3502 {
3503 mark_object (bind->symbol);
3504 mark_object (bind->old_value);
3505 }
3506 }
3507
3508 {
3509 struct catchtag *catch;
3510 for (catch = catchlist; catch; catch = catch->next)
3511 {
3512 mark_object (catch->tag);
3513 mark_object (catch->val);
3514 }
3515 }
3516
3517 {
3518 struct backtrace *backlist;
3519 for (backlist = backtrace_list; backlist; backlist = backlist->next)
3520 {
3521 int nargs = backlist->nargs;
3522 int i;
3523
3524 mark_object (*backlist->function);
3525 if (nargs == UNEVALLED || nargs == MANY)
3526 mark_object (backlist->args[0]);
3527 else
3528 for (i = 0; i < nargs; i++)
3529 mark_object (backlist->args[i]);
3530 }
3531 }
3532
3533 mark_redisplay ();
3534 mark_profiling_info ();
3535
3536 /* OK, now do the after-mark stuff. This is for things that
3537 are only marked when something else is marked (e.g. weak hash tables).
3538 There may be complex dependencies between such objects -- e.g.
3539 a weak hash table might be unmarked, but after processing a later
3540 weak hash table, the former one might get marked. So we have to
3541 iterate until nothing more gets marked. */
3542
3543 while (finish_marking_weak_hash_tables () > 0 ||
3544 finish_marking_weak_lists () > 0)
3545 ;
3546
3547 /* And prune (this needs to be called after everything else has been
3548 marked and before we do any sweeping). */
3549 /* #### this is somewhat ad-hoc and should probably be an object
3550 method */
3551 prune_weak_hash_tables ();
3552 prune_weak_lists ();
3553 prune_specifiers ();
3554 prune_syntax_tables ();
3555
3556 gc_sweep ();
3557
3558 consing_since_gc = 0;
3559 #ifndef DEBUG_XEMACS
3560 /* Allow you to set it really fucking low if you really want ... */
3561 if (gc_cons_threshold < 10000)
3562 gc_cons_threshold = 10000;
3563 #endif
3564
3565 gc_in_progress = 0;
3566
3567 /******* End of garbage collection ********/
3568
3569 run_hook_trapping_errors ("Error in post-gc-hook", Qpost_gc_hook);
3570
3571 /* Now remove the GC cursor/message */
3572 if (!noninteractive)
3573 {
3574 if (cursor_changed)
3575 Fset_frame_pointer (make_frame (f), pre_gc_cursor);
3576 else if (!FRAME_STREAM_P (f))
3577 {
3578 char *msg = (STRINGP (Vgc_message)
3579 ? GETTEXT ((char *) XSTRING_DATA (Vgc_message))
3580 : 0);
3581
3582 /* Show "...done" only if the echo area would otherwise be empty. */
3583 if (NILP (clear_echo_area (selected_frame (),
3584 Qgarbage_collecting, 0)))
3585 {
3586 Lisp_Object args[2], whole_msg;
3587 args[0] = build_string (msg ? msg :
3588 GETTEXT ((CONST char *)
3589 gc_default_message));
3590 args[1] = build_string ("... done");
3591 whole_msg = Fconcat (2, args);
3592 echo_area_message (selected_frame (), (Bufbyte *) 0,
3593 whole_msg, 0, -1,
3594 Qgarbage_collecting);
3595 }
3596 }
3597 }
3598
3599 /* now stop inhibiting GC */
3600 unbind_to (speccount, Qnil);
3601
3602 if (!breathing_space)
3603 {
3604 breathing_space = malloc (4096 - MALLOC_OVERHEAD);
3605 }
3606
3607 UNGCPRO;
3608 return;
3609 }
3610
3611 /* Debugging aids. */
3612
3613 static Lisp_Object
3614 gc_plist_hack (CONST char *name, int value, Lisp_Object tail)
3615 {
3616 /* C doesn't have local functions (or closures, or GC, or readable syntax,
3617 or portable numeric datatypes, or bit-vectors, or characters, or
3618 arrays, or exceptions, or ...) */
3619 return cons3 (intern (name), make_int (value), tail);
3620 }
3621
3622 #define HACK_O_MATIC(type, name, pl) do { \
3623 int s = 0; \
3624 struct type##_block *x = current_##type##_block; \
3625 while (x) { s += sizeof (*x) + MALLOC_OVERHEAD; x = x->prev; } \
3626 (pl) = gc_plist_hack ((name), s, (pl)); \
3627 } while (0)
3628
3629 DEFUN ("garbage-collect", Fgarbage_collect, 0, 0, "", /*
3630 Reclaim storage for Lisp objects no longer needed.
3631 Return info on amount of space in use:
3632 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)
3633 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS
3634 PLIST)
3635 where `PLIST' is a list of alternating keyword/value pairs providing
3636 more detailed information.
3637 Garbage collection happens automatically if you cons more than
3638 `gc-cons-threshold' bytes of Lisp data since previous garbage collection.
3639 */
3640 ())
3641 {
3642 Lisp_Object pl = Qnil;
3643 int i;
3644 int gc_count_vector_total_size = 0;
3645
3646 garbage_collect_1 ();
3647
3648 for (i = 0; i <= last_lrecord_type_index_assigned; i++)
3649 {
3650 if (lcrecord_stats[i].bytes_in_use != 0
3651 || lcrecord_stats[i].bytes_freed != 0
3652 || lcrecord_stats[i].instances_on_free_list != 0)
3653 {
3654 char buf [255];
3655 CONST char *name = lrecord_implementations_table[i]->name;
3656 int len = strlen (name);
3657 /* save this for the FSFmacs-compatible part of the summary */
3658 if (i == *lrecord_vector.lrecord_type_index)
3659 gc_count_vector_total_size =
3660 lcrecord_stats[i].bytes_in_use + lcrecord_stats[i].bytes_freed;
3661
3662 sprintf (buf, "%s-storage", name);
3663 pl = gc_plist_hack (buf, lcrecord_stats[i].bytes_in_use, pl);
3664 /* Okay, simple pluralization check for `symbol-value-varalias' */
3665 if (name[len-1] == 's')
3666 sprintf (buf, "%ses-freed", name);
3667 else
3668 sprintf (buf, "%ss-freed", name);
3669 if (lcrecord_stats[i].instances_freed != 0)
3670 pl = gc_plist_hack (buf, lcrecord_stats[i].instances_freed, pl);
3671 if (name[len-1] == 's')
3672 sprintf (buf, "%ses-on-free-list", name);
3673 else
3674 sprintf (buf, "%ss-on-free-list", name);
3675 if (lcrecord_stats[i].instances_on_free_list != 0)
3676 pl = gc_plist_hack (buf, lcrecord_stats[i].instances_on_free_list,
3677 pl);
3678 if (name[len-1] == 's')
3679 sprintf (buf, "%ses-used", name);
3680 else
3681 sprintf (buf, "%ss-used", name);
3682 pl = gc_plist_hack (buf, lcrecord_stats[i].instances_in_use, pl);
3683 }
3684 }
3685
3686 HACK_O_MATIC (extent, "extent-storage", pl);
3687 pl = gc_plist_hack ("extents-free", gc_count_num_extent_freelist, pl);
3688 pl = gc_plist_hack ("extents-used", gc_count_num_extent_in_use, pl);
3689 HACK_O_MATIC (event, "event-storage", pl);
3690 pl = gc_plist_hack ("events-free", gc_count_num_event_freelist, pl);
3691 pl = gc_plist_hack ("events-used", gc_count_num_event_in_use, pl);
3692 HACK_O_MATIC (marker, "marker-storage", pl);
3693 pl = gc_plist_hack ("markers-free", gc_count_num_marker_freelist, pl);
3694 pl = gc_plist_hack ("markers-used", gc_count_num_marker_in_use, pl);
3695 #ifdef LISP_FLOAT_TYPE
3696 HACK_O_MATIC (float, "float-storage", pl);
3697 pl = gc_plist_hack ("floats-free", gc_count_num_float_freelist, pl);
3698 pl = gc_plist_hack ("floats-used", gc_count_num_float_in_use, pl);
3699 #endif /* LISP_FLOAT_TYPE */
3700 HACK_O_MATIC (string, "string-header-storage", pl);
3701 pl = gc_plist_hack ("long-strings-total-length",
3702 gc_count_string_total_size
3703 - gc_count_short_string_total_size, pl);
3704 HACK_O_MATIC (string_chars, "short-string-storage", pl);
3705 pl = gc_plist_hack ("short-strings-total-length",
3706 gc_count_short_string_total_size, pl);
3707 pl = gc_plist_hack ("strings-free", gc_count_num_string_freelist, pl);
3708 pl = gc_plist_hack ("long-strings-used",
3709 gc_count_num_string_in_use
3710 - gc_count_num_short_string_in_use, pl);
3711 pl = gc_plist_hack ("short-strings-used",
3712 gc_count_num_short_string_in_use, pl);
3713
3714 HACK_O_MATIC (compiled_function, "compiled-function-storage", pl);
3715 pl = gc_plist_hack ("compiled-functions-free",
3716 gc_count_num_compiled_function_freelist, pl);
3717 pl = gc_plist_hack ("compiled-functions-used",
3718 gc_count_num_compiled_function_in_use, pl);
3719
3720 pl = gc_plist_hack ("bit-vector-storage", gc_count_bit_vector_storage, pl);
3721 pl = gc_plist_hack ("bit-vectors-total-length",
3722 gc_count_bit_vector_total_size, pl);
3723 pl = gc_plist_hack ("bit-vectors-used", gc_count_num_bit_vector_used, pl);
3724
3725 HACK_O_MATIC (symbol, "symbol-storage", pl);
3726 pl = gc_plist_hack ("symbols-free", gc_count_num_symbol_freelist, pl);
3727 pl = gc_plist_hack ("symbols-used", gc_count_num_symbol_in_use, pl);
3728
3729 HACK_O_MATIC (cons, "cons-storage", pl);
3730 pl = gc_plist_hack ("conses-free", gc_count_num_cons_freelist, pl);
3731 pl = gc_plist_hack ("conses-used", gc_count_num_cons_in_use, pl);
3732
3733 /* The things we do for backwards-compatibility */
3734 return
3735 list6 (Fcons (make_int (gc_count_num_cons_in_use),
3736 make_int (gc_count_num_cons_freelist)),
3737 Fcons (make_int (gc_count_num_symbol_in_use),
3738 make_int (gc_count_num_symbol_freelist)),
3739 Fcons (make_int (gc_count_num_marker_in_use),
3740 make_int (gc_count_num_marker_freelist)),
3741 make_int (gc_count_string_total_size),
3742 make_int (gc_count_vector_total_size),
3743 pl);
3744 }
3745 #undef HACK_O_MATIC
3746
3747 DEFUN ("consing-since-gc", Fconsing_since_gc, 0, 0, "", /*
3748 Return the number of bytes consed since the last garbage collection.
3749 \"Consed\" is a misnomer in that this actually counts allocation
3750 of all different kinds of objects, not just conses.
3751
3752 If this value exceeds `gc-cons-threshold', a garbage collection happens.
3753 */
3754 ())
3755 {
3756 return make_int (consing_since_gc);
3757 }
3758
3759 DEFUN ("memory-limit", Fmemory_limit, 0, 0, "", /*
3760 Return the address of the last byte Emacs has allocated, divided by 1024.
3761 This may be helpful in debugging Emacs's memory usage.
3762 The value is divided by 1024 to make sure it will fit in a lisp integer.
3763 */
3764 ())
3765 {
3766 return make_int ((EMACS_INT) sbrk (0) / 1024);
3767 }
3768
3769
3770
3771 int
3772 object_dead_p (Lisp_Object obj)
3773 {
3774 return ((BUFFERP (obj) && !BUFFER_LIVE_P (XBUFFER (obj))) ||
3775 (FRAMEP (obj) && !FRAME_LIVE_P (XFRAME (obj))) ||
3776 (WINDOWP (obj) && !WINDOW_LIVE_P (XWINDOW (obj))) ||
3777 (DEVICEP (obj) && !DEVICE_LIVE_P (XDEVICE (obj))) ||
3778 (CONSOLEP (obj) && !CONSOLE_LIVE_P (XCONSOLE (obj))) ||
3779 (EVENTP (obj) && !EVENT_LIVE_P (XEVENT (obj))) ||
3780 (EXTENTP (obj) && !EXTENT_LIVE_P (XEXTENT (obj))));
3781 }
3782
3783 #ifdef MEMORY_USAGE_STATS
3784
3785 /* Attempt to determine the actual amount of space that is used for
3786 the block allocated starting at PTR, supposedly of size "CLAIMED_SIZE".
3787
3788 It seems that the following holds:
3789
3790 1. When using the old allocator (malloc.c):
3791
3792 -- blocks are always allocated in chunks of powers of two. For
3793 each block, there is an overhead of 8 bytes if rcheck is not
3794 defined, 20 bytes if it is defined. In other words, a
3795 one-byte allocation needs 8 bytes of overhead for a total of
3796 9 bytes, and needs to have 16 bytes of memory chunked out for
3797 it.
3798
3799 2. When using the new allocator (gmalloc.c):
3800
3801 -- blocks are always allocated in chunks of powers of two up
3802 to 4096 bytes. Larger blocks are allocated in chunks of
3803 an integral multiple of 4096 bytes. The minimum block
3804 size is 2*sizeof (void *), or 16 bytes if SUNOS_LOCALTIME_BUG
3805 is defined. There is no per-block overhead, but there
3806 is an overhead of 3*sizeof (size_t) for each 4096 bytes
3807 allocated.
3808
3809 3. When using the system malloc, anything goes, but they are
3810 generally slower and more space-efficient than the GNU
3811 allocators. One possibly reasonable assumption to make
3812 for want of better data is that sizeof (void *), or maybe
3813 2 * sizeof (void *), is required as overhead and that
3814 blocks are allocated in the minimum required size except
3815 that some minimum block size is imposed (e.g. 16 bytes). */
3816
3817 size_t
3818 malloced_storage_size (void *ptr, size_t claimed_size,
3819 struct overhead_stats *stats)
3820 {
3821 size_t orig_claimed_size = claimed_size;
3822
3823 #ifdef GNU_MALLOC
3824
3825 if (claimed_size < 2 * sizeof (void *))
3826 claimed_size = 2 * sizeof (void *);
3827 # ifdef SUNOS_LOCALTIME_BUG
3828 if (claimed_size < 16)
3829 claimed_size = 16;
3830 # endif
3831 if (claimed_size < 4096)
3832 {
3833 int log = 1;
3834
3835 /* compute the log base two, more or less, then use it to compute
3836 the block size needed. */
3837 claimed_size--;
3838 /* It's big, it's heavy, it's wood! */
3839 while ((claimed_size /= 2) != 0)
3840 ++log;
3841 claimed_size = 1;
3842 /* It's better than bad, it's good! */
3843 while (log > 0)
3844 {
3845 claimed_size *= 2;
3846 log--;
3847 }
3848 /* We have to come up with some average about the amount of
3849 blocks used. */
3850 if ((size_t) (rand () & 4095) < claimed_size)
3851 claimed_size += 3 * sizeof (void *);
3852 }
3853 else
3854 {
3855 claimed_size += 4095;
3856 claimed_size &= ~4095;
3857 claimed_size += (claimed_size / 4096) * 3 * sizeof (size_t);
3858 }
3859
3860 #elif defined (SYSTEM_MALLOC)
3861
3862 if (claimed_size < 16)
3863 claimed_size = 16;
3864 claimed_size += 2 * sizeof (void *);
3865
3866 #else /* old GNU allocator */
3867
3868 # ifdef rcheck /* #### may not be defined here */
3869 claimed_size += 20;
3870 # else
3871 claimed_size += 8;
3872 # endif
3873 {
3874 int log = 1;
3875
3876 /* compute the log base two, more or less, then use it to compute
3877 the block size needed. */
3878 claimed_size--;
3879 /* It's big, it's heavy, it's wood! */
3880 while ((claimed_size /= 2) != 0)
3881 ++log;
3882 claimed_size = 1;
3883 /* It's better than bad, it's good! */
3884 while (log > 0)
3885 {
3886 claimed_size *= 2;
3887 log--;
3888 }
3889 }
3890
3891 #endif /* old GNU allocator */
3892
3893 if (stats)
3894 {
3895 stats->was_requested += orig_claimed_size;
3896 stats->malloc_overhead += claimed_size - orig_claimed_size;
3897 }
3898 return claimed_size;
3899 }
3900
3901 size_t
3902 fixed_type_block_overhead (size_t size)
3903 {
3904 size_t per_block = TYPE_ALLOC_SIZE (cons, unsigned char);
3905 size_t overhead = 0;
3906 size_t storage_size = malloced_storage_size (0, per_block, 0);
3907 while (size >= per_block)
3908 {
3909 size -= per_block;
3910 overhead += sizeof (void *) + per_block - storage_size;
3911 }
3912 if (rand () % per_block < size)
3913 overhead += sizeof (void *) + per_block - storage_size;
3914 return overhead;
3915 }
3916
3917 #endif /* MEMORY_USAGE_STATS */
3918
3919
3920 /* Initialization */
3921 void
3922 reinit_alloc_once_early (void)
3923 {
3924 gc_generation_number[0] = 0;
3925 breathing_space = 0;
3926 XSETINT (all_bit_vectors, 0); /* Qzero may not be set yet. */
3927 XSETINT (Vgc_message, 0);
3928 all_lcrecords = 0;
3929 ignore_malloc_warnings = 1;
3930 #ifdef DOUG_LEA_MALLOC
3931 mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
3932 mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
3933 #if 0 /* Moved to emacs.c */
3934 mallopt (M_MMAP_MAX, 64); /* max. number of mmap'ed areas */
3935 #endif
3936 #endif
3937 init_string_alloc ();
3938 init_string_chars_alloc ();
3939 init_cons_alloc ();
3940 init_symbol_alloc ();
3941 init_compiled_function_alloc ();
3942 #ifdef LISP_FLOAT_TYPE
3943 init_float_alloc ();
3944 #endif /* LISP_FLOAT_TYPE */
3945 init_marker_alloc ();
3946 init_extent_alloc ();
3947 init_event_alloc ();
3948
3949 ignore_malloc_warnings = 0;
3950
3951 staticidx_nodump = 0;
3952 dumpstructidx = 0;
3953 pdump_wireidx = 0;
3954
3955 consing_since_gc = 0;
3956 #if 1
3957 gc_cons_threshold = 500000; /* XEmacs change */
3958 #else
3959 gc_cons_threshold = 15000; /* debugging */
3960 #endif
3961 #ifdef VIRT_ADDR_VARIES
3962 malloc_sbrk_unused = 1<<22; /* A large number */
3963 malloc_sbrk_used = 100000; /* as reasonable as any number */
3964 #endif /* VIRT_ADDR_VARIES */
3965 lrecord_uid_counter = 259;
3966 debug_string_purity = 0;
3967 gcprolist = 0;
3968
3969 gc_currently_forbidden = 0;
3970 gc_hooks_inhibited = 0;
3971
3972 #ifdef ERROR_CHECK_TYPECHECK
3973 ERROR_ME.really_unlikely_name_to_have_accidentally_in_a_non_errb_structure =
3974 666;
3975 ERROR_ME_NOT.
3976 really_unlikely_name_to_have_accidentally_in_a_non_errb_structure = 42;
3977 ERROR_ME_WARN.
3978 really_unlikely_name_to_have_accidentally_in_a_non_errb_structure =
3979 3333632;
3980 #endif /* ERROR_CHECK_TYPECHECK */
3981 }
3982
3983 void
3984 init_alloc_once_early (void)
3985 {
3986 int iii;
3987
3988 reinit_alloc_once_early ();
3989
3990 last_lrecord_type_index_assigned = -1;
3991 for (iii = 0; iii < countof (lrecord_implementations_table); iii++)
3992 {
3993 lrecord_implementations_table[iii] = 0;
3994 }
3995
3996 /*
3997 * All the staticly
3998 * defined subr lrecords were initialized with lheader->type == 0.
3999 * See subr_lheader_initializer in lisp.h. Force type index 0 to be
4000 * assigned to lrecord_subr so that those predefined indexes match
4001 * reality.
4002 */
4003 lrecord_type_index (&lrecord_subr);
4004 assert (*(lrecord_subr.lrecord_type_index) == 0);
4005 /*
4006 * The same is true for symbol_value_forward objects, except the
4007 * type is 1.
4008 */
4009 lrecord_type_index (&lrecord_symbol_value_forward);
4010 assert (*(lrecord_symbol_value_forward.lrecord_type_index) == 1);
4011
4012 staticidx = 0;
4013 }
4014
4015 int pure_bytes_used = 0;
4016
4017 void
4018 reinit_alloc (void)
4019 {
4020 gcprolist = 0;
4021 }
4022
4023 void
4024 syms_of_alloc (void)
4025 {
4026 defsymbol (&Qpre_gc_hook, "pre-gc-hook");
4027 defsymbol (&Qpost_gc_hook, "post-gc-hook");
4028 defsymbol (&Qgarbage_collecting, "garbage-collecting");
4029
4030 DEFSUBR (Fcons);
4031 DEFSUBR (Flist);
4032 DEFSUBR (Fvector);
4033 DEFSUBR (Fbit_vector);
4034 DEFSUBR (Fmake_byte_code);
4035 DEFSUBR (Fmake_list);
4036 DEFSUBR (Fmake_vector);
4037 DEFSUBR (Fmake_bit_vector);
4038 DEFSUBR (Fmake_string);
4039 DEFSUBR (Fstring);
4040 DEFSUBR (Fmake_symbol);
4041 DEFSUBR (Fmake_marker);
4042 DEFSUBR (Fpurecopy);
4043 DEFSUBR (Fgarbage_collect);
4044 DEFSUBR (Fmemory_limit);
4045 DEFSUBR (Fconsing_since_gc);
4046 }
4047
4048 void
4049 vars_of_alloc (void)
4050 {
4051 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold /*
4052 *Number of bytes of consing between garbage collections.
4053 \"Consing\" is a misnomer in that this actually counts allocation
4054 of all different kinds of objects, not just conses.
4055 Garbage collection can happen automatically once this many bytes have been
4056 allocated since the last garbage collection. All data types count.
4057
4058 Garbage collection happens automatically when `eval' or `funcall' are
4059 called. (Note that `funcall' is called implicitly as part of evaluation.)
4060 By binding this temporarily to a large number, you can effectively
4061 prevent garbage collection during a part of the program.
4062
4063 See also `consing-since-gc'.
4064 */ );
4065
4066 DEFVAR_INT ("pure-bytes-used", &pure_bytes_used /*
4067 Number of bytes of sharable Lisp data allocated so far.
4068 */ );
4069
4070 #if 0
4071 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used /*
4072 Number of bytes of unshared memory allocated in this session.
4073 */ );
4074
4075 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused /*
4076 Number of bytes of unshared memory remaining available in this session.
4077 */ );
4078 #endif
4079
4080 #ifdef DEBUG_XEMACS
4081 DEFVAR_INT ("debug-allocation", &debug_allocation /*
4082 If non-zero, print out information to stderr about all objects allocated.
4083 See also `debug-allocation-backtrace-length'.
4084 */ );
4085 debug_allocation = 0;
4086
4087 DEFVAR_INT ("debug-allocation-backtrace-length",
4088 &debug_allocation_backtrace_length /*
4089 Length (in stack frames) of short backtrace printed out by `debug-allocation'.
4090 */ );
4091 debug_allocation_backtrace_length = 2;
4092 #endif
4093
4094 DEFVAR_BOOL ("purify-flag", &purify_flag /*
4095 Non-nil means loading Lisp code in order to dump an executable.
4096 This means that certain objects should be allocated in readonly space.
4097 */ );
4098
4099 DEFVAR_LISP ("pre-gc-hook", &Vpre_gc_hook /*
4100 Function or functions to be run just before each garbage collection.
4101 Interrupts, garbage collection, and errors are inhibited while this hook
4102 runs, so be extremely careful in what you add here. In particular, avoid
4103 consing, and do not interact with the user.
4104 */ );
4105 Vpre_gc_hook = Qnil;
4106
4107 DEFVAR_LISP ("post-gc-hook", &Vpost_gc_hook /*
4108 Function or functions to be run just after each garbage collection.
4109 Interrupts, garbage collection, and errors are inhibited while this hook
4110 runs, so be extremely careful in what you add here. In particular, avoid
4111 consing, and do not interact with the user.
4112 */ );
4113 Vpost_gc_hook = Qnil;
4114
4115 DEFVAR_LISP ("gc-message", &Vgc_message /*
4116 String to print to indicate that a garbage collection is in progress.
4117 This is printed in the echo area. If the selected frame is on a
4118 window system and `gc-pointer-glyph' specifies a value (i.e. a pointer
4119 image instance) in the domain of the selected frame, the mouse pointer
4120 will change instead of this message being printed.
4121 */ );
4122 Vgc_message = build_string (gc_default_message);
4123
4124 DEFVAR_LISP ("gc-pointer-glyph", &Vgc_pointer_glyph /*
4125 Pointer glyph used to indicate that a garbage collection is in progress.
4126 If the selected window is on a window system and this glyph specifies a
4127 value (i.e. a pointer image instance) in the domain of the selected
4128 window, the pointer will be changed as specified during garbage collection.
4129 Otherwise, a message will be printed in the echo area, as controlled
4130 by `gc-message'.
4131 */ );
4132 }
4133
4134 void
4135 complex_vars_of_alloc (void)
4136 {
4137 Vgc_pointer_glyph = Fmake_glyph_internal (Qpointer);
4138 }
4139
4140
4141 #ifdef PDUMP
4142
4143 /* The structure of the file
4144 *
4145 * 0 - header
4146 * 256 - dumped objects
4147 * stab_offset - nb_staticpro*(Lisp_Object *) from staticvec
4148 * - nb_staticpro*(relocated Lisp_Object) pointed to by staticpro
4149 * - nb_structdmp*pair(void *, adr) for pointers to structures
4150 * - lrecord_implementations_table[]
4151 * - relocation table
4152 * - wired variable address/value couples with the count preceding the list
4153 */
4154 typedef struct
4155 {
4156 char signature[8];
4157 EMACS_UINT stab_offset;
4158 EMACS_UINT reloc_address;
4159 int nb_staticpro;
4160 int nb_structdmp;
4161 int last_type;
4162 } dump_header;
4163
4164 char *pdump_start, *pdump_end;
4165
4166 static const unsigned char align_table[256] =
4167 {
4168 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4169 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4170 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4171 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4172 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4173 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4174 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4175 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4176 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4177 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4178 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4179 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4180 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4181 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4182 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4183 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
4184 };
4185
4186 typedef struct pdump_entry_list_elmt
4187 {
4188 struct pdump_entry_list_elmt *next;
4189 const void *obj;
4190 size_t size;
4191 int count;
4192 int is_lrecord;
4193 EMACS_INT save_offset;
4194 } pdump_entry_list_elmt;
4195
4196 typedef struct
4197 {
4198 pdump_entry_list_elmt *first;
4199 int align;
4200 int count;
4201 } pdump_entry_list;
4202
4203 typedef struct pdump_struct_list_elmt
4204 {
4205 pdump_entry_list list;
4206 const struct struct_description *sdesc;
4207 } pdump_struct_list_elmt;
4208
4209 typedef struct
4210 {
4211 pdump_struct_list_elmt *list;
4212 int count;
4213 int size;
4214 } pdump_struct_list;
4215
4216 static pdump_entry_list pdump_object_table[256];
4217 static pdump_entry_list pdump_opaque_data_list;
4218 static pdump_struct_list pdump_struct_table;
4219 static pdump_entry_list_elmt *pdump_qnil;
4220
4221 static int pdump_alert_undump_object[256];
4222
4223 static unsigned long cur_offset;
4224 static size_t max_size;
4225 static int pdump_fd;
4226 static void *pdump_buf;
4227
4228 #define PDUMP_HASHSIZE 200001
4229
4230 static pdump_entry_list_elmt **pdump_hash;
4231
4232 /* Since most pointers are eight bytes aligned, the >>3 allows for a better hash */
4233 static int
4234 pdump_make_hash (const void *obj)
4235 {
4236 return ((unsigned long)(obj)>>3) % PDUMP_HASHSIZE;
4237 }
4238
4239 static pdump_entry_list_elmt *
4240 pdump_get_entry (const void *obj)
4241 {
4242 int pos = pdump_make_hash(obj);
4243 pdump_entry_list_elmt *e;
4244 while ((e = pdump_hash[pos]) != 0)
4245 {
4246 if (e->obj == obj)
4247 return e;
4248
4249 pos++;
4250 if (pos == PDUMP_HASHSIZE)
4251 pos = 0;
4252 }
4253 return 0;
4254 }
4255
4256 static void
4257 pdump_add_entry (pdump_entry_list *list, const void *obj, size_t size, int count, int is_lrecord)
4258 {
4259 pdump_entry_list_elmt *e;
4260 int align;
4261 int pos = pdump_make_hash (obj);
4262
4263 while ((e = pdump_hash[pos]) != 0)
4264 {
4265 if (e->obj == obj)
4266 return;
4267
4268 pos++;
4269 if (pos == PDUMP_HASHSIZE)
4270 pos = 0;
4271 }
4272
4273 e = malloc (sizeof (pdump_entry_list_elmt));
4274
4275 e->next = list->first;
4276 e->obj = obj;
4277 e->size = size;
4278 e->count = count;
4279 e->is_lrecord = is_lrecord;
4280 list->first = e;
4281
4282 list->count += count;
4283 pdump_hash[pos] = e;
4284
4285 align = align_table[size & 255];
4286 if (align<2 && is_lrecord)
4287 align = 2;
4288
4289 if(align < list->align)
4290 list->align = align;
4291 }
4292
4293 static pdump_entry_list *
4294 pdump_get_entry_list(const struct struct_description *sdesc)
4295 {
4296 int i;
4297 for(i=0; i<pdump_struct_table.count; i++)
4298 if (pdump_struct_table.list[i].sdesc == sdesc)
4299 return &pdump_struct_table.list[i].list;
4300
4301 if (pdump_struct_table.size <= pdump_struct_table.count)
4302 {
4303 if (pdump_struct_table.size == -1)
4304 pdump_struct_table.size = 10;
4305 else
4306 pdump_struct_table.size = pdump_struct_table.size * 2;
4307 pdump_struct_table.list = xrealloc (pdump_struct_table.list,
4308 pdump_struct_table.size*sizeof (pdump_struct_list_elmt));
4309 }
4310 pdump_struct_table.list[pdump_struct_table.count].list.first = 0;
4311 pdump_struct_table.list[pdump_struct_table.count].list.align = 8;
4312 pdump_struct_table.list[pdump_struct_table.count].list.count = 0;
4313 pdump_struct_table.list[pdump_struct_table.count].sdesc = sdesc;
4314
4315 return &pdump_struct_table.list[pdump_struct_table.count++].list;
4316 }
4317
4318 static struct {
4319 Lisp_Object obj;
4320 int position;
4321 int offset;
4322 } backtrace[65536];
4323
4324 static int depth;
4325
4326 static void pdump_backtrace (void)
4327 {
4328 int i;
4329 fprintf (stderr, "pdump backtrace :\n");
4330 for (i=0;i<depth;i++)
4331 {
4332 if (!backtrace[i].obj)
4333 fprintf (stderr, " - ind. (%d, %d)\n", backtrace[i].position, backtrace[i].offset);
4334 else
4335 {
4336 fprintf (stderr, " - %s (%d, %d)\n",
4337 XRECORD_LHEADER_IMPLEMENTATION (backtrace[i].obj)->name,
4338 backtrace[i].position,
4339 backtrace[i].offset);
4340 }
4341 }
4342 }
4343
4344 static void pdump_register_object (Lisp_Object obj);
4345 static void pdump_register_struct (const void *data, const struct struct_description *sdesc, int count);
4346
4347 static EMACS_INT
4348 pdump_get_indirect_count (EMACS_INT code, const struct lrecord_description *idesc, const void *idata)
4349 {
4350 EMACS_INT count;
4351 const void *irdata;
4352
4353 int line = XD_INDIRECT_VAL (code);
4354 int delta = XD_INDIRECT_DELTA (code);
4355
4356 irdata = ((char *)idata) + idesc[line].offset;
4357 switch (idesc[line].type) {
4358 case XD_SIZE_T:
4359 count = *(size_t *)irdata;
4360 break;
4361 case XD_INT:
4362 count = *(int *)irdata;
4363 break;
4364 case XD_LONG:
4365 count = *(long *)irdata;
4366 break;
4367 case XD_BYTECOUNT:
4368 count = *(Bytecount *)irdata;
4369 break;
4370 default:
4371 fprintf (stderr, "Unsupported count type : %d (line = %d, code=%ld)\n", idesc[line].type, line, (long)code);
4372 pdump_backtrace ();
4373 abort ();
4374 }
4375 count += delta;
4376 return count;
4377 }
4378
4379 static void
4380 pdump_register_sub (const void *data, const struct lrecord_description *desc, int me)
4381 {
4382 int pos;
4383 const void *rdata;
4384
4385 restart:
4386 for (pos = 0; desc[pos].type != XD_END; pos++)
4387 {
4388 backtrace[me].position = pos;
4389 backtrace[me].offset = desc[pos].offset;
4390
4391 rdata = ((const char *)data) + desc[pos].offset;
4392 switch(desc[pos].type)
4393 {
4394 case XD_SPECIFIER_END:
4395 pos = 0;
4396 desc = ((const struct Lisp_Specifier *)data)->methods->extra_description;
4397 goto restart;
4398 case XD_SIZE_T:
4399 case XD_INT:
4400 case XD_LONG:
4401 case XD_BYTECOUNT:
4402 case XD_LO_RESET_NIL:
4403 case XD_INT_RESET:
4404 case XD_LO_LINK:
4405 break;
4406 case XD_OPAQUE_DATA_PTR:
4407 {
4408 EMACS_INT count = desc[pos].data1;
4409 if (XD_IS_INDIRECT(count))
4410 count = pdump_get_indirect_count (count, desc, data);
4411
4412 pdump_add_entry (&pdump_opaque_data_list,
4413 *(void **)rdata,
4414 count,
4415 1,
4416 0);
4417 break;
4418 }
4419 case XD_C_STRING:
4420 {
4421 const char *str = *(const char **)rdata;
4422 if (str)
4423 pdump_add_entry (&pdump_opaque_data_list, str, strlen (str)+1, 1, 0);
4424 break;
4425 }
4426 case XD_DOC_STRING:
4427 {
4428 const char *str = *(const char **)rdata;
4429 if ((EMACS_INT)str > 0)
4430 pdump_add_entry (&pdump_opaque_data_list, str, strlen (str)+1, 1, 0);
4431 break;
4432 }
4433 case XD_LISP_OBJECT:
4434 {
4435 EMACS_INT count = desc[pos].data1;
4436 int i;
4437 if (XD_IS_INDIRECT (count))
4438 count = pdump_get_indirect_count (count, desc, data);
4439
4440 for(i=0;i<count;i++) {
4441 const Lisp_Object *pobj = ((const Lisp_Object *)rdata) + i;
4442 Lisp_Object dobj = *pobj;
4443
4444 backtrace[me].offset = (const char *)pobj - (const char *)data;
4445 pdump_register_object (dobj);
4446 }
4447 break;
4448 }
4449 case XD_STRUCT_PTR:
4450 {
4451 EMACS_INT count = desc[pos].data1;
4452 const struct struct_description *sdesc = desc[pos].data2;
4453 const char *dobj = *(const char **)rdata;
4454 if (dobj) {
4455 if (XD_IS_INDIRECT (count))
4456 count = pdump_get_indirect_count (count, desc, data);
4457
4458 pdump_register_struct (dobj, sdesc, count);
4459 }
4460 break;
4461 }
4462 default:
4463 fprintf (stderr, "Unsupported dump type : %d\n", desc[pos].type);
4464 pdump_backtrace ();
4465 abort ();
4466 };
4467 }
4468 }
4469
4470 static void
4471 pdump_register_object (Lisp_Object obj)
4472 {
4473 if (!obj ||
4474 !POINTER_TYPE_P (XTYPE (obj)) ||
4475 pdump_get_entry (XRECORD_LHEADER (obj)))
4476 return;
4477
4478 if (XRECORD_LHEADER_IMPLEMENTATION (obj)->description)
4479 {
4480 int me = depth++;
4481 if (me>65536)
4482 {
4483 fprintf (stderr, "Backtrace overflow, loop ?\n");
4484 abort ();
4485 }
4486 backtrace[me].obj = obj;
4487 backtrace[me].position = 0;
4488 backtrace[me].offset = 0;
4489
4490 pdump_add_entry (pdump_object_table + XRECORD_LHEADER (obj)->type,
4491 XRECORD_LHEADER (obj),
4492 XRECORD_LHEADER_IMPLEMENTATION (obj)->static_size ?
4493 XRECORD_LHEADER_IMPLEMENTATION (obj)->static_size :
4494 XRECORD_LHEADER_IMPLEMENTATION (obj)->size_in_bytes_method (XRECORD_LHEADER (obj)),
4495 1,
4496 1);
4497 pdump_register_sub (XRECORD_LHEADER (obj),
4498 XRECORD_LHEADER_IMPLEMENTATION (obj)->description,
4499 me);
4500 --depth;
4501 }
4502 else
4503 {
4504 pdump_alert_undump_object[XRECORD_LHEADER (obj)->type]++;
4505 fprintf (stderr, "Undumpable object type : %s\n", XRECORD_LHEADER_IMPLEMENTATION (obj)->name);
4506 pdump_backtrace ();
4507 }
4508 }
4509
4510 static void
4511 pdump_register_struct (const void *data, const struct struct_description *sdesc, int count)
4512 {
4513 if (data && !pdump_get_entry (data))
4514 {
4515 int me = depth++;
4516 int i;
4517 if (me>65536)
4518 {
4519 fprintf (stderr, "Backtrace overflow, loop ?\n");
4520 abort ();
4521 }
4522 backtrace[me].obj = 0;
4523 backtrace[me].position = 0;
4524 backtrace[me].offset = 0;
4525
4526 pdump_add_entry (pdump_get_entry_list (sdesc),
4527 data,
4528 sdesc->size,
4529 count,
4530 0);
4531 for (i=0; i<count; i++)
4532 {
4533 pdump_register_sub (((char *)data) + sdesc->size*i,
4534 sdesc->description,
4535 me);
4536 }
4537 --depth;
4538 }
4539 }
4540
4541 static void
4542 pdump_dump_data (pdump_entry_list_elmt *elmt, const struct lrecord_description *desc)
4543 {
4544 size_t size = elmt->size;
4545 int count = elmt->count;
4546 if (desc)
4547 {
4548 int pos, i;
4549 void *rdata;
4550 memcpy (pdump_buf, elmt->obj, size*count);
4551
4552 for (i=0; i<count; i++)
4553 {
4554 char *cur = ((char *)pdump_buf) + i*size;
4555 restart:
4556 for (pos = 0; desc[pos].type != XD_END; pos++)
4557 {
4558 rdata = cur + desc[pos].offset;
4559 switch (desc[pos].type)
4560 {
4561 case XD_SPECIFIER_END:
4562 pos = 0;
4563 desc = ((const struct Lisp_Specifier *)(elmt->obj))->methods->extra_description;
4564 goto restart;
4565 case XD_SIZE_T:
4566 case XD_INT:
4567 case XD_LONG:
4568 case XD_BYTECOUNT:
4569 break;
4570 case XD_LO_RESET_NIL:
4571 {
4572 EMACS_INT count = desc[pos].data1;
4573 int i;
4574 if (XD_IS_INDIRECT (count))
4575 count = pdump_get_indirect_count (count, desc, elmt->obj);
4576 for (i=0; i<count; i++)
4577 ((EMACS_INT *)rdata)[i] = pdump_qnil->save_offset;
4578 break;
4579 }
4580 case XD_INT_RESET:
4581 {
4582 EMACS_INT val = desc[pos].data1;
4583 if (XD_IS_INDIRECT (val))
4584 val = pdump_get_indirect_count (val, desc, elmt->obj);
4585 *(int *)rdata = val;
4586 break;
4587 }
4588 case XD_OPAQUE_DATA_PTR:
4589 case XD_C_STRING:
4590 case XD_STRUCT_PTR:
4591 {
4592 void *ptr = *(void **)rdata;
4593 if (ptr)
4594 *(EMACS_INT *)rdata = pdump_get_entry (ptr)->save_offset;
4595 break;
4596 }
4597 case XD_LO_LINK:
4598 {
4599 Lisp_Object obj = *(Lisp_Object *)rdata;
4600 pdump_entry_list_elmt *elmt1;
4601 for(;;)
4602 {
4603 elmt1 = pdump_get_entry (XRECORD_LHEADER(obj));
4604 if (elmt1)
4605 break;
4606 obj = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj)));
4607 }
4608 *(EMACS_INT *)rdata = elmt1->save_offset;
4609 break;
4610 }
4611 case XD_LISP_OBJECT:
4612 {
4613 EMACS_INT count = desc[pos].data1;
4614 int i;
4615 if (XD_IS_INDIRECT (count))
4616 count = pdump_get_indirect_count (count, desc, elmt->obj);
4617
4618 for(i=0; i<count; i++)
4619 {
4620 Lisp_Object *pobj = ((Lisp_Object *)rdata) + i;
4621 Lisp_Object dobj = *pobj;
4622 if (dobj && POINTER_TYPE_P (XTYPE (dobj)))
4623 *pobj = pdump_get_entry (XRECORD_LHEADER (dobj))->save_offset;
4624 }
4625 break;
4626 }
4627 case XD_DOC_STRING:
4628 {
4629 EMACS_INT str = *(EMACS_INT *)rdata;
4630 if (str > 0)
4631 *(EMACS_INT *)rdata = pdump_get_entry ((void *)str)->save_offset;
4632 break;
4633 }
4634 default:
4635 fprintf (stderr, "Unsupported dump type : %d\n", desc[pos].type);
4636 abort ();
4637 };
4638 }
4639 }
4640 }
4641 write (pdump_fd, desc ? pdump_buf : elmt->obj, size*count);
4642 if (elmt->is_lrecord && ((size*count) & 3))
4643 write (pdump_fd, "\0\0\0", 4-((size*count) & 3));
4644 }
4645
4646 static void
4647 pdump_reloc_one (void *data, EMACS_INT delta, const struct lrecord_description *desc)
4648 {
4649 int pos;
4650 void *rdata;
4651
4652 restart:
4653 for (pos = 0; desc[pos].type != XD_END; pos++)
4654 {
4655 rdata = ((char *)data) + desc[pos].offset;
4656 switch (desc[pos].type) {
4657 case XD_SPECIFIER_END:
4658 pos = 0;
4659 desc = ((const struct Lisp_Specifier *)data)->methods->extra_description;
4660 goto restart;
4661 case XD_SIZE_T:
4662 case XD_INT:
4663 case XD_LONG:
4664 case XD_BYTECOUNT:
4665 case XD_INT_RESET:
4666 break;
4667 case XD_OPAQUE_DATA_PTR:
4668 case XD_C_STRING:
4669 case XD_STRUCT_PTR:
4670 case XD_LO_LINK:
4671 {
4672 EMACS_INT ptr = *(EMACS_INT *)rdata;
4673 if (ptr)
4674 *(EMACS_INT *)rdata = ptr+delta;
4675 break;
4676 }
4677 case XD_LISP_OBJECT:
4678 case XD_LO_RESET_NIL:
4679 {
4680 EMACS_INT count = desc[pos].data1;
4681 int i;
4682 if (XD_IS_INDIRECT (count))
4683 count = pdump_get_indirect_count (count, desc, data);
4684
4685 for (i=0; i<count; i++)
4686 {
4687 Lisp_Object *pobj = ((Lisp_Object *)rdata) + i;
4688 Lisp_Object dobj = *pobj;
4689 if (dobj && POINTER_TYPE_P (XTYPE (dobj)))
4690 *pobj = dobj + delta;
4691 }
4692 break;
4693 }
4694 case XD_DOC_STRING:
4695 {
4696 EMACS_INT str = *(EMACS_INT *)rdata;
4697 if (str > 0)
4698 *(EMACS_INT *)rdata = str + delta;
4699 break;
4700 }
4701 default:
4702 fprintf (stderr, "Unsupported dump type : %d\n", desc[pos].type);
4703 abort ();
4704 };
4705 }
4706 }
4707
4708 static void
4709 pdump_allocate_offset (pdump_entry_list_elmt *elmt, const struct lrecord_description *desc)
4710 {
4711 size_t size = (elmt->is_lrecord ? (elmt->size + 3) & ~3 : elmt->size)*elmt->count;
4712 elmt->save_offset = cur_offset;
4713 if (size>max_size)
4714 max_size = size;
4715 cur_offset += size;
4716 }
4717
4718 static void
4719 pdump_scan_by_alignement (void (*f)(pdump_entry_list_elmt *, const struct lrecord_description *))
4720 {
4721 int align, i;
4722 const struct lrecord_description *idesc;
4723 pdump_entry_list_elmt *elmt;
4724 for (align=8; align>=0; align--)
4725 {
4726 for (i=0; i<=last_lrecord_type_index_assigned; i++)
4727 if (pdump_object_table[i].align == align)
4728 {
4729 elmt = pdump_object_table[i].first;
4730 if (!elmt)
4731 continue;
4732 idesc = lrecord_implementations_table[i]->description;
4733 while (elmt)
4734 {
4735 f (elmt, idesc);
4736 elmt = elmt->next;
4737 }
4738 }
4739
4740 for (i=0; i<pdump_struct_table.count; i++)
4741 if (pdump_struct_table.list[i].list.align == align) {
4742 elmt = pdump_struct_table.list[i].list.first;
4743 idesc = pdump_struct_table.list[i].sdesc->description;
4744 while (elmt)
4745 {
4746 f (elmt, idesc);
4747 elmt = elmt->next;
4748 }
4749 }
4750
4751 elmt = pdump_opaque_data_list.first;
4752 while (elmt)
4753 {
4754 if (align_table[elmt->size & 255] == align)
4755 f (elmt, 0);
4756 elmt = elmt->next;
4757 }
4758 }
4759 }
4760
4761 static void
4762 pdump_dump_staticvec (void)
4763 {
4764 Lisp_Object *reloc = malloc (staticidx*sizeof (Lisp_Object));
4765 int i;
4766 write (pdump_fd, staticvec, staticidx*sizeof (Lisp_Object *));
4767
4768 for(i=0; i<staticidx; i++)
4769 {
4770 Lisp_Object obj = *staticvec[i];
4771 if (obj && POINTER_TYPE_P (XTYPE (obj)))
4772 reloc[i] = pdump_get_entry (XRECORD_LHEADER (obj))->save_offset;
4773 else
4774 reloc[i] = obj;
4775 }
4776 write (pdump_fd, reloc, staticidx*sizeof (Lisp_Object));
4777 free (reloc);
4778 }
4779
4780 static void
4781 pdump_dump_structvec (void)
4782 {
4783 int i;
4784 for (i=0; i<dumpstructidx; i++)
4785 {
4786 EMACS_INT adr;
4787 write (pdump_fd, &(dumpstructvec[i].data), sizeof (void *));
4788 adr = pdump_get_entry (*(void **)(dumpstructvec[i].data))->save_offset;
4789 write (pdump_fd, &adr, sizeof (adr));
4790 }
4791 }
4792
4793 static void
4794 pdump_dump_itable (void)
4795 {
4796 write (pdump_fd, lrecord_implementations_table, sizeof (lrecord_implementations_table));
4797 }
4798
4799 static void
4800 pdump_dump_rtables (void)
4801 {
4802 int i, j;
4803 pdump_entry_list_elmt *elmt;
4804 pdump_reloc_table rt;
4805
4806 for (i=0; i<=last_lrecord_type_index_assigned; i++)
4807 {
4808 elmt = pdump_object_table[i].first;
4809 if(!elmt)
4810 continue;
4811 rt.desc = lrecord_implementations_table[i]->description;
4812 rt.count = pdump_object_table[i].count;
4813 write (pdump_fd, &rt, sizeof (rt));
4814 while (elmt)
4815 {
4816 EMACS_INT rdata = pdump_get_entry (XRECORD_LHEADER (elmt->obj))->save_offset;
4817 write (pdump_fd, &rdata, sizeof (rdata));
4818 elmt = elmt->next;
4819 }
4820 }
4821
4822 rt.desc = 0;
4823 rt.count = 0;
4824 write (pdump_fd, &rt, sizeof (rt));
4825
4826 for (i=0; i<pdump_struct_table.count; i++)
4827 {
4828 elmt = pdump_struct_table.list[i].list.first;
4829 rt.desc = pdump_struct_table.list[i].sdesc->description;
4830 rt.count = pdump_struct_table.list[i].list.count;
4831 write (pdump_fd, &rt, sizeof (rt));
4832 while (elmt)
4833 {
4834 EMACS_INT rdata = pdump_get_entry (XRECORD_LHEADER (elmt->obj))->save_offset;
4835 for (j=0; j<elmt->count; j++) {
4836 write (pdump_fd, &rdata, sizeof (rdata));
4837 rdata += elmt->size;
4838 }
4839 elmt = elmt->next;
4840 }
4841 }
4842 rt.desc = 0;
4843 rt.count = 0;
4844 write (pdump_fd, &rt, sizeof (rt));
4845 }
4846
4847 static void
4848 pdump_dump_wired (void)
4849 {
4850 EMACS_INT count = pdump_wireidx + pdump_wireidx_list;
4851 int i;
4852
4853 write (pdump_fd, &count, sizeof (count));
4854
4855 for (i=0; i<pdump_wireidx; i++)
4856 {
4857 Lisp_Object obj = pdump_get_entry (XRECORD_LHEADER (*(pdump_wirevec[i])))->save_offset;
4858 write (pdump_fd, &pdump_wirevec[i], sizeof (pdump_wirevec[i]));
4859 write (pdump_fd, &obj, sizeof (obj));
4860 }
4861
4862 for (i=0; i<pdump_wireidx_list; i++)
4863 {
4864 Lisp_Object obj = *(pdump_wirevec_list[i]);
4865 pdump_entry_list_elmt *elmt;
4866 EMACS_INT res;
4867
4868 for(;;)
4869 {
4870 const struct lrecord_description *desc;
4871 int pos;
4872 elmt = pdump_get_entry (XRECORD_LHEADER (obj));
4873 if (elmt)
4874 break;
4875 desc = XRECORD_LHEADER_IMPLEMENTATION (obj)->description;
4876 for (pos = 0; desc[pos].type != XD_LO_LINK; pos++)
4877 if (desc[pos].type == XD_END)
4878 abort ();
4879
4880 obj = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj)));
4881 }
4882 res = elmt->save_offset;
4883
4884 write (pdump_fd, &pdump_wirevec_list[i], sizeof (pdump_wirevec_list[i]));
4885 write (pdump_fd, &res, sizeof (res));
4886 }
4887 }
4888
4889 void
4890 pdump (void)
4891 {
4892 int i;
4893 Lisp_Object t_console, t_device, t_frame;
4894 int none;
4895 dump_header hd;
4896
4897 /* These appear in a DEFVAR_LISP, which does a staticpro() */
4898 t_console = Vterminal_console;
4899 t_frame = Vterminal_frame;
4900 t_device = Vterminal_device;
4901
4902 Vterminal_console = Qnil;
4903 Vterminal_frame = Qnil;
4904 Vterminal_device = Qnil;
4905
4906 pdump_hash = malloc (PDUMP_HASHSIZE*sizeof (pdump_entry_list_elmt *));
4907 memset (pdump_hash, 0, PDUMP_HASHSIZE*sizeof (pdump_entry_list_elmt *));
4908
4909 for (i=0; i<=last_lrecord_type_index_assigned; i++)
4910 {
4911 pdump_object_table[i].first = 0;
4912 pdump_object_table[i].align = 8;
4913 pdump_object_table[i].count = 0;
4914 pdump_alert_undump_object[i] = 0;
4915 }
4916 pdump_struct_table.count = 0;
4917 pdump_struct_table.size = -1;
4918
4919 pdump_opaque_data_list.first = 0;
4920 pdump_opaque_data_list.align = 8;
4921 pdump_opaque_data_list.count = 0;
4922 depth = 0;
4923
4924 for (i=0; i<staticidx; i++)
4925 pdump_register_object (*staticvec[i]);
4926 for (i=0; i<pdump_wireidx; i++)
4927 pdump_register_object (*pdump_wirevec[i]);
4928
4929 none = 1;
4930 for(i=0;i<=last_lrecord_type_index_assigned;i++)
4931 if (pdump_alert_undump_object[i])
4932 {
4933 if (none)
4934 printf ("Undumpable types list :\n");
4935 none = 0;
4936 printf (" - %s (%d)\n", lrecord_implementations_table[i]->name, pdump_alert_undump_object[i]);
4937 }
4938 if (!none)
4939 return;
4940
4941 for (i=0; i<dumpstructidx; i++)
4942 pdump_register_struct (*(void **)(dumpstructvec[i].data), dumpstructvec[i].desc, 1);
4943
4944 memcpy (hd.signature, "XEmacsDP", 8);
4945 hd.reloc_address = 0;
4946 hd.nb_staticpro = staticidx;
4947 hd.nb_structdmp = dumpstructidx;
4948 hd.last_type = last_lrecord_type_index_assigned;
4949
4950 cur_offset = 256;
4951 max_size = 0;
4952
4953 pdump_scan_by_alignement (pdump_allocate_offset);
4954 pdump_qnil = pdump_get_entry (XRECORD_LHEADER (Qnil));
4955
4956 pdump_buf = malloc (max_size);
4957 pdump_fd = open ("xemacs.dmp", O_WRONLY|O_CREAT|O_TRUNC, 0666);
4958 hd.stab_offset = (cur_offset + 3) & ~3;
4959
4960 write (pdump_fd, &hd, sizeof (hd));
4961 lseek (pdump_fd, 256, SEEK_SET);
4962
4963 pdump_scan_by_alignement (pdump_dump_data);
4964
4965 lseek (pdump_fd, hd.stab_offset, SEEK_SET);
4966
4967 pdump_dump_staticvec ();
4968 pdump_dump_structvec ();
4969 pdump_dump_itable ();
4970 pdump_dump_rtables ();
4971 pdump_dump_wired ();
4972
4973 close (pdump_fd);
4974 free (pdump_buf);
4975
4976 free (pdump_hash);
4977
4978 Vterminal_console = t_console;
4979 Vterminal_frame = t_frame;
4980 Vterminal_device = t_device;
4981 }
4982
4983 int
4984 pdump_load (void)
4985 {
4986 size_t length;
4987 int i;
4988 char *p;
4989 EMACS_INT delta;
4990 EMACS_INT count;
4991
4992 pdump_start = pdump_end = 0;
4993
4994 pdump_fd = open ("xemacs.dmp", O_RDONLY);
4995 if (pdump_fd<0)
4996 return 0;
4997
4998 length = lseek (pdump_fd, 0, SEEK_END);
4999 lseek (pdump_fd, 0, SEEK_SET);
5000
5001 #ifdef HAVE_MMAP
5002 pdump_start = mmap (0, length, PROT_READ|PROT_WRITE, MAP_PRIVATE, pdump_fd, 0);
5003 if (pdump_start == MAP_FAILED)
5004 pdump_start = 0;
5005 #endif
5006
5007 if (!pdump_start)
5008 {
5009 pdump_start = (void *)((((unsigned long)(malloc(length+255))) + 255) & ~255);
5010 read(pdump_fd, pdump_start, length);
5011 }
5012
5013 close (pdump_fd);
5014
5015 pdump_end = pdump_start + length;
5016
5017 staticidx = ((dump_header *)(pdump_start))->nb_staticpro;
5018 last_lrecord_type_index_assigned = ((dump_header *)(pdump_start))->last_type;
5019 delta = ((EMACS_INT)pdump_start) - ((dump_header *)pdump_start)->reloc_address;
5020 p = pdump_start + ((dump_header *)pdump_start)->stab_offset;
5021
5022 /* Put back the staticvec in place */
5023 memcpy (staticvec, p, staticidx*sizeof (Lisp_Object *));
5024 p += staticidx*sizeof (Lisp_Object *);
5025 for (i=0; i<staticidx; i++)
5026 {
5027 Lisp_Object obj = *(Lisp_Object *)p;
5028 p += sizeof (Lisp_Object);
5029 if (obj && POINTER_TYPE_P (XTYPE (obj)))
5030 obj += delta;
5031 *staticvec[i] = obj;
5032 }
5033
5034 /* Put back the dumpstructs */
5035 for (i=0; i<((dump_header *)pdump_start)->nb_structdmp; i++)
5036 {
5037 void **adr = *(void **)p;
5038 p += sizeof (void *);
5039 *adr = (void *)((*(EMACS_INT *)p) + delta);
5040 p += sizeof (EMACS_INT);
5041 }
5042
5043 /* Put back the lrecord_implementations_table */
5044 memcpy (lrecord_implementations_table, p, sizeof (lrecord_implementations_table));
5045 p += sizeof (lrecord_implementations_table);
5046
5047 /* Give back their numbers to the lrecord implementations */
5048 for (i=0; i<sizeof(lrecord_implementations_table)/sizeof(lrecord_implementations_table[0]); i++)
5049 if (lrecord_implementations_table[i])
5050 {
5051 *(lrecord_implementations_table[i]->lrecord_type_index) = i;
5052 last_lrecord_type_index_assigned = i;
5053 }
5054
5055 /* Do the relocations */
5056 pdump_rt_list = p;
5057 count = 2;
5058 for(;;)
5059 {
5060 pdump_reloc_table *rt = (pdump_reloc_table *)p;
5061 p += sizeof (pdump_reloc_table);
5062 if (rt->desc) {
5063 for (i=0; i<rt->count; i++)
5064 {
5065 EMACS_INT adr = delta + *(EMACS_INT *)p;
5066 *(EMACS_INT *)p = adr;
5067 pdump_reloc_one ((void *)adr, delta, rt->desc);
5068 p += sizeof (EMACS_INT);
5069 }
5070 } else
5071 if(!(--count))
5072 break;
5073 }
5074
5075 /* Put the pdump_wire variables in place */
5076 count = *(EMACS_INT *)p;
5077 p += sizeof(EMACS_INT);
5078
5079 for (i=0; i<count; i++)
5080 {
5081 Lisp_Object *var, obj;
5082 var = *(Lisp_Object **)p;
5083 p += sizeof (Lisp_Object *);
5084
5085 obj = *(Lisp_Object *)p;
5086 p += sizeof (Lisp_Object);
5087
5088 if (obj && POINTER_TYPE_P (XTYPE (obj)))
5089 obj += delta;
5090 *var = obj;
5091 }
5092
5093 /* Final cleanups */
5094 /* reorganize hash tables */
5095 p = pdump_rt_list;
5096 for(;;)
5097 {
5098 pdump_reloc_table *rt = (pdump_reloc_table *)p;
5099 p += sizeof (pdump_reloc_table);
5100 if (!rt->desc)
5101 break;
5102 if (rt->desc == hash_table_description)
5103 {
5104 for (i=0; i<rt->count; i++)
5105 {
5106 struct Lisp_Hash_Table *ht = XHASH_TABLE (*(EMACS_INT *)p);
5107 reorganize_hash_table (ht);
5108 p += sizeof (EMACS_INT);
5109 }
5110 break;
5111 } else
5112 p += sizeof (EMACS_INT)*rt->count;
5113 }
5114 return 1;
5115 }
5116
5117 #endif