Fix some uses of int instead of EMACS_INT.
[bpt/emacs.git] / src / alloc.c
CommitLineData
7146af97 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
126f9c02 2 Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999,
114f9c96 3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
8cabe764 4 Free Software Foundation, Inc.
7146af97
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
7146af97 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
7146af97
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
7146af97 20
18160b98 21#include <config.h>
e9b309ac 22#include <stdio.h>
ab6780cd 23#include <limits.h> /* For CHAR_BIT. */
d7306fe6 24#include <setjmp.h>
92939d31 25
4455ad75
RS
26#ifdef ALLOC_DEBUG
27#undef INLINE
28#endif
29
68c45bf0 30#include <signal.h>
92939d31 31
aa477689
JD
32#ifdef HAVE_GTK_AND_PTHREAD
33#include <pthread.h>
34#endif
35
7539e11f
KR
36/* This file is part of the core Lisp implementation, and thus must
37 deal with the real data structures. If the Lisp implementation is
38 replaced, this file likely will not be used. */
2e471eb5 39
7539e11f 40#undef HIDE_LISP_IMPLEMENTATION
7146af97 41#include "lisp.h"
ece93c02 42#include "process.h"
d5e35230 43#include "intervals.h"
4c0be5f4 44#include "puresize.h"
7146af97
JB
45#include "buffer.h"
46#include "window.h"
2538fae4 47#include "keyboard.h"
502b9b64 48#include "frame.h"
9ac0d9e0 49#include "blockinput.h"
9d80e883 50#include "character.h"
e065a56e 51#include "syssignal.h"
4a729fd8 52#include "termhooks.h" /* For struct terminal. */
34400008 53#include <setjmp.h>
e065a56e 54
6b61353c
KH
55/* GC_MALLOC_CHECK defined means perform validity checks of malloc'd
56 memory. Can do this only if using gmalloc.c. */
57
58#if defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC
59#undef GC_MALLOC_CHECK
60#endif
61
bf952fb6
DL
62#ifdef HAVE_UNISTD_H
63#include <unistd.h>
64#else
65extern POINTER_TYPE *sbrk ();
66#endif
ee1eea5c 67
de7124a7 68#ifdef HAVE_FCNTL_H
de7124a7
KS
69#include <fcntl.h>
70#endif
71#ifndef O_WRONLY
72#define O_WRONLY 1
73#endif
74
69666f77
EZ
75#ifdef WINDOWSNT
76#include <fcntl.h>
f892cf9c 77#include "w32.h"
69666f77
EZ
78#endif
79
d1658221 80#ifdef DOUG_LEA_MALLOC
2e471eb5 81
d1658221 82#include <malloc.h>
3e60b029
DL
83/* malloc.h #defines this as size_t, at least in glibc2. */
84#ifndef __malloc_size_t
d1658221 85#define __malloc_size_t int
3e60b029 86#endif
81d492d5 87
2e471eb5
GM
88/* Specify maximum number of areas to mmap. It would be nice to use a
89 value that explicitly means "no limit". */
90
81d492d5
RS
91#define MMAP_MAX_AREAS 100000000
92
2e471eb5
GM
93#else /* not DOUG_LEA_MALLOC */
94
276cbe5a
RS
95/* The following come from gmalloc.c. */
96
276cbe5a 97#define __malloc_size_t size_t
276cbe5a 98extern __malloc_size_t _bytes_used;
3e60b029 99extern __malloc_size_t __malloc_extra_blocks;
2e471eb5
GM
100
101#endif /* not DOUG_LEA_MALLOC */
276cbe5a 102
aa477689
JD
103#if ! defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD)
104
f415cacd
JD
105/* When GTK uses the file chooser dialog, different backends can be loaded
106 dynamically. One such a backend is the Gnome VFS backend that gets loaded
107 if you run Gnome. That backend creates several threads and also allocates
108 memory with malloc.
109
110 If Emacs sets malloc hooks (! SYSTEM_MALLOC) and the emacs_blocked_*
111 functions below are called from malloc, there is a chance that one
112 of these threads preempts the Emacs main thread and the hook variables
333f1b6f 113 end up in an inconsistent state. So we have a mutex to prevent that (note
f415cacd
JD
114 that the backend handles concurrent access to malloc within its own threads
115 but Emacs code running in the main thread is not included in that control).
116
026cdede 117 When UNBLOCK_INPUT is called, reinvoke_input_signal may be called. If this
f415cacd
JD
118 happens in one of the backend threads we will have two threads that tries
119 to run Emacs code at once, and the code is not prepared for that.
120 To prevent that, we only call BLOCK/UNBLOCK from the main thread. */
121
aa477689 122static pthread_mutex_t alloc_mutex;
aa477689 123
959dc601
JD
124#define BLOCK_INPUT_ALLOC \
125 do \
126 { \
127 if (pthread_equal (pthread_self (), main_thread)) \
86302e37 128 BLOCK_INPUT; \
959dc601
JD
129 pthread_mutex_lock (&alloc_mutex); \
130 } \
aa477689 131 while (0)
959dc601
JD
132#define UNBLOCK_INPUT_ALLOC \
133 do \
134 { \
135 pthread_mutex_unlock (&alloc_mutex); \
136 if (pthread_equal (pthread_self (), main_thread)) \
86302e37 137 UNBLOCK_INPUT; \
959dc601 138 } \
aa477689
JD
139 while (0)
140
141#else /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */
142
143#define BLOCK_INPUT_ALLOC BLOCK_INPUT
144#define UNBLOCK_INPUT_ALLOC UNBLOCK_INPUT
145
146#endif /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */
147
276cbe5a 148/* Value of _bytes_used, when spare_memory was freed. */
2e471eb5 149
276cbe5a
RS
150static __malloc_size_t bytes_used_when_full;
151
4d74a5fc
RS
152static __malloc_size_t bytes_used_when_reconsidered;
153
2e471eb5
GM
154/* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
155 to a struct Lisp_String. */
156
7cdee936
SM
157#define MARK_STRING(S) ((S)->size |= ARRAY_MARK_FLAG)
158#define UNMARK_STRING(S) ((S)->size &= ~ARRAY_MARK_FLAG)
b059de99 159#define STRING_MARKED_P(S) (((S)->size & ARRAY_MARK_FLAG) != 0)
2e471eb5 160
3ef06d12
SM
161#define VECTOR_MARK(V) ((V)->size |= ARRAY_MARK_FLAG)
162#define VECTOR_UNMARK(V) ((V)->size &= ~ARRAY_MARK_FLAG)
b059de99 163#define VECTOR_MARKED_P(V) (((V)->size & ARRAY_MARK_FLAG) != 0)
3ef06d12 164
2e471eb5
GM
165/* Value is the number of bytes/chars of S, a pointer to a struct
166 Lisp_String. This must be used instead of STRING_BYTES (S) or
167 S->size during GC, because S->size contains the mark bit for
168 strings. */
169
3ef06d12 170#define GC_STRING_BYTES(S) (STRING_BYTES (S))
7cdee936 171#define GC_STRING_CHARS(S) ((S)->size & ~ARRAY_MARK_FLAG)
2e471eb5
GM
172
173/* Number of bytes of consing done since the last gc. */
174
7146af97
JB
175int consing_since_gc;
176
310ea200 177/* Count the amount of consing of various sorts of space. */
2e471eb5 178
31ade731
SM
179EMACS_INT cons_cells_consed;
180EMACS_INT floats_consed;
181EMACS_INT vector_cells_consed;
182EMACS_INT symbols_consed;
183EMACS_INT string_chars_consed;
184EMACS_INT misc_objects_consed;
185EMACS_INT intervals_consed;
186EMACS_INT strings_consed;
2e471eb5 187
974aae61
RS
188/* Minimum number of bytes of consing since GC before next GC. */
189
190EMACS_INT gc_cons_threshold;
191
192/* Similar minimum, computed from Vgc_cons_percentage. */
193
194EMACS_INT gc_relative_threshold;
310ea200 195
96f077ad 196static Lisp_Object Vgc_cons_percentage;
7146af97 197
24d8a105
RS
198/* Minimum number of bytes of consing since GC before next GC,
199 when memory is full. */
200
201EMACS_INT memory_full_cons_threshold;
202
2e471eb5
GM
203/* Nonzero during GC. */
204
7146af97
JB
205int gc_in_progress;
206
3de0effb
RS
207/* Nonzero means abort if try to GC.
208 This is for code which is written on the assumption that
209 no GC will happen, so as to verify that assumption. */
210
211int abort_on_gc;
212
299585ee 213/* Nonzero means display messages at beginning and end of GC. */
2e471eb5 214
299585ee
RS
215int garbage_collection_messages;
216
34400008
GM
217/* Number of live and free conses etc. */
218
219static int total_conses, total_markers, total_symbols, total_vector_size;
220static int total_free_conses, total_free_markers, total_free_symbols;
221static int total_free_floats, total_floats;
fd27a537 222
2e471eb5 223/* Points to memory space allocated as "spare", to be freed if we run
24d8a105
RS
224 out of memory. We keep one large block, four cons-blocks, and
225 two string blocks. */
2e471eb5 226
d3d47262 227static char *spare_memory[7];
276cbe5a 228
24d8a105 229/* Amount of spare memory to keep in large reserve block. */
2e471eb5 230
276cbe5a
RS
231#define SPARE_MEMORY (1 << 14)
232
233/* Number of extra blocks malloc should get when it needs more core. */
2e471eb5 234
276cbe5a
RS
235static int malloc_hysteresis;
236
2e471eb5
GM
237/* Non-nil means defun should do purecopy on the function definition. */
238
7146af97
JB
239Lisp_Object Vpurify_flag;
240
74a54b04
RS
241/* Non-nil means we are handling a memory-full error. */
242
243Lisp_Object Vmemory_full;
244
1b8950e5
RS
245/* Initialize it to a nonzero value to force it into data space
246 (rather than bss space). That way unexec will remap it into text
247 space (pure), on some systems. We have not implemented the
248 remapping on more recent systems because this is less important
249 nowadays than in the days of small memories and timesharing. */
2e471eb5 250
2c4685ee 251EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
7146af97 252#define PUREBEG (char *) pure
2e471eb5 253
9e713715 254/* Pointer to the pure area, and its size. */
2e471eb5 255
9e713715
GM
256static char *purebeg;
257static size_t pure_size;
258
259/* Number of bytes of pure storage used before pure storage overflowed.
260 If this is non-zero, this implies that an overflow occurred. */
261
262static size_t pure_bytes_used_before_overflow;
7146af97 263
34400008
GM
264/* Value is non-zero if P points into pure space. */
265
266#define PURE_POINTER_P(P) \
267 (((PNTR_COMPARISON_TYPE) (P) \
9e713715 268 < (PNTR_COMPARISON_TYPE) ((char *) purebeg + pure_size)) \
34400008 269 && ((PNTR_COMPARISON_TYPE) (P) \
9e713715 270 >= (PNTR_COMPARISON_TYPE) purebeg))
34400008 271
e5bc14d4 272/* Total number of bytes allocated in pure storage. */
2e471eb5 273
31ade731 274EMACS_INT pure_bytes_used;
7146af97 275
e5bc14d4
YM
276/* Index in pure at which next pure Lisp object will be allocated.. */
277
278static EMACS_INT pure_bytes_used_lisp;
279
280/* Number of bytes allocated for non-Lisp objects in pure storage. */
281
282static EMACS_INT pure_bytes_used_non_lisp;
283
2e471eb5
GM
284/* If nonzero, this is a warning delivered by malloc and not yet
285 displayed. */
286
a8fe7202 287const char *pending_malloc_warning;
7146af97 288
bcb61d60 289/* Pre-computed signal argument for use when memory is exhausted. */
2e471eb5 290
74a54b04 291Lisp_Object Vmemory_signal_data;
bcb61d60 292
7146af97
JB
293/* Maximum amount of C stack to save when a GC happens. */
294
295#ifndef MAX_SAVE_STACK
296#define MAX_SAVE_STACK 16000
297#endif
298
299/* Buffer in which we save a copy of the C stack at each GC. */
300
d3d47262
JB
301static char *stack_copy;
302static int stack_copy_size;
7146af97 303
2e471eb5
GM
304/* Non-zero means ignore malloc warnings. Set during initialization.
305 Currently not used. */
306
d3d47262 307static int ignore_warnings;
350273a4 308
a59de17b 309Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots;
e8197642 310
9e713715
GM
311/* Hook run after GC has finished. */
312
313Lisp_Object Vpost_gc_hook, Qpost_gc_hook;
314
2c5bd608
DL
315Lisp_Object Vgc_elapsed; /* accumulated elapsed time in GC */
316EMACS_INT gcs_done; /* accumulated GCs */
317
f57e2426
J
318static void mark_buffer (Lisp_Object);
319static void mark_terminals (void);
320extern void mark_kboards (void);
321extern void mark_ttys (void);
322extern void mark_backtrace (void);
323static void gc_sweep (void);
324static void mark_glyph_matrix (struct glyph_matrix *);
325static void mark_face_cache (struct face_cache *);
41c28a37
GM
326
327#ifdef HAVE_WINDOW_SYSTEM
f57e2426 328extern void mark_fringe_data (void);
41c28a37
GM
329#endif /* HAVE_WINDOW_SYSTEM */
330
f57e2426
J
331static struct Lisp_String *allocate_string (void);
332static void compact_small_strings (void);
333static void free_large_strings (void);
334static void sweep_strings (void);
7da0b0d3
RS
335
336extern int message_enable_multibyte;
34400008 337
34400008
GM
338/* When scanning the C stack for live Lisp objects, Emacs keeps track
339 of what memory allocated via lisp_malloc is intended for what
340 purpose. This enumeration specifies the type of memory. */
341
342enum mem_type
343{
344 MEM_TYPE_NON_LISP,
345 MEM_TYPE_BUFFER,
346 MEM_TYPE_CONS,
347 MEM_TYPE_STRING,
348 MEM_TYPE_MISC,
349 MEM_TYPE_SYMBOL,
350 MEM_TYPE_FLOAT,
9c545a55
SM
351 /* We used to keep separate mem_types for subtypes of vectors such as
352 process, hash_table, frame, terminal, and window, but we never made
353 use of the distinction, so it only caused source-code complexity
354 and runtime slowdown. Minor but pointless. */
355 MEM_TYPE_VECTORLIKE
34400008
GM
356};
357
f57e2426
J
358static POINTER_TYPE *lisp_align_malloc (size_t, enum mem_type);
359static POINTER_TYPE *lisp_malloc (size_t, enum mem_type);
971de7fb 360void refill_memory_reserve (void);
225ccad6 361
24d8a105 362
877935b1 363#if GC_MARK_STACK || defined GC_MALLOC_CHECK
0b378936
GM
364
365#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
366#include <stdio.h> /* For fprintf. */
367#endif
368
369/* A unique object in pure space used to make some Lisp objects
370 on free lists recognizable in O(1). */
371
d3d47262 372static Lisp_Object Vdead;
0b378936 373
877935b1
GM
374#ifdef GC_MALLOC_CHECK
375
376enum mem_type allocated_mem_type;
d3d47262 377static int dont_register_blocks;
877935b1
GM
378
379#endif /* GC_MALLOC_CHECK */
380
381/* A node in the red-black tree describing allocated memory containing
382 Lisp data. Each such block is recorded with its start and end
383 address when it is allocated, and removed from the tree when it
384 is freed.
385
386 A red-black tree is a balanced binary tree with the following
387 properties:
388
389 1. Every node is either red or black.
390 2. Every leaf is black.
391 3. If a node is red, then both of its children are black.
392 4. Every simple path from a node to a descendant leaf contains
393 the same number of black nodes.
394 5. The root is always black.
395
396 When nodes are inserted into the tree, or deleted from the tree,
397 the tree is "fixed" so that these properties are always true.
398
399 A red-black tree with N internal nodes has height at most 2
400 log(N+1). Searches, insertions and deletions are done in O(log N).
401 Please see a text book about data structures for a detailed
402 description of red-black trees. Any book worth its salt should
403 describe them. */
404
405struct mem_node
406{
9f7d9210
RS
407 /* Children of this node. These pointers are never NULL. When there
408 is no child, the value is MEM_NIL, which points to a dummy node. */
409 struct mem_node *left, *right;
410
411 /* The parent of this node. In the root node, this is NULL. */
412 struct mem_node *parent;
877935b1
GM
413
414 /* Start and end of allocated region. */
415 void *start, *end;
416
417 /* Node color. */
418 enum {MEM_BLACK, MEM_RED} color;
177c0ea7 419
877935b1
GM
420 /* Memory type. */
421 enum mem_type type;
422};
423
424/* Base address of stack. Set in main. */
425
426Lisp_Object *stack_base;
427
428/* Root of the tree describing allocated Lisp memory. */
429
430static struct mem_node *mem_root;
431
ece93c02
GM
432/* Lowest and highest known address in the heap. */
433
434static void *min_heap_address, *max_heap_address;
435
877935b1
GM
436/* Sentinel node of the tree. */
437
438static struct mem_node mem_z;
439#define MEM_NIL &mem_z
440
f57e2426
J
441static struct Lisp_Vector *allocate_vectorlike (EMACS_INT);
442static void lisp_free (POINTER_TYPE *);
443static void mark_stack (void);
444static int live_vector_p (struct mem_node *, void *);
445static int live_buffer_p (struct mem_node *, void *);
446static int live_string_p (struct mem_node *, void *);
447static int live_cons_p (struct mem_node *, void *);
448static int live_symbol_p (struct mem_node *, void *);
449static int live_float_p (struct mem_node *, void *);
450static int live_misc_p (struct mem_node *, void *);
451static void mark_maybe_object (Lisp_Object);
452static void mark_memory (void *, void *, int);
453static void mem_init (void);
454static struct mem_node *mem_insert (void *, void *, enum mem_type);
455static void mem_insert_fixup (struct mem_node *);
456static void mem_rotate_left (struct mem_node *);
457static void mem_rotate_right (struct mem_node *);
458static void mem_delete (struct mem_node *);
459static void mem_delete_fixup (struct mem_node *);
460static INLINE struct mem_node *mem_find (void *);
34400008 461
34400008
GM
462
463#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
f57e2426 464static void check_gcpros (void);
34400008
GM
465#endif
466
877935b1 467#endif /* GC_MARK_STACK || GC_MALLOC_CHECK */
34400008 468
1f0b3fd2
GM
469/* Recording what needs to be marked for gc. */
470
471struct gcpro *gcprolist;
472
379b98b1
PE
473/* Addresses of staticpro'd variables. Initialize it to a nonzero
474 value; otherwise some compilers put it into BSS. */
1f0b3fd2 475
0078170f 476#define NSTATICS 0x640
d3d47262 477static Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag};
1f0b3fd2
GM
478
479/* Index of next unused slot in staticvec. */
480
d3d47262 481static int staticidx = 0;
1f0b3fd2 482
f57e2426 483static POINTER_TYPE *pure_alloc (size_t, int);
1f0b3fd2
GM
484
485
486/* Value is SZ rounded up to the next multiple of ALIGNMENT.
487 ALIGNMENT must be a power of 2. */
488
ab6780cd
SM
489#define ALIGN(ptr, ALIGNMENT) \
490 ((POINTER_TYPE *) ((((EMACS_UINT)(ptr)) + (ALIGNMENT) - 1) \
491 & ~((ALIGNMENT) - 1)))
1f0b3fd2 492
ece93c02 493
7146af97 494\f
34400008
GM
495/************************************************************************
496 Malloc
497 ************************************************************************/
498
4455ad75 499/* Function malloc calls this if it finds we are near exhausting storage. */
d457598b
AS
500
501void
a8fe7202 502malloc_warning (const char *str)
7146af97
JB
503{
504 pending_malloc_warning = str;
505}
506
34400008 507
4455ad75 508/* Display an already-pending malloc warning. */
34400008 509
d457598b 510void
971de7fb 511display_malloc_warning (void)
7146af97 512{
4455ad75
RS
513 call3 (intern ("display-warning"),
514 intern ("alloc"),
515 build_string (pending_malloc_warning),
516 intern ("emergency"));
7146af97 517 pending_malloc_warning = 0;
7146af97
JB
518}
519
34400008 520
d1658221 521#ifdef DOUG_LEA_MALLOC
4d74a5fc 522# define BYTES_USED (mallinfo ().uordblks)
d1658221 523#else
1177ecf6 524# define BYTES_USED _bytes_used
d1658221 525#endif
49efed3a 526\f
276cbe5a
RS
527/* Called if we can't allocate relocatable space for a buffer. */
528
529void
971de7fb 530buffer_memory_full (void)
276cbe5a 531{
2e471eb5
GM
532 /* If buffers use the relocating allocator, no need to free
533 spare_memory, because we may have plenty of malloc space left
534 that we could get, and if we don't, the malloc that fails will
535 itself cause spare_memory to be freed. If buffers don't use the
536 relocating allocator, treat this like any other failing
537 malloc. */
276cbe5a
RS
538
539#ifndef REL_ALLOC
540 memory_full ();
541#endif
542
2e471eb5
GM
543 /* This used to call error, but if we've run out of memory, we could
544 get infinite recursion trying to build the string. */
9b306d37 545 xsignal (Qnil, Vmemory_signal_data);
7146af97
JB
546}
547
34400008 548
212f33f1
KS
549#ifdef XMALLOC_OVERRUN_CHECK
550
bdbed949
KS
551/* Check for overrun in malloc'ed buffers by wrapping a 16 byte header
552 and a 16 byte trailer around each block.
553
554 The header consists of 12 fixed bytes + a 4 byte integer contaning the
555 original block size, while the trailer consists of 16 fixed bytes.
556
557 The header is used to detect whether this block has been allocated
558 through these functions -- as it seems that some low-level libc
559 functions may bypass the malloc hooks.
560*/
561
562
212f33f1 563#define XMALLOC_OVERRUN_CHECK_SIZE 16
bdbed949 564
212f33f1
KS
565static char xmalloc_overrun_check_header[XMALLOC_OVERRUN_CHECK_SIZE-4] =
566 { 0x9a, 0x9b, 0xae, 0xaf,
567 0xbf, 0xbe, 0xce, 0xcf,
568 0xea, 0xeb, 0xec, 0xed };
569
570static char xmalloc_overrun_check_trailer[XMALLOC_OVERRUN_CHECK_SIZE] =
571 { 0xaa, 0xab, 0xac, 0xad,
572 0xba, 0xbb, 0xbc, 0xbd,
573 0xca, 0xcb, 0xcc, 0xcd,
574 0xda, 0xdb, 0xdc, 0xdd };
575
bdbed949
KS
576/* Macros to insert and extract the block size in the header. */
577
578#define XMALLOC_PUT_SIZE(ptr, size) \
579 (ptr[-1] = (size & 0xff), \
580 ptr[-2] = ((size >> 8) & 0xff), \
581 ptr[-3] = ((size >> 16) & 0xff), \
582 ptr[-4] = ((size >> 24) & 0xff))
583
584#define XMALLOC_GET_SIZE(ptr) \
585 (size_t)((unsigned)(ptr[-1]) | \
586 ((unsigned)(ptr[-2]) << 8) | \
587 ((unsigned)(ptr[-3]) << 16) | \
588 ((unsigned)(ptr[-4]) << 24))
589
590
d8f165a8
JD
591/* The call depth in overrun_check functions. For example, this might happen:
592 xmalloc()
593 overrun_check_malloc()
594 -> malloc -> (via hook)_-> emacs_blocked_malloc
595 -> overrun_check_malloc
596 call malloc (hooks are NULL, so real malloc is called).
597 malloc returns 10000.
598 add overhead, return 10016.
599 <- (back in overrun_check_malloc)
857ae68b 600 add overhead again, return 10032
d8f165a8 601 xmalloc returns 10032.
857ae68b
JD
602
603 (time passes).
604
d8f165a8
JD
605 xfree(10032)
606 overrun_check_free(10032)
607 decrease overhed
608 free(10016) <- crash, because 10000 is the original pointer. */
857ae68b
JD
609
610static int check_depth;
611
bdbed949
KS
612/* Like malloc, but wraps allocated block with header and trailer. */
613
212f33f1
KS
614POINTER_TYPE *
615overrun_check_malloc (size)
616 size_t size;
617{
bdbed949 618 register unsigned char *val;
857ae68b 619 size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
212f33f1 620
857ae68b
JD
621 val = (unsigned char *) malloc (size + overhead);
622 if (val && check_depth == 1)
212f33f1 623 {
72af86bd
AS
624 memcpy (val, xmalloc_overrun_check_header,
625 XMALLOC_OVERRUN_CHECK_SIZE - 4);
212f33f1 626 val += XMALLOC_OVERRUN_CHECK_SIZE;
bdbed949 627 XMALLOC_PUT_SIZE(val, size);
72af86bd
AS
628 memcpy (val + size, xmalloc_overrun_check_trailer,
629 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 630 }
857ae68b 631 --check_depth;
212f33f1
KS
632 return (POINTER_TYPE *)val;
633}
634
bdbed949
KS
635
636/* Like realloc, but checks old block for overrun, and wraps new block
637 with header and trailer. */
638
212f33f1
KS
639POINTER_TYPE *
640overrun_check_realloc (block, size)
641 POINTER_TYPE *block;
642 size_t size;
643{
bdbed949 644 register unsigned char *val = (unsigned char *)block;
857ae68b 645 size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
212f33f1
KS
646
647 if (val
857ae68b 648 && check_depth == 1
72af86bd
AS
649 && memcmp (xmalloc_overrun_check_header,
650 val - XMALLOC_OVERRUN_CHECK_SIZE,
651 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
212f33f1 652 {
bdbed949 653 size_t osize = XMALLOC_GET_SIZE (val);
72af86bd
AS
654 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
655 XMALLOC_OVERRUN_CHECK_SIZE))
212f33f1 656 abort ();
72af86bd 657 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 658 val -= XMALLOC_OVERRUN_CHECK_SIZE;
72af86bd 659 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1
KS
660 }
661
857ae68b 662 val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + overhead);
212f33f1 663
857ae68b 664 if (val && check_depth == 1)
212f33f1 665 {
72af86bd
AS
666 memcpy (val, xmalloc_overrun_check_header,
667 XMALLOC_OVERRUN_CHECK_SIZE - 4);
212f33f1 668 val += XMALLOC_OVERRUN_CHECK_SIZE;
bdbed949 669 XMALLOC_PUT_SIZE(val, size);
72af86bd
AS
670 memcpy (val + size, xmalloc_overrun_check_trailer,
671 XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 672 }
857ae68b 673 --check_depth;
212f33f1
KS
674 return (POINTER_TYPE *)val;
675}
676
bdbed949
KS
677/* Like free, but checks block for overrun. */
678
212f33f1
KS
679void
680overrun_check_free (block)
681 POINTER_TYPE *block;
682{
bdbed949 683 unsigned char *val = (unsigned char *)block;
212f33f1 684
857ae68b 685 ++check_depth;
212f33f1 686 if (val
857ae68b 687 && check_depth == 1
72af86bd
AS
688 && memcmp (xmalloc_overrun_check_header,
689 val - XMALLOC_OVERRUN_CHECK_SIZE,
690 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
212f33f1 691 {
bdbed949 692 size_t osize = XMALLOC_GET_SIZE (val);
72af86bd
AS
693 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
694 XMALLOC_OVERRUN_CHECK_SIZE))
212f33f1 695 abort ();
454d7973
KS
696#ifdef XMALLOC_CLEAR_FREE_MEMORY
697 val -= XMALLOC_OVERRUN_CHECK_SIZE;
698 memset (val, 0xff, osize + XMALLOC_OVERRUN_CHECK_SIZE*2);
699#else
72af86bd 700 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
212f33f1 701 val -= XMALLOC_OVERRUN_CHECK_SIZE;
72af86bd 702 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE);
454d7973 703#endif
212f33f1
KS
704 }
705
706 free (val);
857ae68b 707 --check_depth;
212f33f1
KS
708}
709
710#undef malloc
711#undef realloc
712#undef free
713#define malloc overrun_check_malloc
714#define realloc overrun_check_realloc
715#define free overrun_check_free
716#endif
717
dafc79fa
SM
718#ifdef SYNC_INPUT
719/* When using SYNC_INPUT, we don't call malloc from a signal handler, so
720 there's no need to block input around malloc. */
721#define MALLOC_BLOCK_INPUT ((void)0)
722#define MALLOC_UNBLOCK_INPUT ((void)0)
723#else
724#define MALLOC_BLOCK_INPUT BLOCK_INPUT
725#define MALLOC_UNBLOCK_INPUT UNBLOCK_INPUT
726#endif
bdbed949 727
34400008 728/* Like malloc but check for no memory and block interrupt input.. */
7146af97 729
c971ff9a 730POINTER_TYPE *
971de7fb 731xmalloc (size_t size)
7146af97 732{
c971ff9a 733 register POINTER_TYPE *val;
7146af97 734
dafc79fa 735 MALLOC_BLOCK_INPUT;
c971ff9a 736 val = (POINTER_TYPE *) malloc (size);
dafc79fa 737 MALLOC_UNBLOCK_INPUT;
7146af97 738
2e471eb5
GM
739 if (!val && size)
740 memory_full ();
7146af97
JB
741 return val;
742}
743
34400008
GM
744
745/* Like realloc but check for no memory and block interrupt input.. */
746
c971ff9a 747POINTER_TYPE *
971de7fb 748xrealloc (POINTER_TYPE *block, size_t size)
7146af97 749{
c971ff9a 750 register POINTER_TYPE *val;
7146af97 751
dafc79fa 752 MALLOC_BLOCK_INPUT;
56d2031b
JB
753 /* We must call malloc explicitly when BLOCK is 0, since some
754 reallocs don't do this. */
755 if (! block)
c971ff9a 756 val = (POINTER_TYPE *) malloc (size);
f048679d 757 else
c971ff9a 758 val = (POINTER_TYPE *) realloc (block, size);
dafc79fa 759 MALLOC_UNBLOCK_INPUT;
7146af97
JB
760
761 if (!val && size) memory_full ();
762 return val;
763}
9ac0d9e0 764
34400008 765
005ca5c7 766/* Like free but block interrupt input. */
34400008 767
9ac0d9e0 768void
971de7fb 769xfree (POINTER_TYPE *block)
9ac0d9e0 770{
70fdbb46
JM
771 if (!block)
772 return;
dafc79fa 773 MALLOC_BLOCK_INPUT;
9ac0d9e0 774 free (block);
dafc79fa 775 MALLOC_UNBLOCK_INPUT;
24d8a105
RS
776 /* We don't call refill_memory_reserve here
777 because that duplicates doing so in emacs_blocked_free
778 and the criterion should go there. */
9ac0d9e0
JB
779}
780
c8099634 781
dca7c6a8
GM
782/* Like strdup, but uses xmalloc. */
783
784char *
971de7fb 785xstrdup (const char *s)
dca7c6a8 786{
675d5130 787 size_t len = strlen (s) + 1;
dca7c6a8 788 char *p = (char *) xmalloc (len);
72af86bd 789 memcpy (p, s, len);
dca7c6a8
GM
790 return p;
791}
792
793
f61bef8b
KS
794/* Unwind for SAFE_ALLOCA */
795
796Lisp_Object
971de7fb 797safe_alloca_unwind (Lisp_Object arg)
f61bef8b 798{
b766f870
KS
799 register struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
800
801 p->dogc = 0;
802 xfree (p->pointer);
803 p->pointer = 0;
7b7990cc 804 free_misc (arg);
f61bef8b
KS
805 return Qnil;
806}
807
808
34400008
GM
809/* Like malloc but used for allocating Lisp data. NBYTES is the
810 number of bytes to allocate, TYPE describes the intended use of the
811 allcated memory block (for strings, for conses, ...). */
812
212f33f1 813#ifndef USE_LSB_TAG
918a23a7 814static void *lisp_malloc_loser;
212f33f1 815#endif
918a23a7 816
675d5130 817static POINTER_TYPE *
971de7fb 818lisp_malloc (size_t nbytes, enum mem_type type)
c8099634 819{
34400008 820 register void *val;
c8099634 821
dafc79fa 822 MALLOC_BLOCK_INPUT;
877935b1
GM
823
824#ifdef GC_MALLOC_CHECK
825 allocated_mem_type = type;
826#endif
177c0ea7 827
34400008 828 val = (void *) malloc (nbytes);
c8099634 829
6b61353c 830#ifndef USE_LSB_TAG
918a23a7
RS
831 /* If the memory just allocated cannot be addressed thru a Lisp
832 object's pointer, and it needs to be,
833 that's equivalent to running out of memory. */
834 if (val && type != MEM_TYPE_NON_LISP)
835 {
836 Lisp_Object tem;
837 XSETCONS (tem, (char *) val + nbytes - 1);
838 if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
839 {
840 lisp_malloc_loser = val;
841 free (val);
842 val = 0;
843 }
844 }
6b61353c 845#endif
918a23a7 846
877935b1 847#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
dca7c6a8 848 if (val && type != MEM_TYPE_NON_LISP)
34400008
GM
849 mem_insert (val, (char *) val + nbytes, type);
850#endif
177c0ea7 851
dafc79fa 852 MALLOC_UNBLOCK_INPUT;
dca7c6a8
GM
853 if (!val && nbytes)
854 memory_full ();
c8099634
RS
855 return val;
856}
857
34400008
GM
858/* Free BLOCK. This must be called to free memory allocated with a
859 call to lisp_malloc. */
860
bf952fb6 861static void
971de7fb 862lisp_free (POINTER_TYPE *block)
c8099634 863{
dafc79fa 864 MALLOC_BLOCK_INPUT;
c8099634 865 free (block);
877935b1 866#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
34400008
GM
867 mem_delete (mem_find (block));
868#endif
dafc79fa 869 MALLOC_UNBLOCK_INPUT;
c8099634 870}
34400008 871
ab6780cd
SM
872/* Allocation of aligned blocks of memory to store Lisp data. */
873/* The entry point is lisp_align_malloc which returns blocks of at most */
874/* BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
875
349a4500
SM
876/* Use posix_memalloc if the system has it and we're using the system's
877 malloc (because our gmalloc.c routines don't have posix_memalign although
878 its memalloc could be used). */
b4181b01
KS
879#if defined (HAVE_POSIX_MEMALIGN) && defined (SYSTEM_MALLOC)
880#define USE_POSIX_MEMALIGN 1
881#endif
ab6780cd
SM
882
883/* BLOCK_ALIGN has to be a power of 2. */
884#define BLOCK_ALIGN (1 << 10)
ab6780cd
SM
885
886/* Padding to leave at the end of a malloc'd block. This is to give
887 malloc a chance to minimize the amount of memory wasted to alignment.
888 It should be tuned to the particular malloc library used.
19bcad1f
SM
889 On glibc-2.3.2, malloc never tries to align, so a padding of 0 is best.
890 posix_memalign on the other hand would ideally prefer a value of 4
891 because otherwise, there's 1020 bytes wasted between each ablocks.
f501ccb4
SM
892 In Emacs, testing shows that those 1020 can most of the time be
893 efficiently used by malloc to place other objects, so a value of 0 can
894 still preferable unless you have a lot of aligned blocks and virtually
895 nothing else. */
19bcad1f
SM
896#define BLOCK_PADDING 0
897#define BLOCK_BYTES \
f501ccb4 898 (BLOCK_ALIGN - sizeof (struct ablock *) - BLOCK_PADDING)
19bcad1f
SM
899
900/* Internal data structures and constants. */
901
ab6780cd
SM
902#define ABLOCKS_SIZE 16
903
904/* An aligned block of memory. */
905struct ablock
906{
907 union
908 {
909 char payload[BLOCK_BYTES];
910 struct ablock *next_free;
911 } x;
912 /* `abase' is the aligned base of the ablocks. */
913 /* It is overloaded to hold the virtual `busy' field that counts
914 the number of used ablock in the parent ablocks.
915 The first ablock has the `busy' field, the others have the `abase'
916 field. To tell the difference, we assume that pointers will have
917 integer values larger than 2 * ABLOCKS_SIZE. The lowest bit of `busy'
918 is used to tell whether the real base of the parent ablocks is `abase'
919 (if not, the word before the first ablock holds a pointer to the
920 real base). */
921 struct ablocks *abase;
922 /* The padding of all but the last ablock is unused. The padding of
923 the last ablock in an ablocks is not allocated. */
19bcad1f
SM
924#if BLOCK_PADDING
925 char padding[BLOCK_PADDING];
ebb8d410 926#endif
ab6780cd
SM
927};
928
929/* A bunch of consecutive aligned blocks. */
930struct ablocks
931{
932 struct ablock blocks[ABLOCKS_SIZE];
933};
934
935/* Size of the block requested from malloc or memalign. */
19bcad1f 936#define ABLOCKS_BYTES (sizeof (struct ablocks) - BLOCK_PADDING)
ab6780cd
SM
937
938#define ABLOCK_ABASE(block) \
939 (((unsigned long) (block)->abase) <= (1 + 2 * ABLOCKS_SIZE) \
940 ? (struct ablocks *)(block) \
941 : (block)->abase)
942
943/* Virtual `busy' field. */
944#define ABLOCKS_BUSY(abase) ((abase)->blocks[0].abase)
945
946/* Pointer to the (not necessarily aligned) malloc block. */
349a4500 947#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
948#define ABLOCKS_BASE(abase) (abase)
949#else
ab6780cd 950#define ABLOCKS_BASE(abase) \
005ca5c7 951 (1 & (long) ABLOCKS_BUSY (abase) ? abase : ((void**)abase)[-1])
19bcad1f 952#endif
ab6780cd
SM
953
954/* The list of free ablock. */
955static struct ablock *free_ablock;
956
957/* Allocate an aligned block of nbytes.
958 Alignment is on a multiple of BLOCK_ALIGN and `nbytes' has to be
959 smaller or equal to BLOCK_BYTES. */
960static POINTER_TYPE *
971de7fb 961lisp_align_malloc (size_t nbytes, enum mem_type type)
ab6780cd
SM
962{
963 void *base, *val;
964 struct ablocks *abase;
965
966 eassert (nbytes <= BLOCK_BYTES);
967
dafc79fa 968 MALLOC_BLOCK_INPUT;
ab6780cd
SM
969
970#ifdef GC_MALLOC_CHECK
971 allocated_mem_type = type;
972#endif
973
974 if (!free_ablock)
975 {
005ca5c7
DL
976 int i;
977 EMACS_INT aligned; /* int gets warning casting to 64-bit pointer. */
ab6780cd
SM
978
979#ifdef DOUG_LEA_MALLOC
980 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
981 because mapped region contents are not preserved in
982 a dumped Emacs. */
983 mallopt (M_MMAP_MAX, 0);
984#endif
985
349a4500 986#ifdef USE_POSIX_MEMALIGN
19bcad1f
SM
987 {
988 int err = posix_memalign (&base, BLOCK_ALIGN, ABLOCKS_BYTES);
ab349c19
RS
989 if (err)
990 base = NULL;
991 abase = base;
19bcad1f
SM
992 }
993#else
ab6780cd
SM
994 base = malloc (ABLOCKS_BYTES);
995 abase = ALIGN (base, BLOCK_ALIGN);
ab349c19
RS
996#endif
997
6b61353c
KH
998 if (base == 0)
999 {
dafc79fa 1000 MALLOC_UNBLOCK_INPUT;
6b61353c
KH
1001 memory_full ();
1002 }
ab6780cd
SM
1003
1004 aligned = (base == abase);
1005 if (!aligned)
1006 ((void**)abase)[-1] = base;
1007
1008#ifdef DOUG_LEA_MALLOC
1009 /* Back to a reasonable maximum of mmap'ed areas. */
1010 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1011#endif
1012
6b61353c 1013#ifndef USE_LSB_TAG
8f924df7
KH
1014 /* If the memory just allocated cannot be addressed thru a Lisp
1015 object's pointer, and it needs to be, that's equivalent to
1016 running out of memory. */
1017 if (type != MEM_TYPE_NON_LISP)
1018 {
1019 Lisp_Object tem;
1020 char *end = (char *) base + ABLOCKS_BYTES - 1;
1021 XSETCONS (tem, end);
1022 if ((char *) XCONS (tem) != end)
1023 {
1024 lisp_malloc_loser = base;
1025 free (base);
dafc79fa 1026 MALLOC_UNBLOCK_INPUT;
8f924df7
KH
1027 memory_full ();
1028 }
1029 }
6b61353c 1030#endif
8f924df7 1031
ab6780cd
SM
1032 /* Initialize the blocks and put them on the free list.
1033 Is `base' was not properly aligned, we can't use the last block. */
1034 for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
1035 {
1036 abase->blocks[i].abase = abase;
1037 abase->blocks[i].x.next_free = free_ablock;
1038 free_ablock = &abase->blocks[i];
1039 }
005ca5c7 1040 ABLOCKS_BUSY (abase) = (struct ablocks *) (long) aligned;
ab6780cd 1041
19bcad1f 1042 eassert (0 == ((EMACS_UINT)abase) % BLOCK_ALIGN);
ab6780cd
SM
1043 eassert (ABLOCK_ABASE (&abase->blocks[3]) == abase); /* 3 is arbitrary */
1044 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase);
1045 eassert (ABLOCKS_BASE (abase) == base);
005ca5c7 1046 eassert (aligned == (long) ABLOCKS_BUSY (abase));
ab6780cd
SM
1047 }
1048
1049 abase = ABLOCK_ABASE (free_ablock);
005ca5c7 1050 ABLOCKS_BUSY (abase) = (struct ablocks *) (2 + (long) ABLOCKS_BUSY (abase));
ab6780cd
SM
1051 val = free_ablock;
1052 free_ablock = free_ablock->x.next_free;
1053
ab6780cd
SM
1054#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
1055 if (val && type != MEM_TYPE_NON_LISP)
1056 mem_insert (val, (char *) val + nbytes, type);
1057#endif
1058
dafc79fa 1059 MALLOC_UNBLOCK_INPUT;
ab6780cd
SM
1060 if (!val && nbytes)
1061 memory_full ();
1062
1063 eassert (0 == ((EMACS_UINT)val) % BLOCK_ALIGN);
1064 return val;
1065}
1066
1067static void
971de7fb 1068lisp_align_free (POINTER_TYPE *block)
ab6780cd
SM
1069{
1070 struct ablock *ablock = block;
1071 struct ablocks *abase = ABLOCK_ABASE (ablock);
1072
dafc79fa 1073 MALLOC_BLOCK_INPUT;
ab6780cd
SM
1074#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
1075 mem_delete (mem_find (block));
1076#endif
1077 /* Put on free list. */
1078 ablock->x.next_free = free_ablock;
1079 free_ablock = ablock;
1080 /* Update busy count. */
005ca5c7 1081 ABLOCKS_BUSY (abase) = (struct ablocks *) (-2 + (long) ABLOCKS_BUSY (abase));
d2db1c32 1082
005ca5c7 1083 if (2 > (long) ABLOCKS_BUSY (abase))
ab6780cd 1084 { /* All the blocks are free. */
005ca5c7 1085 int i = 0, aligned = (long) ABLOCKS_BUSY (abase);
ab6780cd
SM
1086 struct ablock **tem = &free_ablock;
1087 struct ablock *atop = &abase->blocks[aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1];
1088
1089 while (*tem)
1090 {
1091 if (*tem >= (struct ablock *) abase && *tem < atop)
1092 {
1093 i++;
1094 *tem = (*tem)->x.next_free;
1095 }
1096 else
1097 tem = &(*tem)->x.next_free;
1098 }
1099 eassert ((aligned & 1) == aligned);
1100 eassert (i == (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1));
349a4500 1101#ifdef USE_POSIX_MEMALIGN
cfb2f32e
SM
1102 eassert ((unsigned long)ABLOCKS_BASE (abase) % BLOCK_ALIGN == 0);
1103#endif
ab6780cd
SM
1104 free (ABLOCKS_BASE (abase));
1105 }
dafc79fa 1106 MALLOC_UNBLOCK_INPUT;
ab6780cd 1107}
3ef06d12
SM
1108
1109/* Return a new buffer structure allocated from the heap with
1110 a call to lisp_malloc. */
1111
1112struct buffer *
971de7fb 1113allocate_buffer (void)
3ef06d12
SM
1114{
1115 struct buffer *b
1116 = (struct buffer *) lisp_malloc (sizeof (struct buffer),
1117 MEM_TYPE_BUFFER);
67ee9f6e
SM
1118 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
1119 XSETPVECTYPE (b, PVEC_BUFFER);
3ef06d12
SM
1120 return b;
1121}
1122
9ac0d9e0 1123\f
026cdede
SM
1124#ifndef SYSTEM_MALLOC
1125
9ac0d9e0
JB
1126/* Arranging to disable input signals while we're in malloc.
1127
1128 This only works with GNU malloc. To help out systems which can't
1129 use GNU malloc, all the calls to malloc, realloc, and free
1130 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
026cdede 1131 pair; unfortunately, we have no idea what C library functions
9ac0d9e0 1132 might call malloc, so we can't really protect them unless you're
2c5bd608
DL
1133 using GNU malloc. Fortunately, most of the major operating systems
1134 can use GNU malloc. */
9ac0d9e0 1135
026cdede 1136#ifndef SYNC_INPUT
dafc79fa
SM
1137/* When using SYNC_INPUT, we don't call malloc from a signal handler, so
1138 there's no need to block input around malloc. */
026cdede 1139
b3303f74 1140#ifndef DOUG_LEA_MALLOC
f57e2426
J
1141extern void * (*__malloc_hook) (size_t, const void *);
1142extern void * (*__realloc_hook) (void *, size_t, const void *);
1143extern void (*__free_hook) (void *, const void *);
b3303f74
DL
1144/* Else declared in malloc.h, perhaps with an extra arg. */
1145#endif /* DOUG_LEA_MALLOC */
f57e2426
J
1146static void * (*old_malloc_hook) (size_t, const void *);
1147static void * (*old_realloc_hook) (void *, size_t, const void*);
1148static void (*old_free_hook) (void*, const void*);
9ac0d9e0 1149
276cbe5a
RS
1150/* This function is used as the hook for free to call. */
1151
9ac0d9e0 1152static void
7c3320d8 1153emacs_blocked_free (void *ptr, const void *ptr2)
9ac0d9e0 1154{
aa477689 1155 BLOCK_INPUT_ALLOC;
877935b1
GM
1156
1157#ifdef GC_MALLOC_CHECK
a83fee2c
GM
1158 if (ptr)
1159 {
1160 struct mem_node *m;
177c0ea7 1161
a83fee2c
GM
1162 m = mem_find (ptr);
1163 if (m == MEM_NIL || m->start != ptr)
1164 {
1165 fprintf (stderr,
1166 "Freeing `%p' which wasn't allocated with malloc\n", ptr);
1167 abort ();
1168 }
1169 else
1170 {
1171 /* fprintf (stderr, "free %p...%p (%p)\n", m->start, m->end, ptr); */
1172 mem_delete (m);
1173 }
1174 }
877935b1 1175#endif /* GC_MALLOC_CHECK */
177c0ea7 1176
9ac0d9e0
JB
1177 __free_hook = old_free_hook;
1178 free (ptr);
177c0ea7 1179
276cbe5a
RS
1180 /* If we released our reserve (due to running out of memory),
1181 and we have a fair amount free once again,
1182 try to set aside another reserve in case we run out once more. */
24d8a105 1183 if (! NILP (Vmemory_full)
276cbe5a
RS
1184 /* Verify there is enough space that even with the malloc
1185 hysteresis this call won't run out again.
1186 The code here is correct as long as SPARE_MEMORY
1187 is substantially larger than the block size malloc uses. */
1188 && (bytes_used_when_full
4d74a5fc 1189 > ((bytes_used_when_reconsidered = BYTES_USED)
bccfb310 1190 + max (malloc_hysteresis, 4) * SPARE_MEMORY)))
24d8a105 1191 refill_memory_reserve ();
276cbe5a 1192
b0846f52 1193 __free_hook = emacs_blocked_free;
aa477689 1194 UNBLOCK_INPUT_ALLOC;
9ac0d9e0
JB
1195}
1196
34400008 1197
276cbe5a
RS
1198/* This function is the malloc hook that Emacs uses. */
1199
9ac0d9e0 1200static void *
7c3320d8 1201emacs_blocked_malloc (size_t size, const void *ptr)
9ac0d9e0
JB
1202{
1203 void *value;
1204
aa477689 1205 BLOCK_INPUT_ALLOC;
9ac0d9e0 1206 __malloc_hook = old_malloc_hook;
1177ecf6 1207#ifdef DOUG_LEA_MALLOC
5665a02f
KL
1208 /* Segfaults on my system. --lorentey */
1209 /* mallopt (M_TOP_PAD, malloc_hysteresis * 4096); */
1177ecf6 1210#else
d1658221 1211 __malloc_extra_blocks = malloc_hysteresis;
1177ecf6 1212#endif
877935b1 1213
2756d8ee 1214 value = (void *) malloc (size);
877935b1
GM
1215
1216#ifdef GC_MALLOC_CHECK
1217 {
1218 struct mem_node *m = mem_find (value);
1219 if (m != MEM_NIL)
1220 {
1221 fprintf (stderr, "Malloc returned %p which is already in use\n",
1222 value);
1223 fprintf (stderr, "Region in use is %p...%p, %u bytes, type %d\n",
1224 m->start, m->end, (char *) m->end - (char *) m->start,
1225 m->type);
1226 abort ();
1227 }
1228
1229 if (!dont_register_blocks)
1230 {
1231 mem_insert (value, (char *) value + max (1, size), allocated_mem_type);
1232 allocated_mem_type = MEM_TYPE_NON_LISP;
1233 }
1234 }
1235#endif /* GC_MALLOC_CHECK */
177c0ea7 1236
b0846f52 1237 __malloc_hook = emacs_blocked_malloc;
aa477689 1238 UNBLOCK_INPUT_ALLOC;
9ac0d9e0 1239
877935b1 1240 /* fprintf (stderr, "%p malloc\n", value); */
9ac0d9e0
JB
1241 return value;
1242}
1243
34400008
GM
1244
1245/* This function is the realloc hook that Emacs uses. */
1246
9ac0d9e0 1247static void *
7c3320d8 1248emacs_blocked_realloc (void *ptr, size_t size, const void *ptr2)
9ac0d9e0
JB
1249{
1250 void *value;
1251
aa477689 1252 BLOCK_INPUT_ALLOC;
9ac0d9e0 1253 __realloc_hook = old_realloc_hook;
877935b1
GM
1254
1255#ifdef GC_MALLOC_CHECK
1256 if (ptr)
1257 {
1258 struct mem_node *m = mem_find (ptr);
1259 if (m == MEM_NIL || m->start != ptr)
1260 {
1261 fprintf (stderr,
1262 "Realloc of %p which wasn't allocated with malloc\n",
1263 ptr);
1264 abort ();
1265 }
1266
1267 mem_delete (m);
1268 }
177c0ea7 1269
877935b1 1270 /* fprintf (stderr, "%p -> realloc\n", ptr); */
177c0ea7 1271
877935b1
GM
1272 /* Prevent malloc from registering blocks. */
1273 dont_register_blocks = 1;
1274#endif /* GC_MALLOC_CHECK */
1275
2756d8ee 1276 value = (void *) realloc (ptr, size);
877935b1
GM
1277
1278#ifdef GC_MALLOC_CHECK
1279 dont_register_blocks = 0;
1280
1281 {
1282 struct mem_node *m = mem_find (value);
1283 if (m != MEM_NIL)
1284 {
1285 fprintf (stderr, "Realloc returns memory that is already in use\n");
1286 abort ();
1287 }
1288
1289 /* Can't handle zero size regions in the red-black tree. */
1290 mem_insert (value, (char *) value + max (size, 1), MEM_TYPE_NON_LISP);
1291 }
177c0ea7 1292
877935b1
GM
1293 /* fprintf (stderr, "%p <- realloc\n", value); */
1294#endif /* GC_MALLOC_CHECK */
177c0ea7 1295
b0846f52 1296 __realloc_hook = emacs_blocked_realloc;
aa477689 1297 UNBLOCK_INPUT_ALLOC;
9ac0d9e0
JB
1298
1299 return value;
1300}
1301
34400008 1302
aa477689
JD
1303#ifdef HAVE_GTK_AND_PTHREAD
1304/* Called from Fdump_emacs so that when the dumped Emacs starts, it has a
1305 normal malloc. Some thread implementations need this as they call
1306 malloc before main. The pthread_self call in BLOCK_INPUT_ALLOC then
1307 calls malloc because it is the first call, and we have an endless loop. */
1308
1309void
1310reset_malloc_hooks ()
1311{
4d580af2
AS
1312 __free_hook = old_free_hook;
1313 __malloc_hook = old_malloc_hook;
1314 __realloc_hook = old_realloc_hook;
aa477689
JD
1315}
1316#endif /* HAVE_GTK_AND_PTHREAD */
1317
1318
34400008
GM
1319/* Called from main to set up malloc to use our hooks. */
1320
9ac0d9e0 1321void
7c3320d8 1322uninterrupt_malloc (void)
9ac0d9e0 1323{
aa477689 1324#ifdef HAVE_GTK_AND_PTHREAD
a1b41389 1325#ifdef DOUG_LEA_MALLOC
aa477689
JD
1326 pthread_mutexattr_t attr;
1327
1328 /* GLIBC has a faster way to do this, but lets keep it portable.
1329 This is according to the Single UNIX Specification. */
1330 pthread_mutexattr_init (&attr);
1331 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
1332 pthread_mutex_init (&alloc_mutex, &attr);
a1b41389 1333#else /* !DOUG_LEA_MALLOC */
ce5b453a 1334 /* Some systems such as Solaris 2.6 don't have a recursive mutex,
a1b41389
YM
1335 and the bundled gmalloc.c doesn't require it. */
1336 pthread_mutex_init (&alloc_mutex, NULL);
1337#endif /* !DOUG_LEA_MALLOC */
aa477689
JD
1338#endif /* HAVE_GTK_AND_PTHREAD */
1339
c8099634
RS
1340 if (__free_hook != emacs_blocked_free)
1341 old_free_hook = __free_hook;
b0846f52 1342 __free_hook = emacs_blocked_free;
9ac0d9e0 1343
c8099634
RS
1344 if (__malloc_hook != emacs_blocked_malloc)
1345 old_malloc_hook = __malloc_hook;
b0846f52 1346 __malloc_hook = emacs_blocked_malloc;
9ac0d9e0 1347
c8099634
RS
1348 if (__realloc_hook != emacs_blocked_realloc)
1349 old_realloc_hook = __realloc_hook;
b0846f52 1350 __realloc_hook = emacs_blocked_realloc;
9ac0d9e0 1351}
2e471eb5 1352
026cdede 1353#endif /* not SYNC_INPUT */
2e471eb5
GM
1354#endif /* not SYSTEM_MALLOC */
1355
1356
7146af97 1357\f
2e471eb5
GM
1358/***********************************************************************
1359 Interval Allocation
1360 ***********************************************************************/
1a4f1e2c 1361
34400008
GM
1362/* Number of intervals allocated in an interval_block structure.
1363 The 1020 is 1024 minus malloc overhead. */
1364
d5e35230
JA
1365#define INTERVAL_BLOCK_SIZE \
1366 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
1367
34400008
GM
1368/* Intervals are allocated in chunks in form of an interval_block
1369 structure. */
1370
d5e35230 1371struct interval_block
2e471eb5 1372{
6b61353c 1373 /* Place `intervals' first, to preserve alignment. */
2e471eb5 1374 struct interval intervals[INTERVAL_BLOCK_SIZE];
6b61353c 1375 struct interval_block *next;
2e471eb5 1376};
d5e35230 1377
34400008
GM
1378/* Current interval block. Its `next' pointer points to older
1379 blocks. */
1380
d3d47262 1381static struct interval_block *interval_block;
34400008
GM
1382
1383/* Index in interval_block above of the next unused interval
1384 structure. */
1385
d5e35230 1386static int interval_block_index;
34400008
GM
1387
1388/* Number of free and live intervals. */
1389
2e471eb5 1390static int total_free_intervals, total_intervals;
d5e35230 1391
34400008
GM
1392/* List of free intervals. */
1393
d5e35230
JA
1394INTERVAL interval_free_list;
1395
c8099634 1396/* Total number of interval blocks now in use. */
2e471eb5 1397
d3d47262 1398static int n_interval_blocks;
c8099634 1399
34400008
GM
1400
1401/* Initialize interval allocation. */
1402
d5e35230 1403static void
971de7fb 1404init_intervals (void)
d5e35230 1405{
005ca5c7
DL
1406 interval_block = NULL;
1407 interval_block_index = INTERVAL_BLOCK_SIZE;
d5e35230 1408 interval_free_list = 0;
005ca5c7 1409 n_interval_blocks = 0;
d5e35230
JA
1410}
1411
34400008
GM
1412
1413/* Return a new interval. */
d5e35230
JA
1414
1415INTERVAL
971de7fb 1416make_interval (void)
d5e35230
JA
1417{
1418 INTERVAL val;
1419
e2984df0
CY
1420 /* eassert (!handling_signal); */
1421
dafc79fa 1422 MALLOC_BLOCK_INPUT;
cfb2f32e 1423
d5e35230
JA
1424 if (interval_free_list)
1425 {
1426 val = interval_free_list;
439d5cb4 1427 interval_free_list = INTERVAL_PARENT (interval_free_list);
d5e35230
JA
1428 }
1429 else
1430 {
1431 if (interval_block_index == INTERVAL_BLOCK_SIZE)
1432 {
3c06d205
KH
1433 register struct interval_block *newi;
1434
34400008
GM
1435 newi = (struct interval_block *) lisp_malloc (sizeof *newi,
1436 MEM_TYPE_NON_LISP);
d5e35230 1437
d5e35230
JA
1438 newi->next = interval_block;
1439 interval_block = newi;
1440 interval_block_index = 0;
c8099634 1441 n_interval_blocks++;
d5e35230
JA
1442 }
1443 val = &interval_block->intervals[interval_block_index++];
1444 }
e2984df0 1445
dafc79fa 1446 MALLOC_UNBLOCK_INPUT;
e2984df0 1447
d5e35230 1448 consing_since_gc += sizeof (struct interval);
310ea200 1449 intervals_consed++;
d5e35230 1450 RESET_INTERVAL (val);
2336fe58 1451 val->gcmarkbit = 0;
d5e35230
JA
1452 return val;
1453}
1454
34400008
GM
1455
1456/* Mark Lisp objects in interval I. */
d5e35230
JA
1457
1458static void
971de7fb 1459mark_interval (register INTERVAL i, Lisp_Object dummy)
d5e35230 1460{
2336fe58
SM
1461 eassert (!i->gcmarkbit); /* Intervals are never shared. */
1462 i->gcmarkbit = 1;
49723c04 1463 mark_object (i->plist);
d5e35230
JA
1464}
1465
34400008
GM
1466
1467/* Mark the interval tree rooted in TREE. Don't call this directly;
1468 use the macro MARK_INTERVAL_TREE instead. */
1469
d5e35230 1470static void
971de7fb 1471mark_interval_tree (register INTERVAL tree)
d5e35230 1472{
e8720644
JB
1473 /* No need to test if this tree has been marked already; this
1474 function is always called through the MARK_INTERVAL_TREE macro,
1475 which takes care of that. */
1476
1e934989 1477 traverse_intervals_noorder (tree, mark_interval, Qnil);
d5e35230
JA
1478}
1479
34400008
GM
1480
1481/* Mark the interval tree rooted in I. */
1482
e8720644
JB
1483#define MARK_INTERVAL_TREE(i) \
1484 do { \
2336fe58 1485 if (!NULL_INTERVAL_P (i) && !i->gcmarkbit) \
e8720644
JB
1486 mark_interval_tree (i); \
1487 } while (0)
d5e35230 1488
34400008 1489
2e471eb5
GM
1490#define UNMARK_BALANCE_INTERVALS(i) \
1491 do { \
1492 if (! NULL_INTERVAL_P (i)) \
2336fe58 1493 (i) = balance_intervals (i); \
2e471eb5 1494 } while (0)
d5e35230 1495
cc2d8c6b 1496\f
6e5cb96f 1497/* Number support. If USE_LISP_UNION_TYPE is in effect, we
cc2d8c6b
KR
1498 can't create number objects in macros. */
1499#ifndef make_number
1500Lisp_Object
1501make_number (n)
217604da 1502 EMACS_INT n;
cc2d8c6b
KR
1503{
1504 Lisp_Object obj;
1505 obj.s.val = n;
1506 obj.s.type = Lisp_Int;
1507 return obj;
1508}
1509#endif
d5e35230 1510\f
2e471eb5
GM
1511/***********************************************************************
1512 String Allocation
1513 ***********************************************************************/
1a4f1e2c 1514
2e471eb5
GM
1515/* Lisp_Strings are allocated in string_block structures. When a new
1516 string_block is allocated, all the Lisp_Strings it contains are
e0fead5d 1517 added to a free-list string_free_list. When a new Lisp_String is
2e471eb5
GM
1518 needed, it is taken from that list. During the sweep phase of GC,
1519 string_blocks that are entirely free are freed, except two which
1520 we keep.
7146af97 1521
2e471eb5
GM
1522 String data is allocated from sblock structures. Strings larger
1523 than LARGE_STRING_BYTES, get their own sblock, data for smaller
1524 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
7146af97 1525
2e471eb5
GM
1526 Sblocks consist internally of sdata structures, one for each
1527 Lisp_String. The sdata structure points to the Lisp_String it
1528 belongs to. The Lisp_String points back to the `u.data' member of
1529 its sdata structure.
7146af97 1530
2e471eb5
GM
1531 When a Lisp_String is freed during GC, it is put back on
1532 string_free_list, and its `data' member and its sdata's `string'
1533 pointer is set to null. The size of the string is recorded in the
1534 `u.nbytes' member of the sdata. So, sdata structures that are no
1535 longer used, can be easily recognized, and it's easy to compact the
1536 sblocks of small strings which we do in compact_small_strings. */
7146af97 1537
2e471eb5
GM
1538/* Size in bytes of an sblock structure used for small strings. This
1539 is 8192 minus malloc overhead. */
7146af97 1540
2e471eb5 1541#define SBLOCK_SIZE 8188
c8099634 1542
2e471eb5
GM
1543/* Strings larger than this are considered large strings. String data
1544 for large strings is allocated from individual sblocks. */
7146af97 1545
2e471eb5
GM
1546#define LARGE_STRING_BYTES 1024
1547
1548/* Structure describing string memory sub-allocated from an sblock.
1549 This is where the contents of Lisp strings are stored. */
1550
1551struct sdata
7146af97 1552{
2e471eb5
GM
1553 /* Back-pointer to the string this sdata belongs to. If null, this
1554 structure is free, and the NBYTES member of the union below
34400008 1555 contains the string's byte size (the same value that STRING_BYTES
2e471eb5
GM
1556 would return if STRING were non-null). If non-null, STRING_BYTES
1557 (STRING) is the size of the data, and DATA contains the string's
1558 contents. */
1559 struct Lisp_String *string;
7146af97 1560
31d929e5 1561#ifdef GC_CHECK_STRING_BYTES
177c0ea7 1562
31d929e5
GM
1563 EMACS_INT nbytes;
1564 unsigned char data[1];
177c0ea7 1565
31d929e5
GM
1566#define SDATA_NBYTES(S) (S)->nbytes
1567#define SDATA_DATA(S) (S)->data
177c0ea7 1568
31d929e5
GM
1569#else /* not GC_CHECK_STRING_BYTES */
1570
2e471eb5
GM
1571 union
1572 {
1573 /* When STRING in non-null. */
1574 unsigned char data[1];
1575
1576 /* When STRING is null. */
1577 EMACS_INT nbytes;
1578 } u;
177c0ea7 1579
31d929e5
GM
1580
1581#define SDATA_NBYTES(S) (S)->u.nbytes
1582#define SDATA_DATA(S) (S)->u.data
1583
1584#endif /* not GC_CHECK_STRING_BYTES */
2e471eb5
GM
1585};
1586
31d929e5 1587
2e471eb5
GM
1588/* Structure describing a block of memory which is sub-allocated to
1589 obtain string data memory for strings. Blocks for small strings
1590 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
1591 as large as needed. */
1592
1593struct sblock
7146af97 1594{
2e471eb5
GM
1595 /* Next in list. */
1596 struct sblock *next;
7146af97 1597
2e471eb5
GM
1598 /* Pointer to the next free sdata block. This points past the end
1599 of the sblock if there isn't any space left in this block. */
1600 struct sdata *next_free;
1601
1602 /* Start of data. */
1603 struct sdata first_data;
1604};
1605
1606/* Number of Lisp strings in a string_block structure. The 1020 is
1607 1024 minus malloc overhead. */
1608
19bcad1f 1609#define STRING_BLOCK_SIZE \
2e471eb5
GM
1610 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
1611
1612/* Structure describing a block from which Lisp_String structures
1613 are allocated. */
1614
1615struct string_block
7146af97 1616{
6b61353c 1617 /* Place `strings' first, to preserve alignment. */
19bcad1f 1618 struct Lisp_String strings[STRING_BLOCK_SIZE];
6b61353c 1619 struct string_block *next;
2e471eb5 1620};
7146af97 1621
2e471eb5
GM
1622/* Head and tail of the list of sblock structures holding Lisp string
1623 data. We always allocate from current_sblock. The NEXT pointers
1624 in the sblock structures go from oldest_sblock to current_sblock. */
3c06d205 1625
2e471eb5 1626static struct sblock *oldest_sblock, *current_sblock;
7146af97 1627
2e471eb5 1628/* List of sblocks for large strings. */
7146af97 1629
2e471eb5 1630static struct sblock *large_sblocks;
7146af97 1631
2e471eb5 1632/* List of string_block structures, and how many there are. */
7146af97 1633
2e471eb5
GM
1634static struct string_block *string_blocks;
1635static int n_string_blocks;
7146af97 1636
2e471eb5 1637/* Free-list of Lisp_Strings. */
7146af97 1638
2e471eb5 1639static struct Lisp_String *string_free_list;
7146af97 1640
2e471eb5 1641/* Number of live and free Lisp_Strings. */
c8099634 1642
2e471eb5 1643static int total_strings, total_free_strings;
7146af97 1644
2e471eb5
GM
1645/* Number of bytes used by live strings. */
1646
1647static int total_string_size;
1648
1649/* Given a pointer to a Lisp_String S which is on the free-list
1650 string_free_list, return a pointer to its successor in the
1651 free-list. */
1652
1653#define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
1654
1655/* Return a pointer to the sdata structure belonging to Lisp string S.
1656 S must be live, i.e. S->data must not be null. S->data is actually
1657 a pointer to the `u.data' member of its sdata structure; the
1658 structure starts at a constant offset in front of that. */
177c0ea7 1659
31d929e5
GM
1660#ifdef GC_CHECK_STRING_BYTES
1661
1662#define SDATA_OF_STRING(S) \
1663 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *) \
1664 - sizeof (EMACS_INT)))
1665
1666#else /* not GC_CHECK_STRING_BYTES */
1667
2e471eb5
GM
1668#define SDATA_OF_STRING(S) \
1669 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *)))
1670
31d929e5
GM
1671#endif /* not GC_CHECK_STRING_BYTES */
1672
212f33f1
KS
1673
1674#ifdef GC_CHECK_STRING_OVERRUN
bdbed949
KS
1675
1676/* We check for overrun in string data blocks by appending a small
1677 "cookie" after each allocated string data block, and check for the
8349069c 1678 presence of this cookie during GC. */
bdbed949
KS
1679
1680#define GC_STRING_OVERRUN_COOKIE_SIZE 4
1681static char string_overrun_cookie[GC_STRING_OVERRUN_COOKIE_SIZE] =
1682 { 0xde, 0xad, 0xbe, 0xef };
1683
212f33f1 1684#else
bdbed949 1685#define GC_STRING_OVERRUN_COOKIE_SIZE 0
212f33f1
KS
1686#endif
1687
2e471eb5
GM
1688/* Value is the size of an sdata structure large enough to hold NBYTES
1689 bytes of string data. The value returned includes a terminating
1690 NUL byte, the size of the sdata structure, and padding. */
1691
31d929e5
GM
1692#ifdef GC_CHECK_STRING_BYTES
1693
2e471eb5
GM
1694#define SDATA_SIZE(NBYTES) \
1695 ((sizeof (struct Lisp_String *) \
1696 + (NBYTES) + 1 \
31d929e5 1697 + sizeof (EMACS_INT) \
2e471eb5
GM
1698 + sizeof (EMACS_INT) - 1) \
1699 & ~(sizeof (EMACS_INT) - 1))
1700
31d929e5
GM
1701#else /* not GC_CHECK_STRING_BYTES */
1702
1703#define SDATA_SIZE(NBYTES) \
1704 ((sizeof (struct Lisp_String *) \
1705 + (NBYTES) + 1 \
1706 + sizeof (EMACS_INT) - 1) \
1707 & ~(sizeof (EMACS_INT) - 1))
1708
1709#endif /* not GC_CHECK_STRING_BYTES */
2e471eb5 1710
bdbed949
KS
1711/* Extra bytes to allocate for each string. */
1712
1713#define GC_STRING_EXTRA (GC_STRING_OVERRUN_COOKIE_SIZE)
1714
2e471eb5 1715/* Initialize string allocation. Called from init_alloc_once. */
d457598b 1716
d3d47262 1717static void
971de7fb 1718init_strings (void)
7146af97 1719{
2e471eb5
GM
1720 total_strings = total_free_strings = total_string_size = 0;
1721 oldest_sblock = current_sblock = large_sblocks = NULL;
1722 string_blocks = NULL;
1723 n_string_blocks = 0;
1724 string_free_list = NULL;
4d774b0f
JB
1725 empty_unibyte_string = make_pure_string ("", 0, 0, 0);
1726 empty_multibyte_string = make_pure_string ("", 0, 0, 1);
7146af97
JB
1727}
1728
2e471eb5 1729
361b097f
GM
1730#ifdef GC_CHECK_STRING_BYTES
1731
361b097f
GM
1732static int check_string_bytes_count;
1733
f57e2426
J
1734static void check_string_bytes (int);
1735static void check_sblock (struct sblock *);
676a7251
GM
1736
1737#define CHECK_STRING_BYTES(S) STRING_BYTES (S)
1738
1739
1740/* Like GC_STRING_BYTES, but with debugging check. */
1741
1742int
1743string_bytes (s)
1744 struct Lisp_String *s;
1745{
7cdee936 1746 int nbytes = (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte);
676a7251
GM
1747 if (!PURE_POINTER_P (s)
1748 && s->data
1749 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1750 abort ();
1751 return nbytes;
1752}
177c0ea7 1753
2c5bd608 1754/* Check validity of Lisp strings' string_bytes member in B. */
676a7251 1755
d3d47262 1756static void
676a7251
GM
1757check_sblock (b)
1758 struct sblock *b;
361b097f 1759{
676a7251 1760 struct sdata *from, *end, *from_end;
177c0ea7 1761
676a7251 1762 end = b->next_free;
177c0ea7 1763
676a7251 1764 for (from = &b->first_data; from < end; from = from_end)
361b097f 1765 {
676a7251
GM
1766 /* Compute the next FROM here because copying below may
1767 overwrite data we need to compute it. */
1768 int nbytes;
177c0ea7 1769
676a7251
GM
1770 /* Check that the string size recorded in the string is the
1771 same as the one recorded in the sdata structure. */
1772 if (from->string)
1773 CHECK_STRING_BYTES (from->string);
177c0ea7 1774
676a7251
GM
1775 if (from->string)
1776 nbytes = GC_STRING_BYTES (from->string);
1777 else
1778 nbytes = SDATA_NBYTES (from);
177c0ea7 1779
676a7251 1780 nbytes = SDATA_SIZE (nbytes);
212f33f1 1781 from_end = (struct sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
676a7251
GM
1782 }
1783}
361b097f 1784
676a7251
GM
1785
1786/* Check validity of Lisp strings' string_bytes member. ALL_P
1787 non-zero means check all strings, otherwise check only most
1788 recently allocated strings. Used for hunting a bug. */
1789
d3d47262 1790static void
676a7251
GM
1791check_string_bytes (all_p)
1792 int all_p;
1793{
1794 if (all_p)
1795 {
1796 struct sblock *b;
1797
1798 for (b = large_sblocks; b; b = b->next)
1799 {
1800 struct Lisp_String *s = b->first_data.string;
1801 if (s)
1802 CHECK_STRING_BYTES (s);
361b097f 1803 }
177c0ea7 1804
676a7251
GM
1805 for (b = oldest_sblock; b; b = b->next)
1806 check_sblock (b);
361b097f 1807 }
676a7251
GM
1808 else
1809 check_sblock (current_sblock);
361b097f
GM
1810}
1811
1812#endif /* GC_CHECK_STRING_BYTES */
1813
212f33f1
KS
1814#ifdef GC_CHECK_STRING_FREE_LIST
1815
bdbed949
KS
1816/* Walk through the string free list looking for bogus next pointers.
1817 This may catch buffer overrun from a previous string. */
1818
212f33f1
KS
1819static void
1820check_string_free_list ()
1821{
1822 struct Lisp_String *s;
1823
1824 /* Pop a Lisp_String off the free-list. */
1825 s = string_free_list;
1826 while (s != NULL)
1827 {
1828 if ((unsigned)s < 1024)
1829 abort();
1830 s = NEXT_FREE_LISP_STRING (s);
1831 }
1832}
1833#else
1834#define check_string_free_list()
1835#endif
361b097f 1836
2e471eb5
GM
1837/* Return a new Lisp_String. */
1838
1839static struct Lisp_String *
971de7fb 1840allocate_string (void)
7146af97 1841{
2e471eb5 1842 struct Lisp_String *s;
7146af97 1843
e2984df0
CY
1844 /* eassert (!handling_signal); */
1845
dafc79fa 1846 MALLOC_BLOCK_INPUT;
cfb2f32e 1847
2e471eb5
GM
1848 /* If the free-list is empty, allocate a new string_block, and
1849 add all the Lisp_Strings in it to the free-list. */
1850 if (string_free_list == NULL)
7146af97 1851 {
2e471eb5
GM
1852 struct string_block *b;
1853 int i;
1854
34400008 1855 b = (struct string_block *) lisp_malloc (sizeof *b, MEM_TYPE_STRING);
72af86bd 1856 memset (b, 0, sizeof *b);
2e471eb5
GM
1857 b->next = string_blocks;
1858 string_blocks = b;
1859 ++n_string_blocks;
1860
19bcad1f 1861 for (i = STRING_BLOCK_SIZE - 1; i >= 0; --i)
7146af97 1862 {
2e471eb5
GM
1863 s = b->strings + i;
1864 NEXT_FREE_LISP_STRING (s) = string_free_list;
1865 string_free_list = s;
7146af97 1866 }
2e471eb5 1867
19bcad1f 1868 total_free_strings += STRING_BLOCK_SIZE;
7146af97 1869 }
c0f51373 1870
bdbed949 1871 check_string_free_list ();
212f33f1 1872
2e471eb5
GM
1873 /* Pop a Lisp_String off the free-list. */
1874 s = string_free_list;
1875 string_free_list = NEXT_FREE_LISP_STRING (s);
c0f51373 1876
dafc79fa 1877 MALLOC_UNBLOCK_INPUT;
e2984df0 1878
2e471eb5 1879 /* Probably not strictly necessary, but play it safe. */
72af86bd 1880 memset (s, 0, sizeof *s);
c0f51373 1881
2e471eb5
GM
1882 --total_free_strings;
1883 ++total_strings;
1884 ++strings_consed;
1885 consing_since_gc += sizeof *s;
c0f51373 1886
361b097f 1887#ifdef GC_CHECK_STRING_BYTES
e39a993c 1888 if (!noninteractive)
361b097f 1889 {
676a7251
GM
1890 if (++check_string_bytes_count == 200)
1891 {
1892 check_string_bytes_count = 0;
1893 check_string_bytes (1);
1894 }
1895 else
1896 check_string_bytes (0);
361b097f 1897 }
676a7251 1898#endif /* GC_CHECK_STRING_BYTES */
361b097f 1899
2e471eb5 1900 return s;
c0f51373 1901}
7146af97 1902
7146af97 1903
2e471eb5
GM
1904/* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
1905 plus a NUL byte at the end. Allocate an sdata structure for S, and
1906 set S->data to its `u.data' member. Store a NUL byte at the end of
1907 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
1908 S->data if it was initially non-null. */
7146af97 1909
2e471eb5 1910void
413d18e7
EZ
1911allocate_string_data (struct Lisp_String *s,
1912 EMACS_INT nchars, EMACS_INT nbytes)
7146af97 1913{
5c5fecb3 1914 struct sdata *data, *old_data;
2e471eb5 1915 struct sblock *b;
5c5fecb3 1916 int needed, old_nbytes;
7146af97 1917
2e471eb5
GM
1918 /* Determine the number of bytes needed to store NBYTES bytes
1919 of string data. */
1920 needed = SDATA_SIZE (nbytes);
e2984df0
CY
1921 old_data = s->data ? SDATA_OF_STRING (s) : NULL;
1922 old_nbytes = GC_STRING_BYTES (s);
1923
dafc79fa 1924 MALLOC_BLOCK_INPUT;
7146af97 1925
2e471eb5
GM
1926 if (nbytes > LARGE_STRING_BYTES)
1927 {
675d5130 1928 size_t size = sizeof *b - sizeof (struct sdata) + needed;
2e471eb5
GM
1929
1930#ifdef DOUG_LEA_MALLOC
f8608968
GM
1931 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
1932 because mapped region contents are not preserved in
d36b182f
DL
1933 a dumped Emacs.
1934
1935 In case you think of allowing it in a dumped Emacs at the
1936 cost of not being able to re-dump, there's another reason:
1937 mmap'ed data typically have an address towards the top of the
1938 address space, which won't fit into an EMACS_INT (at least on
1939 32-bit systems with the current tagging scheme). --fx */
2e471eb5
GM
1940 mallopt (M_MMAP_MAX, 0);
1941#endif
1942
212f33f1 1943 b = (struct sblock *) lisp_malloc (size + GC_STRING_EXTRA, MEM_TYPE_NON_LISP);
177c0ea7 1944
2e471eb5
GM
1945#ifdef DOUG_LEA_MALLOC
1946 /* Back to a reasonable maximum of mmap'ed areas. */
1947 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
1948#endif
177c0ea7 1949
2e471eb5
GM
1950 b->next_free = &b->first_data;
1951 b->first_data.string = NULL;
1952 b->next = large_sblocks;
1953 large_sblocks = b;
1954 }
1955 else if (current_sblock == NULL
1956 || (((char *) current_sblock + SBLOCK_SIZE
1957 - (char *) current_sblock->next_free)
212f33f1 1958 < (needed + GC_STRING_EXTRA)))
2e471eb5
GM
1959 {
1960 /* Not enough room in the current sblock. */
34400008 1961 b = (struct sblock *) lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP);
2e471eb5
GM
1962 b->next_free = &b->first_data;
1963 b->first_data.string = NULL;
1964 b->next = NULL;
1965
1966 if (current_sblock)
1967 current_sblock->next = b;
1968 else
1969 oldest_sblock = b;
1970 current_sblock = b;
1971 }
1972 else
1973 b = current_sblock;
5c5fecb3 1974
2e471eb5 1975 data = b->next_free;
a0b08700
CY
1976 b->next_free = (struct sdata *) ((char *) data + needed + GC_STRING_EXTRA);
1977
dafc79fa 1978 MALLOC_UNBLOCK_INPUT;
e2984df0 1979
2e471eb5 1980 data->string = s;
31d929e5
GM
1981 s->data = SDATA_DATA (data);
1982#ifdef GC_CHECK_STRING_BYTES
1983 SDATA_NBYTES (data) = nbytes;
1984#endif
2e471eb5
GM
1985 s->size = nchars;
1986 s->size_byte = nbytes;
1987 s->data[nbytes] = '\0';
212f33f1 1988#ifdef GC_CHECK_STRING_OVERRUN
72af86bd 1989 memcpy (data + needed, string_overrun_cookie, GC_STRING_OVERRUN_COOKIE_SIZE);
212f33f1 1990#endif
177c0ea7 1991
5c5fecb3
GM
1992 /* If S had already data assigned, mark that as free by setting its
1993 string back-pointer to null, and recording the size of the data
00c9c33c 1994 in it. */
5c5fecb3
GM
1995 if (old_data)
1996 {
31d929e5 1997 SDATA_NBYTES (old_data) = old_nbytes;
5c5fecb3
GM
1998 old_data->string = NULL;
1999 }
2000
2e471eb5
GM
2001 consing_since_gc += needed;
2002}
2003
2004
2005/* Sweep and compact strings. */
2006
2007static void
971de7fb 2008sweep_strings (void)
2e471eb5
GM
2009{
2010 struct string_block *b, *next;
2011 struct string_block *live_blocks = NULL;
177c0ea7 2012
2e471eb5
GM
2013 string_free_list = NULL;
2014 total_strings = total_free_strings = 0;
2015 total_string_size = 0;
2016
2017 /* Scan strings_blocks, free Lisp_Strings that aren't marked. */
2018 for (b = string_blocks; b; b = next)
2019 {
2020 int i, nfree = 0;
2021 struct Lisp_String *free_list_before = string_free_list;
2022
2023 next = b->next;
2024
19bcad1f 2025 for (i = 0; i < STRING_BLOCK_SIZE; ++i)
2e471eb5
GM
2026 {
2027 struct Lisp_String *s = b->strings + i;
2028
2029 if (s->data)
2030 {
2031 /* String was not on free-list before. */
2032 if (STRING_MARKED_P (s))
2033 {
2034 /* String is live; unmark it and its intervals. */
2035 UNMARK_STRING (s);
177c0ea7 2036
2e471eb5
GM
2037 if (!NULL_INTERVAL_P (s->intervals))
2038 UNMARK_BALANCE_INTERVALS (s->intervals);
2039
2040 ++total_strings;
2041 total_string_size += STRING_BYTES (s);
2042 }
2043 else
2044 {
2045 /* String is dead. Put it on the free-list. */
2046 struct sdata *data = SDATA_OF_STRING (s);
2047
2048 /* Save the size of S in its sdata so that we know
2049 how large that is. Reset the sdata's string
2050 back-pointer so that we know it's free. */
31d929e5
GM
2051#ifdef GC_CHECK_STRING_BYTES
2052 if (GC_STRING_BYTES (s) != SDATA_NBYTES (data))
2053 abort ();
2054#else
2e471eb5 2055 data->u.nbytes = GC_STRING_BYTES (s);
31d929e5 2056#endif
2e471eb5
GM
2057 data->string = NULL;
2058
2059 /* Reset the strings's `data' member so that we
2060 know it's free. */
2061 s->data = NULL;
2062
2063 /* Put the string on the free-list. */
2064 NEXT_FREE_LISP_STRING (s) = string_free_list;
2065 string_free_list = s;
2066 ++nfree;
2067 }
2068 }
2069 else
2070 {
2071 /* S was on the free-list before. Put it there again. */
2072 NEXT_FREE_LISP_STRING (s) = string_free_list;
2073 string_free_list = s;
2074 ++nfree;
2075 }
2076 }
2077
34400008 2078 /* Free blocks that contain free Lisp_Strings only, except
2e471eb5 2079 the first two of them. */
19bcad1f
SM
2080 if (nfree == STRING_BLOCK_SIZE
2081 && total_free_strings > STRING_BLOCK_SIZE)
2e471eb5
GM
2082 {
2083 lisp_free (b);
2084 --n_string_blocks;
2085 string_free_list = free_list_before;
2086 }
2087 else
2088 {
2089 total_free_strings += nfree;
2090 b->next = live_blocks;
2091 live_blocks = b;
2092 }
2093 }
2094
bdbed949 2095 check_string_free_list ();
212f33f1 2096
2e471eb5
GM
2097 string_blocks = live_blocks;
2098 free_large_strings ();
2099 compact_small_strings ();
212f33f1 2100
bdbed949 2101 check_string_free_list ();
2e471eb5
GM
2102}
2103
2104
2105/* Free dead large strings. */
2106
2107static void
971de7fb 2108free_large_strings (void)
2e471eb5
GM
2109{
2110 struct sblock *b, *next;
2111 struct sblock *live_blocks = NULL;
177c0ea7 2112
2e471eb5
GM
2113 for (b = large_sblocks; b; b = next)
2114 {
2115 next = b->next;
2116
2117 if (b->first_data.string == NULL)
2118 lisp_free (b);
2119 else
2120 {
2121 b->next = live_blocks;
2122 live_blocks = b;
2123 }
2124 }
2125
2126 large_sblocks = live_blocks;
2127}
2128
2129
2130/* Compact data of small strings. Free sblocks that don't contain
2131 data of live strings after compaction. */
2132
2133static void
971de7fb 2134compact_small_strings (void)
2e471eb5
GM
2135{
2136 struct sblock *b, *tb, *next;
2137 struct sdata *from, *to, *end, *tb_end;
2138 struct sdata *to_end, *from_end;
2139
2140 /* TB is the sblock we copy to, TO is the sdata within TB we copy
2141 to, and TB_END is the end of TB. */
2142 tb = oldest_sblock;
2143 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
2144 to = &tb->first_data;
2145
2146 /* Step through the blocks from the oldest to the youngest. We
2147 expect that old blocks will stabilize over time, so that less
2148 copying will happen this way. */
2149 for (b = oldest_sblock; b; b = b->next)
2150 {
2151 end = b->next_free;
2152 xassert ((char *) end <= (char *) b + SBLOCK_SIZE);
177c0ea7 2153
2e471eb5
GM
2154 for (from = &b->first_data; from < end; from = from_end)
2155 {
2156 /* Compute the next FROM here because copying below may
2157 overwrite data we need to compute it. */
2158 int nbytes;
2159
31d929e5
GM
2160#ifdef GC_CHECK_STRING_BYTES
2161 /* Check that the string size recorded in the string is the
2162 same as the one recorded in the sdata structure. */
2163 if (from->string
2164 && GC_STRING_BYTES (from->string) != SDATA_NBYTES (from))
2165 abort ();
2166#endif /* GC_CHECK_STRING_BYTES */
177c0ea7 2167
2e471eb5
GM
2168 if (from->string)
2169 nbytes = GC_STRING_BYTES (from->string);
2170 else
31d929e5 2171 nbytes = SDATA_NBYTES (from);
177c0ea7 2172
212f33f1
KS
2173 if (nbytes > LARGE_STRING_BYTES)
2174 abort ();
212f33f1 2175
2e471eb5 2176 nbytes = SDATA_SIZE (nbytes);
212f33f1
KS
2177 from_end = (struct sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
2178
2179#ifdef GC_CHECK_STRING_OVERRUN
72af86bd
AS
2180 if (memcmp (string_overrun_cookie,
2181 (char *) from_end - GC_STRING_OVERRUN_COOKIE_SIZE,
2182 GC_STRING_OVERRUN_COOKIE_SIZE))
212f33f1
KS
2183 abort ();
2184#endif
177c0ea7 2185
2e471eb5
GM
2186 /* FROM->string non-null means it's alive. Copy its data. */
2187 if (from->string)
2188 {
2189 /* If TB is full, proceed with the next sblock. */
212f33f1 2190 to_end = (struct sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5
GM
2191 if (to_end > tb_end)
2192 {
2193 tb->next_free = to;
2194 tb = tb->next;
2195 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
2196 to = &tb->first_data;
212f33f1 2197 to_end = (struct sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
2e471eb5 2198 }
177c0ea7 2199
2e471eb5
GM
2200 /* Copy, and update the string's `data' pointer. */
2201 if (from != to)
2202 {
a2407477 2203 xassert (tb != b || to <= from);
72af86bd 2204 memmove (to, from, nbytes + GC_STRING_EXTRA);
31d929e5 2205 to->string->data = SDATA_DATA (to);
2e471eb5
GM
2206 }
2207
2208 /* Advance past the sdata we copied to. */
2209 to = to_end;
2210 }
2211 }
2212 }
2213
2214 /* The rest of the sblocks following TB don't contain live data, so
2215 we can free them. */
2216 for (b = tb->next; b; b = next)
2217 {
2218 next = b->next;
2219 lisp_free (b);
2220 }
2221
2222 tb->next_free = to;
2223 tb->next = NULL;
2224 current_sblock = tb;
2225}
2226
2227
2228DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
69623621
RS
2229 doc: /* Return a newly created string of length LENGTH, with INIT in each element.
2230LENGTH must be an integer.
2231INIT must be an integer that represents a character. */)
5842a27b 2232 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2233{
2234 register Lisp_Object val;
2235 register unsigned char *p, *end;
2236 int c, nbytes;
2237
b7826503
PJ
2238 CHECK_NATNUM (length);
2239 CHECK_NUMBER (init);
2e471eb5
GM
2240
2241 c = XINT (init);
830ff83b 2242 if (ASCII_CHAR_P (c))
2e471eb5
GM
2243 {
2244 nbytes = XINT (length);
2245 val = make_uninit_string (nbytes);
d5db4077
KR
2246 p = SDATA (val);
2247 end = p + SCHARS (val);
2e471eb5
GM
2248 while (p != end)
2249 *p++ = c;
2250 }
2251 else
2252 {
d942b71c 2253 unsigned char str[MAX_MULTIBYTE_LENGTH];
2e471eb5
GM
2254 int len = CHAR_STRING (c, str);
2255
2256 nbytes = len * XINT (length);
2257 val = make_uninit_multibyte_string (XINT (length), nbytes);
d5db4077 2258 p = SDATA (val);
2e471eb5
GM
2259 end = p + nbytes;
2260 while (p != end)
2261 {
72af86bd 2262 memcpy (p, str, len);
2e471eb5
GM
2263 p += len;
2264 }
2265 }
177c0ea7 2266
2e471eb5
GM
2267 *p = 0;
2268 return val;
2269}
2270
2271
2272DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
909e3b33 2273 doc: /* Return a new bool-vector of length LENGTH, using INIT for each element.
7ee72033 2274LENGTH must be a number. INIT matters only in whether it is t or nil. */)
5842a27b 2275 (Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2276{
2277 register Lisp_Object val;
2278 struct Lisp_Bool_Vector *p;
2279 int real_init, i;
2280 int length_in_chars, length_in_elts, bits_per_value;
2281
b7826503 2282 CHECK_NATNUM (length);
2e471eb5 2283
a097329f 2284 bits_per_value = sizeof (EMACS_INT) * BOOL_VECTOR_BITS_PER_CHAR;
2e471eb5
GM
2285
2286 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
a097329f
AS
2287 length_in_chars = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
2288 / BOOL_VECTOR_BITS_PER_CHAR);
2e471eb5
GM
2289
2290 /* We must allocate one more elements than LENGTH_IN_ELTS for the
2291 slot `size' of the struct Lisp_Bool_Vector. */
2292 val = Fmake_vector (make_number (length_in_elts + 1), Qnil);
177c0ea7 2293
2e471eb5 2294 /* Get rid of any bits that would cause confusion. */
d2029e5b 2295 XVECTOR (val)->size = 0; /* No Lisp_Object to trace in there. */
d0fdb6da 2296 /* Use XVECTOR (val) rather than `p' because p->size is not TRT. */
d2029e5b
SM
2297 XSETPVECTYPE (XVECTOR (val), PVEC_BOOL_VECTOR);
2298
2299 p = XBOOL_VECTOR (val);
2e471eb5 2300 p->size = XFASTINT (length);
177c0ea7 2301
2e471eb5
GM
2302 real_init = (NILP (init) ? 0 : -1);
2303 for (i = 0; i < length_in_chars ; i++)
2304 p->data[i] = real_init;
177c0ea7 2305
2e471eb5 2306 /* Clear the extraneous bits in the last byte. */
a097329f 2307 if (XINT (length) != length_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
d2029e5b 2308 p->data[length_in_chars - 1]
a097329f 2309 &= (1 << (XINT (length) % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
2e471eb5
GM
2310
2311 return val;
2312}
2313
2314
2315/* Make a string from NBYTES bytes at CONTENTS, and compute the number
2316 of characters from the contents. This string may be unibyte or
2317 multibyte, depending on the contents. */
2318
2319Lisp_Object
971de7fb 2320make_string (const char *contents, int nbytes)
2e471eb5
GM
2321{
2322 register Lisp_Object val;
9eac9d59
KH
2323 int nchars, multibyte_nbytes;
2324
2325 parse_str_as_multibyte (contents, nbytes, &nchars, &multibyte_nbytes);
9eac9d59
KH
2326 if (nbytes == nchars || nbytes != multibyte_nbytes)
2327 /* CONTENTS contains no multibyte sequences or contains an invalid
2328 multibyte sequence. We must make unibyte string. */
495a6df3
KH
2329 val = make_unibyte_string (contents, nbytes);
2330 else
2331 val = make_multibyte_string (contents, nchars, nbytes);
2e471eb5
GM
2332 return val;
2333}
2334
2335
2336/* Make an unibyte string from LENGTH bytes at CONTENTS. */
2337
2338Lisp_Object
971de7fb 2339make_unibyte_string (const char *contents, int length)
2e471eb5
GM
2340{
2341 register Lisp_Object val;
2342 val = make_uninit_string (length);
72af86bd 2343 memcpy (SDATA (val), contents, length);
d5db4077 2344 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2345 return val;
2346}
2347
2348
2349/* Make a multibyte string from NCHARS characters occupying NBYTES
2350 bytes at CONTENTS. */
2351
2352Lisp_Object
971de7fb 2353make_multibyte_string (const char *contents, int nchars, int nbytes)
2e471eb5
GM
2354{
2355 register Lisp_Object val;
2356 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2357 memcpy (SDATA (val), contents, nbytes);
2e471eb5
GM
2358 return val;
2359}
2360
2361
2362/* Make a string from NCHARS characters occupying NBYTES bytes at
2363 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
2364
2365Lisp_Object
971de7fb 2366make_string_from_bytes (const char *contents, int nchars, int nbytes)
2e471eb5
GM
2367{
2368 register Lisp_Object val;
2369 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2370 memcpy (SDATA (val), contents, nbytes);
d5db4077
KR
2371 if (SBYTES (val) == SCHARS (val))
2372 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2373 return val;
2374}
2375
2376
2377/* Make a string from NCHARS characters occupying NBYTES bytes at
2378 CONTENTS. The argument MULTIBYTE controls whether to label the
229b28c4
KH
2379 string as multibyte. If NCHARS is negative, it counts the number of
2380 characters by itself. */
2e471eb5
GM
2381
2382Lisp_Object
971de7fb 2383make_specified_string (const char *contents, int nchars, int nbytes, int multibyte)
2e471eb5
GM
2384{
2385 register Lisp_Object val;
229b28c4
KH
2386
2387 if (nchars < 0)
2388 {
2389 if (multibyte)
2390 nchars = multibyte_chars_in_text (contents, nbytes);
2391 else
2392 nchars = nbytes;
2393 }
2e471eb5 2394 val = make_uninit_multibyte_string (nchars, nbytes);
72af86bd 2395 memcpy (SDATA (val), contents, nbytes);
2e471eb5 2396 if (!multibyte)
d5db4077 2397 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2398 return val;
2399}
2400
2401
2402/* Make a string from the data at STR, treating it as multibyte if the
2403 data warrants. */
2404
2405Lisp_Object
971de7fb 2406build_string (const char *str)
2e471eb5
GM
2407{
2408 return make_string (str, strlen (str));
2409}
2410
2411
2412/* Return an unibyte Lisp_String set up to hold LENGTH characters
2413 occupying LENGTH bytes. */
2414
2415Lisp_Object
413d18e7 2416make_uninit_string (EMACS_INT length)
2e471eb5
GM
2417{
2418 Lisp_Object val;
4d774b0f
JB
2419
2420 if (!length)
2421 return empty_unibyte_string;
2e471eb5 2422 val = make_uninit_multibyte_string (length, length);
d5db4077 2423 STRING_SET_UNIBYTE (val);
2e471eb5
GM
2424 return val;
2425}
2426
2427
2428/* Return a multibyte Lisp_String set up to hold NCHARS characters
2429 which occupy NBYTES bytes. */
2430
2431Lisp_Object
413d18e7 2432make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
2e471eb5
GM
2433{
2434 Lisp_Object string;
2435 struct Lisp_String *s;
2436
2437 if (nchars < 0)
2438 abort ();
4d774b0f
JB
2439 if (!nbytes)
2440 return empty_multibyte_string;
2e471eb5
GM
2441
2442 s = allocate_string ();
2443 allocate_string_data (s, nchars, nbytes);
2444 XSETSTRING (string, s);
2445 string_chars_consed += nbytes;
2446 return string;
2447}
2448
2449
2450\f
2451/***********************************************************************
2452 Float Allocation
2453 ***********************************************************************/
2454
2e471eb5
GM
2455/* We store float cells inside of float_blocks, allocating a new
2456 float_block with malloc whenever necessary. Float cells reclaimed
2457 by GC are put on a free list to be reallocated before allocating
ab6780cd 2458 any new float cells from the latest float_block. */
2e471eb5 2459
6b61353c
KH
2460#define FLOAT_BLOCK_SIZE \
2461 (((BLOCK_BYTES - sizeof (struct float_block *) \
2462 /* The compiler might add padding at the end. */ \
2463 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
ab6780cd
SM
2464 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2465
2466#define GETMARKBIT(block,n) \
2467 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2468 >> ((n) % (sizeof(int) * CHAR_BIT))) \
2469 & 1)
2470
2471#define SETMARKBIT(block,n) \
2472 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2473 |= 1 << ((n) % (sizeof(int) * CHAR_BIT))
2474
2475#define UNSETMARKBIT(block,n) \
2476 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
2477 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT)))
2478
2479#define FLOAT_BLOCK(fptr) \
2480 ((struct float_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1)))
2481
2482#define FLOAT_INDEX(fptr) \
2483 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float))
2e471eb5
GM
2484
2485struct float_block
2486{
ab6780cd 2487 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */
2e471eb5 2488 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
ab6780cd
SM
2489 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
2490 struct float_block *next;
2e471eb5
GM
2491};
2492
ab6780cd
SM
2493#define FLOAT_MARKED_P(fptr) \
2494 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2495
2496#define FLOAT_MARK(fptr) \
2497 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2498
2499#define FLOAT_UNMARK(fptr) \
2500 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
2501
34400008
GM
2502/* Current float_block. */
2503
2e471eb5 2504struct float_block *float_block;
34400008
GM
2505
2506/* Index of first unused Lisp_Float in the current float_block. */
2507
2e471eb5
GM
2508int float_block_index;
2509
2510/* Total number of float blocks now in use. */
2511
2512int n_float_blocks;
2513
34400008
GM
2514/* Free-list of Lisp_Floats. */
2515
2e471eb5
GM
2516struct Lisp_Float *float_free_list;
2517
34400008 2518
966533c9 2519/* Initialize float allocation. */
34400008 2520
d3d47262 2521static void
971de7fb 2522init_float (void)
2e471eb5 2523{
08b7c2cb
SM
2524 float_block = NULL;
2525 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */
2e471eb5 2526 float_free_list = 0;
08b7c2cb 2527 n_float_blocks = 0;
2e471eb5
GM
2528}
2529
34400008 2530
34400008
GM
2531/* Return a new float object with value FLOAT_VALUE. */
2532
2e471eb5 2533Lisp_Object
971de7fb 2534make_float (double float_value)
2e471eb5
GM
2535{
2536 register Lisp_Object val;
2537
e2984df0
CY
2538 /* eassert (!handling_signal); */
2539
dafc79fa 2540 MALLOC_BLOCK_INPUT;
cfb2f32e 2541
2e471eb5
GM
2542 if (float_free_list)
2543 {
2544 /* We use the data field for chaining the free list
2545 so that we won't use the same field that has the mark bit. */
2546 XSETFLOAT (val, float_free_list);
28a099a4 2547 float_free_list = float_free_list->u.chain;
2e471eb5
GM
2548 }
2549 else
2550 {
2551 if (float_block_index == FLOAT_BLOCK_SIZE)
2552 {
2553 register struct float_block *new;
2554
ab6780cd
SM
2555 new = (struct float_block *) lisp_align_malloc (sizeof *new,
2556 MEM_TYPE_FLOAT);
2e471eb5 2557 new->next = float_block;
72af86bd 2558 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2559 float_block = new;
2560 float_block_index = 0;
2561 n_float_blocks++;
2562 }
6b61353c
KH
2563 XSETFLOAT (val, &float_block->floats[float_block_index]);
2564 float_block_index++;
2e471eb5 2565 }
177c0ea7 2566
dafc79fa 2567 MALLOC_UNBLOCK_INPUT;
e2984df0 2568
f601cdf3 2569 XFLOAT_INIT (val, float_value);
6b61353c 2570 eassert (!FLOAT_MARKED_P (XFLOAT (val)));
2e471eb5
GM
2571 consing_since_gc += sizeof (struct Lisp_Float);
2572 floats_consed++;
2573 return val;
2574}
2575
2e471eb5
GM
2576
2577\f
2578/***********************************************************************
2579 Cons Allocation
2580 ***********************************************************************/
2581
2582/* We store cons cells inside of cons_blocks, allocating a new
2583 cons_block with malloc whenever necessary. Cons cells reclaimed by
2584 GC are put on a free list to be reallocated before allocating
08b7c2cb 2585 any new cons cells from the latest cons_block. */
2e471eb5
GM
2586
2587#define CONS_BLOCK_SIZE \
08b7c2cb
SM
2588 (((BLOCK_BYTES - sizeof (struct cons_block *)) * CHAR_BIT) \
2589 / (sizeof (struct Lisp_Cons) * CHAR_BIT + 1))
2590
2591#define CONS_BLOCK(fptr) \
2592 ((struct cons_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1)))
2593
2594#define CONS_INDEX(fptr) \
2595 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons))
2e471eb5
GM
2596
2597struct cons_block
2598{
08b7c2cb 2599 /* Place `conses' at the beginning, to ease up CONS_INDEX's job. */
2e471eb5 2600 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
08b7c2cb
SM
2601 int gcmarkbits[1 + CONS_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
2602 struct cons_block *next;
2e471eb5
GM
2603};
2604
08b7c2cb
SM
2605#define CONS_MARKED_P(fptr) \
2606 GETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2607
2608#define CONS_MARK(fptr) \
2609 SETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2610
2611#define CONS_UNMARK(fptr) \
2612 UNSETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
2613
34400008
GM
2614/* Current cons_block. */
2615
2e471eb5 2616struct cons_block *cons_block;
34400008
GM
2617
2618/* Index of first unused Lisp_Cons in the current block. */
2619
2e471eb5
GM
2620int cons_block_index;
2621
34400008
GM
2622/* Free-list of Lisp_Cons structures. */
2623
2e471eb5
GM
2624struct Lisp_Cons *cons_free_list;
2625
2626/* Total number of cons blocks now in use. */
2627
d3d47262 2628static int n_cons_blocks;
2e471eb5 2629
34400008
GM
2630
2631/* Initialize cons allocation. */
2632
d3d47262 2633static void
971de7fb 2634init_cons (void)
2e471eb5 2635{
08b7c2cb
SM
2636 cons_block = NULL;
2637 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */
2e471eb5 2638 cons_free_list = 0;
08b7c2cb 2639 n_cons_blocks = 0;
2e471eb5
GM
2640}
2641
34400008
GM
2642
2643/* Explicitly free a cons cell by putting it on the free-list. */
2e471eb5
GM
2644
2645void
971de7fb 2646free_cons (struct Lisp_Cons *ptr)
2e471eb5 2647{
28a099a4 2648 ptr->u.chain = cons_free_list;
34400008
GM
2649#if GC_MARK_STACK
2650 ptr->car = Vdead;
2651#endif
2e471eb5
GM
2652 cons_free_list = ptr;
2653}
2654
2655DEFUN ("cons", Fcons, Scons, 2, 2, 0,
a6266d23 2656 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
5842a27b 2657 (Lisp_Object car, Lisp_Object cdr)
2e471eb5
GM
2658{
2659 register Lisp_Object val;
2660
e2984df0
CY
2661 /* eassert (!handling_signal); */
2662
dafc79fa 2663 MALLOC_BLOCK_INPUT;
cfb2f32e 2664
2e471eb5
GM
2665 if (cons_free_list)
2666 {
2667 /* We use the cdr for chaining the free list
2668 so that we won't use the same field that has the mark bit. */
2669 XSETCONS (val, cons_free_list);
28a099a4 2670 cons_free_list = cons_free_list->u.chain;
2e471eb5
GM
2671 }
2672 else
2673 {
2674 if (cons_block_index == CONS_BLOCK_SIZE)
2675 {
2676 register struct cons_block *new;
08b7c2cb
SM
2677 new = (struct cons_block *) lisp_align_malloc (sizeof *new,
2678 MEM_TYPE_CONS);
72af86bd 2679 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
2e471eb5
GM
2680 new->next = cons_block;
2681 cons_block = new;
2682 cons_block_index = 0;
2683 n_cons_blocks++;
2684 }
6b61353c
KH
2685 XSETCONS (val, &cons_block->conses[cons_block_index]);
2686 cons_block_index++;
2e471eb5 2687 }
177c0ea7 2688
dafc79fa 2689 MALLOC_UNBLOCK_INPUT;
e2984df0 2690
f3fbd155
KR
2691 XSETCAR (val, car);
2692 XSETCDR (val, cdr);
6b61353c 2693 eassert (!CONS_MARKED_P (XCONS (val)));
2e471eb5
GM
2694 consing_since_gc += sizeof (struct Lisp_Cons);
2695 cons_cells_consed++;
2696 return val;
2697}
2698
e3e56238
RS
2699/* Get an error now if there's any junk in the cons free list. */
2700void
971de7fb 2701check_cons_list (void)
e3e56238 2702{
212f33f1 2703#ifdef GC_CHECK_CONS_LIST
e3e56238
RS
2704 struct Lisp_Cons *tail = cons_free_list;
2705
e3e56238 2706 while (tail)
28a099a4 2707 tail = tail->u.chain;
e3e56238
RS
2708#endif
2709}
34400008 2710
9b306d37
KS
2711/* Make a list of 1, 2, 3, 4 or 5 specified objects. */
2712
2713Lisp_Object
971de7fb 2714list1 (Lisp_Object arg1)
9b306d37
KS
2715{
2716 return Fcons (arg1, Qnil);
2717}
2e471eb5
GM
2718
2719Lisp_Object
971de7fb 2720list2 (Lisp_Object arg1, Lisp_Object arg2)
2e471eb5
GM
2721{
2722 return Fcons (arg1, Fcons (arg2, Qnil));
2723}
2724
34400008 2725
2e471eb5 2726Lisp_Object
971de7fb 2727list3 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
2e471eb5
GM
2728{
2729 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
2730}
2731
34400008 2732
2e471eb5 2733Lisp_Object
971de7fb 2734list4 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4)
2e471eb5
GM
2735{
2736 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
2737}
2738
34400008 2739
2e471eb5 2740Lisp_Object
971de7fb 2741list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
2e471eb5
GM
2742{
2743 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
2744 Fcons (arg5, Qnil)))));
2745}
2746
34400008 2747
2e471eb5 2748DEFUN ("list", Flist, Slist, 0, MANY, 0,
eae936e2 2749 doc: /* Return a newly created list with specified arguments as elements.
ae8e8122
MB
2750Any number of arguments, even zero arguments, are allowed.
2751usage: (list &rest OBJECTS) */)
5842a27b 2752 (int nargs, register Lisp_Object *args)
2e471eb5
GM
2753{
2754 register Lisp_Object val;
2755 val = Qnil;
2756
2757 while (nargs > 0)
2758 {
2759 nargs--;
2760 val = Fcons (args[nargs], val);
2761 }
2762 return val;
2763}
2764
34400008 2765
2e471eb5 2766DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
a6266d23 2767 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
5842a27b 2768 (register Lisp_Object length, Lisp_Object init)
2e471eb5
GM
2769{
2770 register Lisp_Object val;
2771 register int size;
2772
b7826503 2773 CHECK_NATNUM (length);
2e471eb5
GM
2774 size = XFASTINT (length);
2775
2776 val = Qnil;
ce070307
GM
2777 while (size > 0)
2778 {
2779 val = Fcons (init, val);
2780 --size;
2781
2782 if (size > 0)
2783 {
2784 val = Fcons (init, val);
2785 --size;
177c0ea7 2786
ce070307
GM
2787 if (size > 0)
2788 {
2789 val = Fcons (init, val);
2790 --size;
177c0ea7 2791
ce070307
GM
2792 if (size > 0)
2793 {
2794 val = Fcons (init, val);
2795 --size;
177c0ea7 2796
ce070307
GM
2797 if (size > 0)
2798 {
2799 val = Fcons (init, val);
2800 --size;
2801 }
2802 }
2803 }
2804 }
2805
2806 QUIT;
2807 }
177c0ea7 2808
7146af97
JB
2809 return val;
2810}
2e471eb5
GM
2811
2812
7146af97 2813\f
2e471eb5
GM
2814/***********************************************************************
2815 Vector Allocation
2816 ***********************************************************************/
7146af97 2817
34400008
GM
2818/* Singly-linked list of all vectors. */
2819
d3d47262 2820static struct Lisp_Vector *all_vectors;
7146af97 2821
2e471eb5
GM
2822/* Total number of vector-like objects now in use. */
2823
d3d47262 2824static int n_vectors;
c8099634 2825
34400008
GM
2826
2827/* Value is a pointer to a newly allocated Lisp_Vector structure
2828 with room for LEN Lisp_Objects. */
2829
ece93c02 2830static struct Lisp_Vector *
971de7fb 2831allocate_vectorlike (EMACS_INT len)
1825c68d
KH
2832{
2833 struct Lisp_Vector *p;
675d5130 2834 size_t nbytes;
1825c68d 2835
dafc79fa
SM
2836 MALLOC_BLOCK_INPUT;
2837
d1658221 2838#ifdef DOUG_LEA_MALLOC
f8608968
GM
2839 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
2840 because mapped region contents are not preserved in
2841 a dumped Emacs. */
d1658221
RS
2842 mallopt (M_MMAP_MAX, 0);
2843#endif
177c0ea7 2844
cfb2f32e
SM
2845 /* This gets triggered by code which I haven't bothered to fix. --Stef */
2846 /* eassert (!handling_signal); */
2847
34400008 2848 nbytes = sizeof *p + (len - 1) * sizeof p->contents[0];
9c545a55 2849 p = (struct Lisp_Vector *) lisp_malloc (nbytes, MEM_TYPE_VECTORLIKE);
177c0ea7 2850
d1658221 2851#ifdef DOUG_LEA_MALLOC
34400008 2852 /* Back to a reasonable maximum of mmap'ed areas. */
81d492d5 2853 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
d1658221 2854#endif
177c0ea7 2855
34400008 2856 consing_since_gc += nbytes;
310ea200 2857 vector_cells_consed += len;
1825c68d
KH
2858
2859 p->next = all_vectors;
2860 all_vectors = p;
e2984df0 2861
dafc79fa 2862 MALLOC_UNBLOCK_INPUT;
e2984df0 2863
34400008 2864 ++n_vectors;
1825c68d
KH
2865 return p;
2866}
2867
34400008 2868
ece93c02
GM
2869/* Allocate a vector with NSLOTS slots. */
2870
2871struct Lisp_Vector *
971de7fb 2872allocate_vector (EMACS_INT nslots)
ece93c02 2873{
9c545a55 2874 struct Lisp_Vector *v = allocate_vectorlike (nslots);
ece93c02
GM
2875 v->size = nslots;
2876 return v;
2877}
2878
2879
2880/* Allocate other vector-like structures. */
2881
30f95089 2882struct Lisp_Vector *
971de7fb 2883allocate_pseudovector (int memlen, int lisplen, EMACS_INT tag)
ece93c02 2884{
d2029e5b 2885 struct Lisp_Vector *v = allocate_vectorlike (memlen);
ece93c02 2886 EMACS_INT i;
177c0ea7 2887
d2029e5b
SM
2888 /* Only the first lisplen slots will be traced normally by the GC. */
2889 v->size = lisplen;
2890 for (i = 0; i < lisplen; ++i)
ece93c02 2891 v->contents[i] = Qnil;
177c0ea7 2892
d2029e5b
SM
2893 XSETPVECTYPE (v, tag); /* Add the appropriate tag. */
2894 return v;
2895}
d2029e5b 2896
ece93c02 2897struct Lisp_Hash_Table *
878f97ff 2898allocate_hash_table (void)
ece93c02 2899{
878f97ff 2900 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
ece93c02
GM
2901}
2902
2903
2904struct window *
971de7fb 2905allocate_window (void)
ece93c02 2906{
d2029e5b 2907 return ALLOCATE_PSEUDOVECTOR(struct window, current_matrix, PVEC_WINDOW);
ece93c02 2908}
177c0ea7 2909
177c0ea7 2910
4a729fd8 2911struct terminal *
971de7fb 2912allocate_terminal (void)
4a729fd8 2913{
d2029e5b
SM
2914 struct terminal *t = ALLOCATE_PSEUDOVECTOR (struct terminal,
2915 next_terminal, PVEC_TERMINAL);
2916 /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
72af86bd
AS
2917 memset (&t->next_terminal, 0,
2918 (char*) (t + 1) - (char*) &t->next_terminal);
ece93c02 2919
d2029e5b 2920 return t;
4a729fd8 2921}
ece93c02
GM
2922
2923struct frame *
971de7fb 2924allocate_frame (void)
ece93c02 2925{
d2029e5b
SM
2926 struct frame *f = ALLOCATE_PSEUDOVECTOR (struct frame,
2927 face_cache, PVEC_FRAME);
2928 /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
72af86bd
AS
2929 memset (&f->face_cache, 0,
2930 (char *) (f + 1) - (char *) &f->face_cache);
d2029e5b 2931 return f;
ece93c02
GM
2932}
2933
2934
2935struct Lisp_Process *
971de7fb 2936allocate_process (void)
ece93c02 2937{
d2029e5b 2938 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
ece93c02
GM
2939}
2940
2941
7146af97 2942DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
a6266d23 2943 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
7ee72033 2944See also the function `vector'. */)
5842a27b 2945 (register Lisp_Object length, Lisp_Object init)
7146af97 2946{
1825c68d
KH
2947 Lisp_Object vector;
2948 register EMACS_INT sizei;
2949 register int index;
7146af97
JB
2950 register struct Lisp_Vector *p;
2951
b7826503 2952 CHECK_NATNUM (length);
c9dad5ed 2953 sizei = XFASTINT (length);
7146af97 2954
ece93c02 2955 p = allocate_vector (sizei);
7146af97
JB
2956 for (index = 0; index < sizei; index++)
2957 p->contents[index] = init;
2958
1825c68d 2959 XSETVECTOR (vector, p);
7146af97
JB
2960 return vector;
2961}
2962
34400008 2963
7146af97 2964DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
eae936e2 2965 doc: /* Return a newly created vector with specified arguments as elements.
ae8e8122
MB
2966Any number of arguments, even zero arguments, are allowed.
2967usage: (vector &rest OBJECTS) */)
5842a27b 2968 (register int nargs, Lisp_Object *args)
7146af97
JB
2969{
2970 register Lisp_Object len, val;
2971 register int index;
2972 register struct Lisp_Vector *p;
2973
67ba9986 2974 XSETFASTINT (len, nargs);
7146af97
JB
2975 val = Fmake_vector (len, Qnil);
2976 p = XVECTOR (val);
2977 for (index = 0; index < nargs; index++)
2978 p->contents[index] = args[index];
2979 return val;
2980}
2981
34400008 2982
7146af97 2983DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
a6266d23 2984 doc: /* Create a byte-code object with specified arguments as elements.
228299fa
GM
2985The arguments should be the arglist, bytecode-string, constant vector,
2986stack size, (optional) doc string, and (optional) interactive spec.
2987The first four arguments are required; at most six have any
ae8e8122 2988significance.
92cc28b2 2989usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
5842a27b 2990 (register int nargs, Lisp_Object *args)
7146af97
JB
2991{
2992 register Lisp_Object len, val;
2993 register int index;
2994 register struct Lisp_Vector *p;
2995
67ba9986 2996 XSETFASTINT (len, nargs);
265a9e55 2997 if (!NILP (Vpurify_flag))
5a053ea9 2998 val = make_pure_vector ((EMACS_INT) nargs);
7146af97
JB
2999 else
3000 val = Fmake_vector (len, Qnil);
9eac9d59 3001
b1feb9b4 3002 if (nargs > 1 && STRINGP (args[1]) && STRING_MULTIBYTE (args[1]))
9eac9d59
KH
3003 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
3004 earlier because they produced a raw 8-bit string for byte-code
3005 and now such a byte-code string is loaded as multibyte while
3006 raw 8-bit characters converted to multibyte form. Thus, now we
3007 must convert them back to the original unibyte form. */
3008 args[1] = Fstring_as_unibyte (args[1]);
3009
7146af97
JB
3010 p = XVECTOR (val);
3011 for (index = 0; index < nargs; index++)
3012 {
265a9e55 3013 if (!NILP (Vpurify_flag))
7146af97
JB
3014 args[index] = Fpurecopy (args[index]);
3015 p->contents[index] = args[index];
3016 }
d2029e5b 3017 XSETPVECTYPE (p, PVEC_COMPILED);
50aee051 3018 XSETCOMPILED (val, p);
7146af97
JB
3019 return val;
3020}
2e471eb5 3021
34400008 3022
7146af97 3023\f
2e471eb5
GM
3024/***********************************************************************
3025 Symbol Allocation
3026 ***********************************************************************/
7146af97 3027
2e471eb5
GM
3028/* Each symbol_block is just under 1020 bytes long, since malloc
3029 really allocates in units of powers of two and uses 4 bytes for its
3030 own overhead. */
7146af97
JB
3031
3032#define SYMBOL_BLOCK_SIZE \
3033 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
3034
3035struct symbol_block
2e471eb5 3036{
6b61353c 3037 /* Place `symbols' first, to preserve alignment. */
2e471eb5 3038 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
6b61353c 3039 struct symbol_block *next;
2e471eb5 3040};
7146af97 3041
34400008
GM
3042/* Current symbol block and index of first unused Lisp_Symbol
3043 structure in it. */
3044
d3d47262
JB
3045static struct symbol_block *symbol_block;
3046static int symbol_block_index;
7146af97 3047
34400008
GM
3048/* List of free symbols. */
3049
d3d47262 3050static struct Lisp_Symbol *symbol_free_list;
7146af97 3051
c8099634 3052/* Total number of symbol blocks now in use. */
2e471eb5 3053
d3d47262 3054static int n_symbol_blocks;
c8099634 3055
34400008
GM
3056
3057/* Initialize symbol allocation. */
3058
d3d47262 3059static void
971de7fb 3060init_symbol (void)
7146af97 3061{
005ca5c7
DL
3062 symbol_block = NULL;
3063 symbol_block_index = SYMBOL_BLOCK_SIZE;
7146af97 3064 symbol_free_list = 0;
005ca5c7 3065 n_symbol_blocks = 0;
7146af97
JB
3066}
3067
34400008 3068
7146af97 3069DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
a6266d23 3070 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
7ee72033 3071Its value and function definition are void, and its property list is nil. */)
5842a27b 3072 (Lisp_Object name)
7146af97
JB
3073{
3074 register Lisp_Object val;
3075 register struct Lisp_Symbol *p;
3076
b7826503 3077 CHECK_STRING (name);
7146af97 3078
537407f0 3079 /* eassert (!handling_signal); */
cfb2f32e 3080
dafc79fa 3081 MALLOC_BLOCK_INPUT;
e2984df0 3082
7146af97
JB
3083 if (symbol_free_list)
3084 {
45d12a89 3085 XSETSYMBOL (val, symbol_free_list);
28a099a4 3086 symbol_free_list = symbol_free_list->next;
7146af97
JB
3087 }
3088 else
3089 {
3090 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
3091 {
3c06d205 3092 struct symbol_block *new;
34400008
GM
3093 new = (struct symbol_block *) lisp_malloc (sizeof *new,
3094 MEM_TYPE_SYMBOL);
7146af97
JB
3095 new->next = symbol_block;
3096 symbol_block = new;
3097 symbol_block_index = 0;
c8099634 3098 n_symbol_blocks++;
7146af97 3099 }
6b61353c
KH
3100 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index]);
3101 symbol_block_index++;
7146af97 3102 }
177c0ea7 3103
dafc79fa 3104 MALLOC_UNBLOCK_INPUT;
e2984df0 3105
7146af97 3106 p = XSYMBOL (val);
8fe5665d 3107 p->xname = name;
7146af97 3108 p->plist = Qnil;
ce5b453a
SM
3109 p->redirect = SYMBOL_PLAINVAL;
3110 SET_SYMBOL_VAL (p, Qunbound);
2e471eb5 3111 p->function = Qunbound;
9e713715 3112 p->next = NULL;
2336fe58 3113 p->gcmarkbit = 0;
9e713715
GM
3114 p->interned = SYMBOL_UNINTERNED;
3115 p->constant = 0;
2e471eb5
GM
3116 consing_since_gc += sizeof (struct Lisp_Symbol);
3117 symbols_consed++;
7146af97
JB
3118 return val;
3119}
3120
3f25e183 3121
2e471eb5
GM
3122\f
3123/***********************************************************************
34400008 3124 Marker (Misc) Allocation
2e471eb5 3125 ***********************************************************************/
3f25e183 3126
2e471eb5
GM
3127/* Allocation of markers and other objects that share that structure.
3128 Works like allocation of conses. */
c0696668 3129
2e471eb5
GM
3130#define MARKER_BLOCK_SIZE \
3131 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
3132
3133struct marker_block
c0696668 3134{
6b61353c 3135 /* Place `markers' first, to preserve alignment. */
2e471eb5 3136 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
6b61353c 3137 struct marker_block *next;
2e471eb5 3138};
c0696668 3139
d3d47262
JB
3140static struct marker_block *marker_block;
3141static int marker_block_index;
c0696668 3142
d3d47262 3143static union Lisp_Misc *marker_free_list;
c0696668 3144
2e471eb5 3145/* Total number of marker blocks now in use. */
3f25e183 3146
d3d47262 3147static int n_marker_blocks;
2e471eb5 3148
d3d47262 3149static void
971de7fb 3150init_marker (void)
3f25e183 3151{
005ca5c7
DL
3152 marker_block = NULL;
3153 marker_block_index = MARKER_BLOCK_SIZE;
2e471eb5 3154 marker_free_list = 0;
005ca5c7 3155 n_marker_blocks = 0;
3f25e183
RS
3156}
3157
2e471eb5
GM
3158/* Return a newly allocated Lisp_Misc object, with no substructure. */
3159
3f25e183 3160Lisp_Object
971de7fb 3161allocate_misc (void)
7146af97 3162{
2e471eb5 3163 Lisp_Object val;
7146af97 3164
e2984df0
CY
3165 /* eassert (!handling_signal); */
3166
dafc79fa 3167 MALLOC_BLOCK_INPUT;
cfb2f32e 3168
2e471eb5 3169 if (marker_free_list)
7146af97 3170 {
2e471eb5
GM
3171 XSETMISC (val, marker_free_list);
3172 marker_free_list = marker_free_list->u_free.chain;
7146af97
JB
3173 }
3174 else
7146af97 3175 {
2e471eb5
GM
3176 if (marker_block_index == MARKER_BLOCK_SIZE)
3177 {
3178 struct marker_block *new;
34400008
GM
3179 new = (struct marker_block *) lisp_malloc (sizeof *new,
3180 MEM_TYPE_MISC);
2e471eb5
GM
3181 new->next = marker_block;
3182 marker_block = new;
3183 marker_block_index = 0;
3184 n_marker_blocks++;
7b7990cc 3185 total_free_markers += MARKER_BLOCK_SIZE;
2e471eb5 3186 }
6b61353c
KH
3187 XSETMISC (val, &marker_block->markers[marker_block_index]);
3188 marker_block_index++;
7146af97 3189 }
177c0ea7 3190
dafc79fa 3191 MALLOC_UNBLOCK_INPUT;
e2984df0 3192
7b7990cc 3193 --total_free_markers;
2e471eb5
GM
3194 consing_since_gc += sizeof (union Lisp_Misc);
3195 misc_objects_consed++;
67ee9f6e 3196 XMISCANY (val)->gcmarkbit = 0;
2e471eb5
GM
3197 return val;
3198}
3199
7b7990cc
KS
3200/* Free a Lisp_Misc object */
3201
3202void
971de7fb 3203free_misc (Lisp_Object misc)
7b7990cc 3204{
d314756e 3205 XMISCTYPE (misc) = Lisp_Misc_Free;
7b7990cc
KS
3206 XMISC (misc)->u_free.chain = marker_free_list;
3207 marker_free_list = XMISC (misc);
3208
3209 total_free_markers++;
3210}
3211
42172a6b
RS
3212/* Return a Lisp_Misc_Save_Value object containing POINTER and
3213 INTEGER. This is used to package C values to call record_unwind_protect.
3214 The unwind function can get the C values back using XSAVE_VALUE. */
3215
3216Lisp_Object
971de7fb 3217make_save_value (void *pointer, int integer)
42172a6b
RS
3218{
3219 register Lisp_Object val;
3220 register struct Lisp_Save_Value *p;
3221
3222 val = allocate_misc ();
3223 XMISCTYPE (val) = Lisp_Misc_Save_Value;
3224 p = XSAVE_VALUE (val);
3225 p->pointer = pointer;
3226 p->integer = integer;
b766f870 3227 p->dogc = 0;
42172a6b
RS
3228 return val;
3229}
3230
2e471eb5 3231DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
a6266d23 3232 doc: /* Return a newly allocated marker which does not point at any place. */)
5842a27b 3233 (void)
2e471eb5
GM
3234{
3235 register Lisp_Object val;
3236 register struct Lisp_Marker *p;
7146af97 3237
2e471eb5
GM
3238 val = allocate_misc ();
3239 XMISCTYPE (val) = Lisp_Misc_Marker;
3240 p = XMARKER (val);
3241 p->buffer = 0;
3242 p->bytepos = 0;
3243 p->charpos = 0;
ef89c2ce 3244 p->next = NULL;
2e471eb5 3245 p->insertion_type = 0;
7146af97
JB
3246 return val;
3247}
2e471eb5
GM
3248
3249/* Put MARKER back on the free list after using it temporarily. */
3250
3251void
971de7fb 3252free_marker (Lisp_Object marker)
2e471eb5 3253{
ef89c2ce 3254 unchain_marker (XMARKER (marker));
7b7990cc 3255 free_misc (marker);
2e471eb5
GM
3256}
3257
c0696668 3258\f
7146af97 3259/* Return a newly created vector or string with specified arguments as
736471d1
RS
3260 elements. If all the arguments are characters that can fit
3261 in a string of events, make a string; otherwise, make a vector.
3262
3263 Any number of arguments, even zero arguments, are allowed. */
7146af97
JB
3264
3265Lisp_Object
971de7fb 3266make_event_array (register int nargs, Lisp_Object *args)
7146af97
JB
3267{
3268 int i;
3269
3270 for (i = 0; i < nargs; i++)
736471d1 3271 /* The things that fit in a string
c9ca4659
RS
3272 are characters that are in 0...127,
3273 after discarding the meta bit and all the bits above it. */
e687453f 3274 if (!INTEGERP (args[i])
c9ca4659 3275 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200)
7146af97
JB
3276 return Fvector (nargs, args);
3277
3278 /* Since the loop exited, we know that all the things in it are
3279 characters, so we can make a string. */
3280 {
c13ccad2 3281 Lisp_Object result;
177c0ea7 3282
50aee051 3283 result = Fmake_string (make_number (nargs), make_number (0));
7146af97 3284 for (i = 0; i < nargs; i++)
736471d1 3285 {
46e7e6b0 3286 SSET (result, i, XINT (args[i]));
736471d1
RS
3287 /* Move the meta bit to the right place for a string char. */
3288 if (XINT (args[i]) & CHAR_META)
46e7e6b0 3289 SSET (result, i, SREF (result, i) | 0x80);
736471d1 3290 }
177c0ea7 3291
7146af97
JB
3292 return result;
3293 }
3294}
2e471eb5
GM
3295
3296
7146af97 3297\f
24d8a105
RS
3298/************************************************************************
3299 Memory Full Handling
3300 ************************************************************************/
3301
3302
3303/* Called if malloc returns zero. */
3304
3305void
971de7fb 3306memory_full (void)
24d8a105
RS
3307{
3308 int i;
3309
3310 Vmemory_full = Qt;
3311
3312 memory_full_cons_threshold = sizeof (struct cons_block);
3313
3314 /* The first time we get here, free the spare memory. */
3315 for (i = 0; i < sizeof (spare_memory) / sizeof (char *); i++)
3316 if (spare_memory[i])
3317 {
3318 if (i == 0)
3319 free (spare_memory[i]);
3320 else if (i >= 1 && i <= 4)
3321 lisp_align_free (spare_memory[i]);
3322 else
3323 lisp_free (spare_memory[i]);
3324 spare_memory[i] = 0;
3325 }
3326
3327 /* Record the space now used. When it decreases substantially,
3328 we can refill the memory reserve. */
3329#ifndef SYSTEM_MALLOC
3330 bytes_used_when_full = BYTES_USED;
3331#endif
3332
3333 /* This used to call error, but if we've run out of memory, we could
3334 get infinite recursion trying to build the string. */
9b306d37 3335 xsignal (Qnil, Vmemory_signal_data);
24d8a105
RS
3336}
3337
3338/* If we released our reserve (due to running out of memory),
3339 and we have a fair amount free once again,
3340 try to set aside another reserve in case we run out once more.
3341
3342 This is called when a relocatable block is freed in ralloc.c,
3343 and also directly from this file, in case we're not using ralloc.c. */
3344
3345void
971de7fb 3346refill_memory_reserve (void)
24d8a105
RS
3347{
3348#ifndef SYSTEM_MALLOC
3349 if (spare_memory[0] == 0)
3350 spare_memory[0] = (char *) malloc ((size_t) SPARE_MEMORY);
3351 if (spare_memory[1] == 0)
3352 spare_memory[1] = (char *) lisp_align_malloc (sizeof (struct cons_block),
3353 MEM_TYPE_CONS);
3354 if (spare_memory[2] == 0)
3355 spare_memory[2] = (char *) lisp_align_malloc (sizeof (struct cons_block),
3356 MEM_TYPE_CONS);
3357 if (spare_memory[3] == 0)
3358 spare_memory[3] = (char *) lisp_align_malloc (sizeof (struct cons_block),
3359 MEM_TYPE_CONS);
3360 if (spare_memory[4] == 0)
3361 spare_memory[4] = (char *) lisp_align_malloc (sizeof (struct cons_block),
3362 MEM_TYPE_CONS);
3363 if (spare_memory[5] == 0)
3364 spare_memory[5] = (char *) lisp_malloc (sizeof (struct string_block),
3365 MEM_TYPE_STRING);
3366 if (spare_memory[6] == 0)
3367 spare_memory[6] = (char *) lisp_malloc (sizeof (struct string_block),
3368 MEM_TYPE_STRING);
3369 if (spare_memory[0] && spare_memory[1] && spare_memory[5])
3370 Vmemory_full = Qnil;
3371#endif
3372}
3373\f
34400008
GM
3374/************************************************************************
3375 C Stack Marking
3376 ************************************************************************/
3377
13c844fb
GM
3378#if GC_MARK_STACK || defined GC_MALLOC_CHECK
3379
71cf5fa0
GM
3380/* Conservative C stack marking requires a method to identify possibly
3381 live Lisp objects given a pointer value. We do this by keeping
3382 track of blocks of Lisp data that are allocated in a red-black tree
3383 (see also the comment of mem_node which is the type of nodes in
3384 that tree). Function lisp_malloc adds information for an allocated
3385 block to the red-black tree with calls to mem_insert, and function
3386 lisp_free removes it with mem_delete. Functions live_string_p etc
3387 call mem_find to lookup information about a given pointer in the
3388 tree, and use that to determine if the pointer points to a Lisp
3389 object or not. */
3390
34400008
GM
3391/* Initialize this part of alloc.c. */
3392
3393static void
971de7fb 3394mem_init (void)
34400008
GM
3395{
3396 mem_z.left = mem_z.right = MEM_NIL;
3397 mem_z.parent = NULL;
3398 mem_z.color = MEM_BLACK;
3399 mem_z.start = mem_z.end = NULL;
3400 mem_root = MEM_NIL;
3401}
3402
3403
3404/* Value is a pointer to the mem_node containing START. Value is
3405 MEM_NIL if there is no node in the tree containing START. */
3406
3407static INLINE struct mem_node *
971de7fb 3408mem_find (void *start)
34400008
GM
3409{
3410 struct mem_node *p;
3411
ece93c02
GM
3412 if (start < min_heap_address || start > max_heap_address)
3413 return MEM_NIL;
3414
34400008
GM
3415 /* Make the search always successful to speed up the loop below. */
3416 mem_z.start = start;
3417 mem_z.end = (char *) start + 1;
3418
3419 p = mem_root;
3420 while (start < p->start || start >= p->end)
3421 p = start < p->start ? p->left : p->right;
3422 return p;
3423}
3424
3425
3426/* Insert a new node into the tree for a block of memory with start
3427 address START, end address END, and type TYPE. Value is a
3428 pointer to the node that was inserted. */
3429
3430static struct mem_node *
971de7fb 3431mem_insert (void *start, void *end, enum mem_type type)
34400008
GM
3432{
3433 struct mem_node *c, *parent, *x;
3434
add3c3ea 3435 if (min_heap_address == NULL || start < min_heap_address)
ece93c02 3436 min_heap_address = start;
add3c3ea 3437 if (max_heap_address == NULL || end > max_heap_address)
ece93c02
GM
3438 max_heap_address = end;
3439
34400008
GM
3440 /* See where in the tree a node for START belongs. In this
3441 particular application, it shouldn't happen that a node is already
3442 present. For debugging purposes, let's check that. */
3443 c = mem_root;
3444 parent = NULL;
3445
3446#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
177c0ea7 3447
34400008
GM
3448 while (c != MEM_NIL)
3449 {
3450 if (start >= c->start && start < c->end)
3451 abort ();
3452 parent = c;
3453 c = start < c->start ? c->left : c->right;
3454 }
177c0ea7 3455
34400008 3456#else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
177c0ea7 3457
34400008
GM
3458 while (c != MEM_NIL)
3459 {
3460 parent = c;
3461 c = start < c->start ? c->left : c->right;
3462 }
177c0ea7 3463
34400008
GM
3464#endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
3465
3466 /* Create a new node. */
877935b1
GM
3467#ifdef GC_MALLOC_CHECK
3468 x = (struct mem_node *) _malloc_internal (sizeof *x);
3469 if (x == NULL)
3470 abort ();
3471#else
34400008 3472 x = (struct mem_node *) xmalloc (sizeof *x);
877935b1 3473#endif
34400008
GM
3474 x->start = start;
3475 x->end = end;
3476 x->type = type;
3477 x->parent = parent;
3478 x->left = x->right = MEM_NIL;
3479 x->color = MEM_RED;
3480
3481 /* Insert it as child of PARENT or install it as root. */
3482 if (parent)
3483 {
3484 if (start < parent->start)
3485 parent->left = x;
3486 else
3487 parent->right = x;
3488 }
177c0ea7 3489 else
34400008
GM
3490 mem_root = x;
3491
3492 /* Re-establish red-black tree properties. */
3493 mem_insert_fixup (x);
877935b1 3494
34400008
GM
3495 return x;
3496}
3497
3498
3499/* Re-establish the red-black properties of the tree, and thereby
3500 balance the tree, after node X has been inserted; X is always red. */
3501
3502static void
971de7fb 3503mem_insert_fixup (struct mem_node *x)
34400008
GM
3504{
3505 while (x != mem_root && x->parent->color == MEM_RED)
3506 {
3507 /* X is red and its parent is red. This is a violation of
3508 red-black tree property #3. */
177c0ea7 3509
34400008
GM
3510 if (x->parent == x->parent->parent->left)
3511 {
3512 /* We're on the left side of our grandparent, and Y is our
3513 "uncle". */
3514 struct mem_node *y = x->parent->parent->right;
177c0ea7 3515
34400008
GM
3516 if (y->color == MEM_RED)
3517 {
3518 /* Uncle and parent are red but should be black because
3519 X is red. Change the colors accordingly and proceed
3520 with the grandparent. */
3521 x->parent->color = MEM_BLACK;
3522 y->color = MEM_BLACK;
3523 x->parent->parent->color = MEM_RED;
3524 x = x->parent->parent;
3525 }
3526 else
3527 {
3528 /* Parent and uncle have different colors; parent is
3529 red, uncle is black. */
3530 if (x == x->parent->right)
3531 {
3532 x = x->parent;
3533 mem_rotate_left (x);
3534 }
3535
3536 x->parent->color = MEM_BLACK;
3537 x->parent->parent->color = MEM_RED;
3538 mem_rotate_right (x->parent->parent);
3539 }
3540 }
3541 else
3542 {
3543 /* This is the symmetrical case of above. */
3544 struct mem_node *y = x->parent->parent->left;
177c0ea7 3545
34400008
GM
3546 if (y->color == MEM_RED)
3547 {
3548 x->parent->color = MEM_BLACK;
3549 y->color = MEM_BLACK;
3550 x->parent->parent->color = MEM_RED;
3551 x = x->parent->parent;
3552 }
3553 else
3554 {
3555 if (x == x->parent->left)
3556 {
3557 x = x->parent;
3558 mem_rotate_right (x);
3559 }
177c0ea7 3560
34400008
GM
3561 x->parent->color = MEM_BLACK;
3562 x->parent->parent->color = MEM_RED;
3563 mem_rotate_left (x->parent->parent);
3564 }
3565 }
3566 }
3567
3568 /* The root may have been changed to red due to the algorithm. Set
3569 it to black so that property #5 is satisfied. */
3570 mem_root->color = MEM_BLACK;
3571}
3572
3573
177c0ea7
JB
3574/* (x) (y)
3575 / \ / \
34400008
GM
3576 a (y) ===> (x) c
3577 / \ / \
3578 b c a b */
3579
3580static void
971de7fb 3581mem_rotate_left (struct mem_node *x)
34400008
GM
3582{
3583 struct mem_node *y;
3584
3585 /* Turn y's left sub-tree into x's right sub-tree. */
3586 y = x->right;
3587 x->right = y->left;
3588 if (y->left != MEM_NIL)
3589 y->left->parent = x;
3590
3591 /* Y's parent was x's parent. */
3592 if (y != MEM_NIL)
3593 y->parent = x->parent;
3594
3595 /* Get the parent to point to y instead of x. */
3596 if (x->parent)
3597 {
3598 if (x == x->parent->left)
3599 x->parent->left = y;
3600 else
3601 x->parent->right = y;
3602 }
3603 else
3604 mem_root = y;
3605
3606 /* Put x on y's left. */
3607 y->left = x;
3608 if (x != MEM_NIL)
3609 x->parent = y;
3610}
3611
3612
177c0ea7
JB
3613/* (x) (Y)
3614 / \ / \
3615 (y) c ===> a (x)
3616 / \ / \
34400008
GM
3617 a b b c */
3618
3619static void
971de7fb 3620mem_rotate_right (struct mem_node *x)
34400008
GM
3621{
3622 struct mem_node *y = x->left;
3623
3624 x->left = y->right;
3625 if (y->right != MEM_NIL)
3626 y->right->parent = x;
177c0ea7 3627
34400008
GM
3628 if (y != MEM_NIL)
3629 y->parent = x->parent;
3630 if (x->parent)
3631 {
3632 if (x == x->parent->right)
3633 x->parent->right = y;
3634 else
3635 x->parent->left = y;
3636 }
3637 else
3638 mem_root = y;
177c0ea7 3639
34400008
GM
3640 y->right = x;
3641 if (x != MEM_NIL)
3642 x->parent = y;
3643}
3644
3645
3646/* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
3647
3648static void
971de7fb 3649mem_delete (struct mem_node *z)
34400008
GM
3650{
3651 struct mem_node *x, *y;
3652
3653 if (!z || z == MEM_NIL)
3654 return;
3655
3656 if (z->left == MEM_NIL || z->right == MEM_NIL)
3657 y = z;
3658 else
3659 {
3660 y = z->right;
3661 while (y->left != MEM_NIL)
3662 y = y->left;
3663 }
3664
3665 if (y->left != MEM_NIL)
3666 x = y->left;
3667 else
3668 x = y->right;
3669
3670 x->parent = y->parent;
3671 if (y->parent)
3672 {
3673 if (y == y->parent->left)
3674 y->parent->left = x;
3675 else
3676 y->parent->right = x;
3677 }
3678 else
3679 mem_root = x;
3680
3681 if (y != z)
3682 {
3683 z->start = y->start;
3684 z->end = y->end;
3685 z->type = y->type;
3686 }
177c0ea7 3687
34400008
GM
3688 if (y->color == MEM_BLACK)
3689 mem_delete_fixup (x);
877935b1
GM
3690
3691#ifdef GC_MALLOC_CHECK
3692 _free_internal (y);
3693#else
34400008 3694 xfree (y);
877935b1 3695#endif
34400008
GM
3696}
3697
3698
3699/* Re-establish the red-black properties of the tree, after a
3700 deletion. */
3701
3702static void
971de7fb 3703mem_delete_fixup (struct mem_node *x)
34400008
GM
3704{
3705 while (x != mem_root && x->color == MEM_BLACK)
3706 {
3707 if (x == x->parent->left)
3708 {
3709 struct mem_node *w = x->parent->right;
177c0ea7 3710
34400008
GM
3711 if (w->color == MEM_RED)
3712 {
3713 w->color = MEM_BLACK;
3714 x->parent->color = MEM_RED;
3715 mem_rotate_left (x->parent);
3716 w = x->parent->right;
3717 }
177c0ea7 3718
34400008
GM
3719 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
3720 {
3721 w->color = MEM_RED;
3722 x = x->parent;
3723 }
3724 else
3725 {
3726 if (w->right->color == MEM_BLACK)
3727 {
3728 w->left->color = MEM_BLACK;
3729 w->color = MEM_RED;
3730 mem_rotate_right (w);
3731 w = x->parent->right;
3732 }
3733 w->color = x->parent->color;
3734 x->parent->color = MEM_BLACK;
3735 w->right->color = MEM_BLACK;
3736 mem_rotate_left (x->parent);
3737 x = mem_root;
3738 }
3739 }
3740 else
3741 {
3742 struct mem_node *w = x->parent->left;
177c0ea7 3743
34400008
GM
3744 if (w->color == MEM_RED)
3745 {
3746 w->color = MEM_BLACK;
3747 x->parent->color = MEM_RED;
3748 mem_rotate_right (x->parent);
3749 w = x->parent->left;
3750 }
177c0ea7 3751
34400008
GM
3752 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
3753 {
3754 w->color = MEM_RED;
3755 x = x->parent;
3756 }
3757 else
3758 {
3759 if (w->left->color == MEM_BLACK)
3760 {
3761 w->right->color = MEM_BLACK;
3762 w->color = MEM_RED;
3763 mem_rotate_left (w);
3764 w = x->parent->left;
3765 }
177c0ea7 3766
34400008
GM
3767 w->color = x->parent->color;
3768 x->parent->color = MEM_BLACK;
3769 w->left->color = MEM_BLACK;
3770 mem_rotate_right (x->parent);
3771 x = mem_root;
3772 }
3773 }
3774 }
177c0ea7 3775
34400008
GM
3776 x->color = MEM_BLACK;
3777}
3778
3779
3780/* Value is non-zero if P is a pointer to a live Lisp string on
3781 the heap. M is a pointer to the mem_block for P. */
3782
3783static INLINE int
971de7fb 3784live_string_p (struct mem_node *m, void *p)
34400008
GM
3785{
3786 if (m->type == MEM_TYPE_STRING)
3787 {
3788 struct string_block *b = (struct string_block *) m->start;
3789 int offset = (char *) p - (char *) &b->strings[0];
3790
3791 /* P must point to the start of a Lisp_String structure, and it
3792 must not be on the free-list. */
176bc847
GM
3793 return (offset >= 0
3794 && offset % sizeof b->strings[0] == 0
6b61353c 3795 && offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
34400008
GM
3796 && ((struct Lisp_String *) p)->data != NULL);
3797 }
3798 else
3799 return 0;
3800}
3801
3802
3803/* Value is non-zero if P is a pointer to a live Lisp cons on
3804 the heap. M is a pointer to the mem_block for P. */
3805
3806static INLINE int
971de7fb 3807live_cons_p (struct mem_node *m, void *p)
34400008
GM
3808{
3809 if (m->type == MEM_TYPE_CONS)
3810 {
3811 struct cons_block *b = (struct cons_block *) m->start;
3812 int offset = (char *) p - (char *) &b->conses[0];
3813
3814 /* P must point to the start of a Lisp_Cons, not be
3815 one of the unused cells in the current cons block,
3816 and not be on the free-list. */
176bc847
GM
3817 return (offset >= 0
3818 && offset % sizeof b->conses[0] == 0
6b61353c 3819 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
34400008
GM
3820 && (b != cons_block
3821 || offset / sizeof b->conses[0] < cons_block_index)
3822 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
3823 }
3824 else
3825 return 0;
3826}
3827
3828
3829/* Value is non-zero if P is a pointer to a live Lisp symbol on
3830 the heap. M is a pointer to the mem_block for P. */
3831
3832static INLINE int
971de7fb 3833live_symbol_p (struct mem_node *m, void *p)
34400008
GM
3834{
3835 if (m->type == MEM_TYPE_SYMBOL)
3836 {
3837 struct symbol_block *b = (struct symbol_block *) m->start;
3838 int offset = (char *) p - (char *) &b->symbols[0];
177c0ea7 3839
34400008
GM
3840 /* P must point to the start of a Lisp_Symbol, not be
3841 one of the unused cells in the current symbol block,
3842 and not be on the free-list. */
176bc847
GM
3843 return (offset >= 0
3844 && offset % sizeof b->symbols[0] == 0
6b61353c 3845 && offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
34400008
GM
3846 && (b != symbol_block
3847 || offset / sizeof b->symbols[0] < symbol_block_index)
3848 && !EQ (((struct Lisp_Symbol *) p)->function, Vdead));
3849 }
3850 else
3851 return 0;
3852}
3853
3854
3855/* Value is non-zero if P is a pointer to a live Lisp float on
3856 the heap. M is a pointer to the mem_block for P. */
3857
3858static INLINE int
971de7fb 3859live_float_p (struct mem_node *m, void *p)
34400008
GM
3860{
3861 if (m->type == MEM_TYPE_FLOAT)
3862 {
3863 struct float_block *b = (struct float_block *) m->start;
3864 int offset = (char *) p - (char *) &b->floats[0];
177c0ea7 3865
ab6780cd
SM
3866 /* P must point to the start of a Lisp_Float and not be
3867 one of the unused cells in the current float block. */
176bc847
GM
3868 return (offset >= 0
3869 && offset % sizeof b->floats[0] == 0
6b61353c 3870 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
34400008 3871 && (b != float_block
ab6780cd 3872 || offset / sizeof b->floats[0] < float_block_index));
34400008
GM
3873 }
3874 else
3875 return 0;
3876}
3877
3878
3879/* Value is non-zero if P is a pointer to a live Lisp Misc on
3880 the heap. M is a pointer to the mem_block for P. */
3881
3882static INLINE int
971de7fb 3883live_misc_p (struct mem_node *m, void *p)
34400008
GM
3884{
3885 if (m->type == MEM_TYPE_MISC)
3886 {
3887 struct marker_block *b = (struct marker_block *) m->start;
3888 int offset = (char *) p - (char *) &b->markers[0];
177c0ea7 3889
34400008
GM
3890 /* P must point to the start of a Lisp_Misc, not be
3891 one of the unused cells in the current misc block,
3892 and not be on the free-list. */
176bc847
GM
3893 return (offset >= 0
3894 && offset % sizeof b->markers[0] == 0
6b61353c 3895 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
34400008
GM
3896 && (b != marker_block
3897 || offset / sizeof b->markers[0] < marker_block_index)
d314756e 3898 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free);
34400008
GM
3899 }
3900 else
3901 return 0;
3902}
3903
3904
3905/* Value is non-zero if P is a pointer to a live vector-like object.
3906 M is a pointer to the mem_block for P. */
3907
3908static INLINE int
971de7fb 3909live_vector_p (struct mem_node *m, void *p)
34400008 3910{
9c545a55 3911 return (p == m->start && m->type == MEM_TYPE_VECTORLIKE);
34400008
GM
3912}
3913
3914
2336fe58 3915/* Value is non-zero if P is a pointer to a live buffer. M is a
34400008
GM
3916 pointer to the mem_block for P. */
3917
3918static INLINE int
971de7fb 3919live_buffer_p (struct mem_node *m, void *p)
34400008
GM
3920{
3921 /* P must point to the start of the block, and the buffer
3922 must not have been killed. */
3923 return (m->type == MEM_TYPE_BUFFER
3924 && p == m->start
3925 && !NILP (((struct buffer *) p)->name));
3926}
3927
13c844fb
GM
3928#endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
3929
3930#if GC_MARK_STACK
3931
34400008
GM
3932#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
3933
3934/* Array of objects that are kept alive because the C stack contains
3935 a pattern that looks like a reference to them . */
3936
3937#define MAX_ZOMBIES 10
3938static Lisp_Object zombies[MAX_ZOMBIES];
3939
3940/* Number of zombie objects. */
3941
3942static int nzombies;
3943
3944/* Number of garbage collections. */
3945
3946static int ngcs;
3947
3948/* Average percentage of zombies per collection. */
3949
3950static double avg_zombies;
3951
3952/* Max. number of live and zombie objects. */
3953
3954static int max_live, max_zombies;
3955
3956/* Average number of live objects per GC. */
3957
3958static double avg_live;
3959
3960DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
7ee72033 3961 doc: /* Show information about live and zombie objects. */)
5842a27b 3962 (void)
34400008 3963{
83fc9c63
DL
3964 Lisp_Object args[8], zombie_list = Qnil;
3965 int i;
3966 for (i = 0; i < nzombies; i++)
3967 zombie_list = Fcons (zombies[i], zombie_list);
3968 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
34400008
GM
3969 args[1] = make_number (ngcs);
3970 args[2] = make_float (avg_live);
3971 args[3] = make_float (avg_zombies);
3972 args[4] = make_float (avg_zombies / avg_live / 100);
3973 args[5] = make_number (max_live);
3974 args[6] = make_number (max_zombies);
83fc9c63
DL
3975 args[7] = zombie_list;
3976 return Fmessage (8, args);
34400008
GM
3977}
3978
3979#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
3980
3981
182ff242
GM
3982/* Mark OBJ if we can prove it's a Lisp_Object. */
3983
3984static INLINE void
971de7fb 3985mark_maybe_object (Lisp_Object obj)
182ff242
GM
3986{
3987 void *po = (void *) XPNTR (obj);
3988 struct mem_node *m = mem_find (po);
177c0ea7 3989
182ff242
GM
3990 if (m != MEM_NIL)
3991 {
3992 int mark_p = 0;
3993
8e50cc2d 3994 switch (XTYPE (obj))
182ff242
GM
3995 {
3996 case Lisp_String:
3997 mark_p = (live_string_p (m, po)
3998 && !STRING_MARKED_P ((struct Lisp_String *) po));
3999 break;
4000
4001 case Lisp_Cons:
08b7c2cb 4002 mark_p = (live_cons_p (m, po) && !CONS_MARKED_P (XCONS (obj)));
182ff242
GM
4003 break;
4004
4005 case Lisp_Symbol:
2336fe58 4006 mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
182ff242
GM
4007 break;
4008
4009 case Lisp_Float:
ab6780cd 4010 mark_p = (live_float_p (m, po) && !FLOAT_MARKED_P (XFLOAT (obj)));
182ff242
GM
4011 break;
4012
4013 case Lisp_Vectorlike:
8e50cc2d 4014 /* Note: can't check BUFFERP before we know it's a
182ff242
GM
4015 buffer because checking that dereferences the pointer
4016 PO which might point anywhere. */
4017 if (live_vector_p (m, po))
8e50cc2d 4018 mark_p = !SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj));
182ff242 4019 else if (live_buffer_p (m, po))
8e50cc2d 4020 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
182ff242
GM
4021 break;
4022
4023 case Lisp_Misc:
67ee9f6e 4024 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit);
182ff242 4025 break;
6bbd7a29 4026
2de9f71c 4027 default:
6bbd7a29 4028 break;
182ff242
GM
4029 }
4030
4031 if (mark_p)
4032 {
4033#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4034 if (nzombies < MAX_ZOMBIES)
83fc9c63 4035 zombies[nzombies] = obj;
182ff242
GM
4036 ++nzombies;
4037#endif
49723c04 4038 mark_object (obj);
182ff242
GM
4039 }
4040 }
4041}
ece93c02
GM
4042
4043
4044/* If P points to Lisp data, mark that as live if it isn't already
4045 marked. */
4046
4047static INLINE void
971de7fb 4048mark_maybe_pointer (void *p)
ece93c02
GM
4049{
4050 struct mem_node *m;
4051
5045e68e
SM
4052 /* Quickly rule out some values which can't point to Lisp data. */
4053 if ((EMACS_INT) p %
4054#ifdef USE_LSB_TAG
4055 8 /* USE_LSB_TAG needs Lisp data to be aligned on multiples of 8. */
4056#else
4057 2 /* We assume that Lisp data is aligned on even addresses. */
4058#endif
4059 )
ece93c02 4060 return;
177c0ea7 4061
ece93c02
GM
4062 m = mem_find (p);
4063 if (m != MEM_NIL)
4064 {
4065 Lisp_Object obj = Qnil;
177c0ea7 4066
ece93c02
GM
4067 switch (m->type)
4068 {
4069 case MEM_TYPE_NON_LISP:
2fe50224 4070 /* Nothing to do; not a pointer to Lisp memory. */
ece93c02 4071 break;
177c0ea7 4072
ece93c02 4073 case MEM_TYPE_BUFFER:
3ef06d12 4074 if (live_buffer_p (m, p) && !VECTOR_MARKED_P((struct buffer *)p))
ece93c02
GM
4075 XSETVECTOR (obj, p);
4076 break;
177c0ea7 4077
ece93c02 4078 case MEM_TYPE_CONS:
08b7c2cb 4079 if (live_cons_p (m, p) && !CONS_MARKED_P ((struct Lisp_Cons *) p))
ece93c02
GM
4080 XSETCONS (obj, p);
4081 break;
177c0ea7 4082
ece93c02
GM
4083 case MEM_TYPE_STRING:
4084 if (live_string_p (m, p)
4085 && !STRING_MARKED_P ((struct Lisp_String *) p))
4086 XSETSTRING (obj, p);
4087 break;
4088
4089 case MEM_TYPE_MISC:
2336fe58
SM
4090 if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
4091 XSETMISC (obj, p);
ece93c02 4092 break;
177c0ea7 4093
ece93c02 4094 case MEM_TYPE_SYMBOL:
2336fe58 4095 if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
ece93c02
GM
4096 XSETSYMBOL (obj, p);
4097 break;
177c0ea7 4098
ece93c02 4099 case MEM_TYPE_FLOAT:
ab6780cd 4100 if (live_float_p (m, p) && !FLOAT_MARKED_P (p))
ece93c02
GM
4101 XSETFLOAT (obj, p);
4102 break;
177c0ea7 4103
9c545a55 4104 case MEM_TYPE_VECTORLIKE:
ece93c02
GM
4105 if (live_vector_p (m, p))
4106 {
4107 Lisp_Object tem;
4108 XSETVECTOR (tem, p);
8e50cc2d 4109 if (!SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem)))
ece93c02
GM
4110 obj = tem;
4111 }
4112 break;
4113
4114 default:
4115 abort ();
4116 }
4117
8e50cc2d 4118 if (!NILP (obj))
49723c04 4119 mark_object (obj);
ece93c02
GM
4120 }
4121}
4122
4123
55a314a5
YM
4124/* Mark Lisp objects referenced from the address range START+OFFSET..END
4125 or END+OFFSET..START. */
34400008 4126
177c0ea7 4127static void
971de7fb 4128mark_memory (void *start, void *end, int offset)
34400008
GM
4129{
4130 Lisp_Object *p;
ece93c02 4131 void **pp;
34400008
GM
4132
4133#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4134 nzombies = 0;
4135#endif
4136
4137 /* Make START the pointer to the start of the memory region,
4138 if it isn't already. */
4139 if (end < start)
4140 {
4141 void *tem = start;
4142 start = end;
4143 end = tem;
4144 }
ece93c02
GM
4145
4146 /* Mark Lisp_Objects. */
55a314a5 4147 for (p = (Lisp_Object *) ((char *) start + offset); (void *) p < end; ++p)
182ff242 4148 mark_maybe_object (*p);
ece93c02
GM
4149
4150 /* Mark Lisp data pointed to. This is necessary because, in some
4151 situations, the C compiler optimizes Lisp objects away, so that
4152 only a pointer to them remains. Example:
4153
4154 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
7ee72033 4155 ()
ece93c02
GM
4156 {
4157 Lisp_Object obj = build_string ("test");
4158 struct Lisp_String *s = XSTRING (obj);
4159 Fgarbage_collect ();
4160 fprintf (stderr, "test `%s'\n", s->data);
4161 return Qnil;
4162 }
4163
4164 Here, `obj' isn't really used, and the compiler optimizes it
4165 away. The only reference to the life string is through the
4166 pointer `s'. */
177c0ea7 4167
55a314a5 4168 for (pp = (void **) ((char *) start + offset); (void *) pp < end; ++pp)
ece93c02 4169 mark_maybe_pointer (*pp);
182ff242
GM
4170}
4171
30f637f8
DL
4172/* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in
4173 the GCC system configuration. In gcc 3.2, the only systems for
4174 which this is so are i386-sco5 non-ELF, i386-sysv3 (maybe included
4175 by others?) and ns32k-pc532-min. */
182ff242
GM
4176
4177#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
4178
4179static int setjmp_tested_p, longjmps_done;
4180
4181#define SETJMP_WILL_LIKELY_WORK "\
4182\n\
4183Emacs garbage collector has been changed to use conservative stack\n\
4184marking. Emacs has determined that the method it uses to do the\n\
4185marking will likely work on your system, but this isn't sure.\n\
4186\n\
4187If you are a system-programmer, or can get the help of a local wizard\n\
4188who is, please take a look at the function mark_stack in alloc.c, and\n\
4189verify that the methods used are appropriate for your system.\n\
4190\n\
d191623b 4191Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4192"
4193
4194#define SETJMP_WILL_NOT_WORK "\
4195\n\
4196Emacs garbage collector has been changed to use conservative stack\n\
4197marking. Emacs has determined that the default method it uses to do the\n\
4198marking will not work on your system. We will need a system-dependent\n\
4199solution for your system.\n\
4200\n\
4201Please take a look at the function mark_stack in alloc.c, and\n\
4202try to find a way to make it work on your system.\n\
30f637f8
DL
4203\n\
4204Note that you may get false negatives, depending on the compiler.\n\
4205In particular, you need to use -O with GCC for this test.\n\
4206\n\
d191623b 4207Please mail the result to <emacs-devel@gnu.org>.\n\
182ff242
GM
4208"
4209
4210
4211/* Perform a quick check if it looks like setjmp saves registers in a
4212 jmp_buf. Print a message to stderr saying so. When this test
4213 succeeds, this is _not_ a proof that setjmp is sufficient for
4214 conservative stack marking. Only the sources or a disassembly
4215 can prove that. */
4216
4217static void
4218test_setjmp ()
4219{
4220 char buf[10];
4221 register int x;
4222 jmp_buf jbuf;
4223 int result = 0;
4224
4225 /* Arrange for X to be put in a register. */
4226 sprintf (buf, "1");
4227 x = strlen (buf);
4228 x = 2 * x - 1;
4229
4230 setjmp (jbuf);
4231 if (longjmps_done == 1)
34400008 4232 {
182ff242 4233 /* Came here after the longjmp at the end of the function.
34400008 4234
182ff242
GM
4235 If x == 1, the longjmp has restored the register to its
4236 value before the setjmp, and we can hope that setjmp
4237 saves all such registers in the jmp_buf, although that
4238 isn't sure.
34400008 4239
182ff242
GM
4240 For other values of X, either something really strange is
4241 taking place, or the setjmp just didn't save the register. */
4242
4243 if (x == 1)
4244 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
4245 else
4246 {
4247 fprintf (stderr, SETJMP_WILL_NOT_WORK);
4248 exit (1);
34400008
GM
4249 }
4250 }
182ff242
GM
4251
4252 ++longjmps_done;
4253 x = 2;
4254 if (longjmps_done == 1)
4255 longjmp (jbuf, 1);
34400008
GM
4256}
4257
182ff242
GM
4258#endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
4259
34400008
GM
4260
4261#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4262
4263/* Abort if anything GCPRO'd doesn't survive the GC. */
4264
4265static void
4266check_gcpros ()
4267{
4268 struct gcpro *p;
4269 int i;
4270
4271 for (p = gcprolist; p; p = p->next)
4272 for (i = 0; i < p->nvars; ++i)
4273 if (!survives_gc_p (p->var[i]))
92cc28b2
SM
4274 /* FIXME: It's not necessarily a bug. It might just be that the
4275 GCPRO is unnecessary or should release the object sooner. */
34400008
GM
4276 abort ();
4277}
4278
4279#elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4280
4281static void
4282dump_zombies ()
4283{
4284 int i;
4285
4286 fprintf (stderr, "\nZombies kept alive = %d:\n", nzombies);
4287 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
4288 {
4289 fprintf (stderr, " %d = ", i);
4290 debug_print (zombies[i]);
4291 }
4292}
4293
4294#endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
4295
4296
182ff242
GM
4297/* Mark live Lisp objects on the C stack.
4298
4299 There are several system-dependent problems to consider when
4300 porting this to new architectures:
4301
4302 Processor Registers
4303
4304 We have to mark Lisp objects in CPU registers that can hold local
4305 variables or are used to pass parameters.
4306
4307 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
4308 something that either saves relevant registers on the stack, or
4309 calls mark_maybe_object passing it each register's contents.
4310
4311 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
4312 implementation assumes that calling setjmp saves registers we need
4313 to see in a jmp_buf which itself lies on the stack. This doesn't
4314 have to be true! It must be verified for each system, possibly
4315 by taking a look at the source code of setjmp.
4316
4317 Stack Layout
4318
4319 Architectures differ in the way their processor stack is organized.
4320 For example, the stack might look like this
4321
4322 +----------------+
4323 | Lisp_Object | size = 4
4324 +----------------+
4325 | something else | size = 2
4326 +----------------+
4327 | Lisp_Object | size = 4
4328 +----------------+
4329 | ... |
4330
4331 In such a case, not every Lisp_Object will be aligned equally. To
4332 find all Lisp_Object on the stack it won't be sufficient to walk
4333 the stack in steps of 4 bytes. Instead, two passes will be
4334 necessary, one starting at the start of the stack, and a second
4335 pass starting at the start of the stack + 2. Likewise, if the
4336 minimal alignment of Lisp_Objects on the stack is 1, four passes
4337 would be necessary, each one starting with one byte more offset
4338 from the stack start.
4339
4340 The current code assumes by default that Lisp_Objects are aligned
4341 equally on the stack. */
34400008
GM
4342
4343static void
971de7fb 4344mark_stack (void)
34400008 4345{
630909a5 4346 int i;
55a314a5
YM
4347 /* jmp_buf may not be aligned enough on darwin-ppc64 */
4348 union aligned_jmpbuf {
4349 Lisp_Object o;
4350 jmp_buf j;
4351 } j;
6bbd7a29 4352 volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
34400008
GM
4353 void *end;
4354
4355 /* This trick flushes the register windows so that all the state of
4356 the process is contained in the stack. */
ab6780cd 4357 /* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
422eec7e
DL
4358 needed on ia64 too. See mach_dep.c, where it also says inline
4359 assembler doesn't work with relevant proprietary compilers. */
4a00783e 4360#ifdef __sparc__
4d18a7a2
DN
4361#if defined (__sparc64__) && defined (__FreeBSD__)
4362 /* FreeBSD does not have a ta 3 handler. */
4c1616be
CY
4363 asm ("flushw");
4364#else
34400008 4365 asm ("ta 3");
4c1616be 4366#endif
34400008 4367#endif
177c0ea7 4368
34400008
GM
4369 /* Save registers that we need to see on the stack. We need to see
4370 registers used to hold register variables and registers used to
4371 pass parameters. */
4372#ifdef GC_SAVE_REGISTERS_ON_STACK
4373 GC_SAVE_REGISTERS_ON_STACK (end);
182ff242 4374#else /* not GC_SAVE_REGISTERS_ON_STACK */
177c0ea7 4375
182ff242
GM
4376#ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
4377 setjmp will definitely work, test it
4378 and print a message with the result
4379 of the test. */
4380 if (!setjmp_tested_p)
4381 {
4382 setjmp_tested_p = 1;
4383 test_setjmp ();
4384 }
4385#endif /* GC_SETJMP_WORKS */
177c0ea7 4386
55a314a5 4387 setjmp (j.j);
34400008 4388 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
182ff242 4389#endif /* not GC_SAVE_REGISTERS_ON_STACK */
34400008
GM
4390
4391 /* This assumes that the stack is a contiguous region in memory. If
182ff242
GM
4392 that's not the case, something has to be done here to iterate
4393 over the stack segments. */
630909a5 4394#ifndef GC_LISP_OBJECT_ALIGNMENT
422eec7e
DL
4395#ifdef __GNUC__
4396#define GC_LISP_OBJECT_ALIGNMENT __alignof__ (Lisp_Object)
4397#else
630909a5 4398#define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object)
422eec7e 4399#endif
182ff242 4400#endif
24452cd5 4401 for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT)
55a314a5 4402 mark_memory (stack_base, end, i);
4dec23ff
AS
4403 /* Allow for marking a secondary stack, like the register stack on the
4404 ia64. */
4405#ifdef GC_MARK_SECONDARY_STACK
4406 GC_MARK_SECONDARY_STACK ();
4407#endif
34400008
GM
4408
4409#if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
4410 check_gcpros ();
4411#endif
4412}
4413
34400008
GM
4414#endif /* GC_MARK_STACK != 0 */
4415
4416
7ffb6955 4417/* Determine whether it is safe to access memory at address P. */
d3d47262 4418static int
971de7fb 4419valid_pointer_p (void *p)
7ffb6955 4420{
f892cf9c
EZ
4421#ifdef WINDOWSNT
4422 return w32_valid_pointer_p (p, 16);
4423#else
7ffb6955
KS
4424 int fd;
4425
4426 /* Obviously, we cannot just access it (we would SEGV trying), so we
4427 trick the o/s to tell us whether p is a valid pointer.
4428 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
4429 not validate p in that case. */
4430
4431 if ((fd = emacs_open ("__Valid__Lisp__Object__", O_CREAT | O_WRONLY | O_TRUNC, 0666)) >= 0)
4432 {
4433 int valid = (emacs_write (fd, (char *)p, 16) == 16);
4434 emacs_close (fd);
4435 unlink ("__Valid__Lisp__Object__");
4436 return valid;
4437 }
4438
4439 return -1;
f892cf9c 4440#endif
7ffb6955 4441}
3cd55735
KS
4442
4443/* Return 1 if OBJ is a valid lisp object.
4444 Return 0 if OBJ is NOT a valid lisp object.
4445 Return -1 if we cannot validate OBJ.
7c0ab7d9
RS
4446 This function can be quite slow,
4447 so it should only be used in code for manual debugging. */
3cd55735
KS
4448
4449int
971de7fb 4450valid_lisp_object_p (Lisp_Object obj)
3cd55735 4451{
de7124a7 4452 void *p;
7ffb6955 4453#if GC_MARK_STACK
3cd55735 4454 struct mem_node *m;
de7124a7 4455#endif
3cd55735
KS
4456
4457 if (INTEGERP (obj))
4458 return 1;
4459
4460 p = (void *) XPNTR (obj);
3cd55735
KS
4461 if (PURE_POINTER_P (p))
4462 return 1;
4463
de7124a7 4464#if !GC_MARK_STACK
7ffb6955 4465 return valid_pointer_p (p);
de7124a7
KS
4466#else
4467
3cd55735
KS
4468 m = mem_find (p);
4469
4470 if (m == MEM_NIL)
7ffb6955
KS
4471 {
4472 int valid = valid_pointer_p (p);
4473 if (valid <= 0)
4474 return valid;
4475
4476 if (SUBRP (obj))
4477 return 1;
4478
4479 return 0;
4480 }
3cd55735
KS
4481
4482 switch (m->type)
4483 {
4484 case MEM_TYPE_NON_LISP:
4485 return 0;
4486
4487 case MEM_TYPE_BUFFER:
4488 return live_buffer_p (m, p);
4489
4490 case MEM_TYPE_CONS:
4491 return live_cons_p (m, p);
4492
4493 case MEM_TYPE_STRING:
4494 return live_string_p (m, p);
4495
4496 case MEM_TYPE_MISC:
4497 return live_misc_p (m, p);
4498
4499 case MEM_TYPE_SYMBOL:
4500 return live_symbol_p (m, p);
4501
4502 case MEM_TYPE_FLOAT:
4503 return live_float_p (m, p);
4504
9c545a55 4505 case MEM_TYPE_VECTORLIKE:
3cd55735
KS
4506 return live_vector_p (m, p);
4507
4508 default:
4509 break;
4510 }
4511
4512 return 0;
4513#endif
4514}
4515
4516
4517
34400008 4518\f
2e471eb5
GM
4519/***********************************************************************
4520 Pure Storage Management
4521 ***********************************************************************/
4522
1f0b3fd2
GM
4523/* Allocate room for SIZE bytes from pure Lisp storage and return a
4524 pointer to it. TYPE is the Lisp type for which the memory is
e5bc14d4 4525 allocated. TYPE < 0 means it's not used for a Lisp object. */
1f0b3fd2
GM
4526
4527static POINTER_TYPE *
971de7fb 4528pure_alloc (size_t size, int type)
1f0b3fd2 4529{
1f0b3fd2 4530 POINTER_TYPE *result;
6b61353c
KH
4531#ifdef USE_LSB_TAG
4532 size_t alignment = (1 << GCTYPEBITS);
4533#else
44117420 4534 size_t alignment = sizeof (EMACS_INT);
1f0b3fd2
GM
4535
4536 /* Give Lisp_Floats an extra alignment. */
4537 if (type == Lisp_Float)
4538 {
1f0b3fd2
GM
4539#if defined __GNUC__ && __GNUC__ >= 2
4540 alignment = __alignof (struct Lisp_Float);
4541#else
4542 alignment = sizeof (struct Lisp_Float);
4543#endif
9e713715 4544 }
6b61353c 4545#endif
1f0b3fd2 4546
44117420 4547 again:
e5bc14d4
YM
4548 if (type >= 0)
4549 {
4550 /* Allocate space for a Lisp object from the beginning of the free
4551 space with taking account of alignment. */
4552 result = ALIGN (purebeg + pure_bytes_used_lisp, alignment);
4553 pure_bytes_used_lisp = ((char *)result - (char *)purebeg) + size;
4554 }
4555 else
4556 {
4557 /* Allocate space for a non-Lisp object from the end of the free
4558 space. */
4559 pure_bytes_used_non_lisp += size;
4560 result = purebeg + pure_size - pure_bytes_used_non_lisp;
4561 }
4562 pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp;
44117420
KS
4563
4564 if (pure_bytes_used <= pure_size)
4565 return result;
4566
4567 /* Don't allocate a large amount here,
4568 because it might get mmap'd and then its address
4569 might not be usable. */
4570 purebeg = (char *) xmalloc (10000);
4571 pure_size = 10000;
4572 pure_bytes_used_before_overflow += pure_bytes_used - size;
4573 pure_bytes_used = 0;
e5bc14d4 4574 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
44117420 4575 goto again;
1f0b3fd2
GM
4576}
4577
4578
852f8cdc 4579/* Print a warning if PURESIZE is too small. */
9e713715
GM
4580
4581void
971de7fb 4582check_pure_size (void)
9e713715
GM
4583{
4584 if (pure_bytes_used_before_overflow)
2aee5ca3 4585 message ("emacs:0:Pure Lisp storage overflow (approx. %d bytes needed)",
a4d35afd 4586 (int) (pure_bytes_used + pure_bytes_used_before_overflow));
9e713715
GM
4587}
4588
4589
79fd0489
YM
4590/* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
4591 the non-Lisp data pool of the pure storage, and return its start
4592 address. Return NULL if not found. */
4593
4594static char *
971de7fb 4595find_string_data_in_pure (const char *data, int nbytes)
79fd0489
YM
4596{
4597 int i, skip, bm_skip[256], last_char_skip, infinity, start, start_max;
2aff7c53 4598 const unsigned char *p;
79fd0489
YM
4599 char *non_lisp_beg;
4600
4601 if (pure_bytes_used_non_lisp < nbytes + 1)
4602 return NULL;
4603
4604 /* Set up the Boyer-Moore table. */
4605 skip = nbytes + 1;
4606 for (i = 0; i < 256; i++)
4607 bm_skip[i] = skip;
4608
2aff7c53 4609 p = (const unsigned char *) data;
79fd0489
YM
4610 while (--skip > 0)
4611 bm_skip[*p++] = skip;
4612
4613 last_char_skip = bm_skip['\0'];
4614
4615 non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
4616 start_max = pure_bytes_used_non_lisp - (nbytes + 1);
4617
4618 /* See the comments in the function `boyer_moore' (search.c) for the
4619 use of `infinity'. */
4620 infinity = pure_bytes_used_non_lisp + 1;
4621 bm_skip['\0'] = infinity;
4622
2aff7c53 4623 p = (const unsigned char *) non_lisp_beg + nbytes;
79fd0489
YM
4624 start = 0;
4625 do
4626 {
4627 /* Check the last character (== '\0'). */
4628 do
4629 {
4630 start += bm_skip[*(p + start)];
4631 }
4632 while (start <= start_max);
4633
4634 if (start < infinity)
4635 /* Couldn't find the last character. */
4636 return NULL;
4637
4638 /* No less than `infinity' means we could find the last
4639 character at `p[start - infinity]'. */
4640 start -= infinity;
4641
4642 /* Check the remaining characters. */
4643 if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
4644 /* Found. */
4645 return non_lisp_beg + start;
4646
4647 start += last_char_skip;
4648 }
4649 while (start <= start_max);
4650
4651 return NULL;
4652}
4653
4654
2e471eb5
GM
4655/* Return a string allocated in pure space. DATA is a buffer holding
4656 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
4657 non-zero means make the result string multibyte.
1a4f1e2c 4658
2e471eb5
GM
4659 Must get an error if pure storage is full, since if it cannot hold
4660 a large string it may be able to hold conses that point to that
4661 string; then the string is not protected from gc. */
7146af97
JB
4662
4663Lisp_Object
971de7fb 4664make_pure_string (const char *data, int nchars, int nbytes, int multibyte)
7146af97 4665{
2e471eb5
GM
4666 Lisp_Object string;
4667 struct Lisp_String *s;
c0696668 4668
1f0b3fd2 4669 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
79fd0489
YM
4670 s->data = find_string_data_in_pure (data, nbytes);
4671 if (s->data == NULL)
4672 {
4673 s->data = (unsigned char *) pure_alloc (nbytes + 1, -1);
72af86bd 4674 memcpy (s->data, data, nbytes);
79fd0489
YM
4675 s->data[nbytes] = '\0';
4676 }
2e471eb5
GM
4677 s->size = nchars;
4678 s->size_byte = multibyte ? nbytes : -1;
2e471eb5 4679 s->intervals = NULL_INTERVAL;
2e471eb5
GM
4680 XSETSTRING (string, s);
4681 return string;
7146af97
JB
4682}
4683
a56eaaef
DN
4684/* Return a string a string allocated in pure space. Do not allocate
4685 the string data, just point to DATA. */
4686
4687Lisp_Object
4688make_pure_c_string (const char *data)
4689{
4690 Lisp_Object string;
4691 struct Lisp_String *s;
4692 int nchars = strlen (data);
4693
4694 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
4695 s->size = nchars;
4696 s->size_byte = -1;
323637a2 4697 s->data = (unsigned char *) data;
a56eaaef
DN
4698 s->intervals = NULL_INTERVAL;
4699 XSETSTRING (string, s);
4700 return string;
4701}
2e471eb5 4702
34400008
GM
4703/* Return a cons allocated from pure space. Give it pure copies
4704 of CAR as car and CDR as cdr. */
4705
7146af97 4706Lisp_Object
971de7fb 4707pure_cons (Lisp_Object car, Lisp_Object cdr)
7146af97
JB
4708{
4709 register Lisp_Object new;
1f0b3fd2 4710 struct Lisp_Cons *p;
7146af97 4711
1f0b3fd2
GM
4712 p = (struct Lisp_Cons *) pure_alloc (sizeof *p, Lisp_Cons);
4713 XSETCONS (new, p);
f3fbd155
KR
4714 XSETCAR (new, Fpurecopy (car));
4715 XSETCDR (new, Fpurecopy (cdr));
7146af97
JB
4716 return new;
4717}
4718
7146af97 4719
34400008
GM
4720/* Value is a float object with value NUM allocated from pure space. */
4721
d3d47262 4722static Lisp_Object
971de7fb 4723make_pure_float (double num)
7146af97
JB
4724{
4725 register Lisp_Object new;
1f0b3fd2 4726 struct Lisp_Float *p;
7146af97 4727
1f0b3fd2
GM
4728 p = (struct Lisp_Float *) pure_alloc (sizeof *p, Lisp_Float);
4729 XSETFLOAT (new, p);
f601cdf3 4730 XFLOAT_INIT (new, num);
7146af97
JB
4731 return new;
4732}
4733
34400008
GM
4734
4735/* Return a vector with room for LEN Lisp_Objects allocated from
4736 pure space. */
4737
7146af97 4738Lisp_Object
971de7fb 4739make_pure_vector (EMACS_INT len)
7146af97 4740{
1f0b3fd2
GM
4741 Lisp_Object new;
4742 struct Lisp_Vector *p;
4743 size_t size = sizeof *p + (len - 1) * sizeof (Lisp_Object);
7146af97 4744
1f0b3fd2
GM
4745 p = (struct Lisp_Vector *) pure_alloc (size, Lisp_Vectorlike);
4746 XSETVECTOR (new, p);
7146af97
JB
4747 XVECTOR (new)->size = len;
4748 return new;
4749}
4750
34400008 4751
7146af97 4752DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
909e3b33 4753 doc: /* Make a copy of object OBJ in pure storage.
228299fa 4754Recursively copies contents of vectors and cons cells.
7ee72033 4755Does not copy symbols. Copies strings without text properties. */)
5842a27b 4756 (register Lisp_Object obj)
7146af97 4757{
265a9e55 4758 if (NILP (Vpurify_flag))
7146af97
JB
4759 return obj;
4760
1f0b3fd2 4761 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
4762 return obj;
4763
e9515805
SM
4764 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
4765 {
4766 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
4767 if (!NILP (tmp))
4768 return tmp;
4769 }
4770
d6dd74bb 4771 if (CONSP (obj))
e9515805 4772 obj = pure_cons (XCAR (obj), XCDR (obj));
d6dd74bb 4773 else if (FLOATP (obj))
e9515805 4774 obj = make_pure_float (XFLOAT_DATA (obj));
d6dd74bb 4775 else if (STRINGP (obj))
e9515805
SM
4776 obj = make_pure_string (SDATA (obj), SCHARS (obj),
4777 SBYTES (obj),
4778 STRING_MULTIBYTE (obj));
d6dd74bb
KH
4779 else if (COMPILEDP (obj) || VECTORP (obj))
4780 {
4781 register struct Lisp_Vector *vec;
6b61353c
KH
4782 register int i;
4783 EMACS_INT size;
d6dd74bb
KH
4784
4785 size = XVECTOR (obj)->size;
7d535c68
KH
4786 if (size & PSEUDOVECTOR_FLAG)
4787 size &= PSEUDOVECTOR_SIZE_MASK;
6b61353c 4788 vec = XVECTOR (make_pure_vector (size));
d6dd74bb
KH
4789 for (i = 0; i < size; i++)
4790 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]);
4791 if (COMPILEDP (obj))
985773c9
MB
4792 {
4793 XSETPVECTYPE (vec, PVEC_COMPILED);
4794 XSETCOMPILED (obj, vec);
4795 }
d6dd74bb
KH
4796 else
4797 XSETVECTOR (obj, vec);
7146af97 4798 }
d6dd74bb
KH
4799 else if (MARKERP (obj))
4800 error ("Attempt to copy a marker to pure storage");
e9515805
SM
4801 else
4802 /* Not purified, don't hash-cons. */
4803 return obj;
4804
4805 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
4806 Fputhash (obj, obj, Vpurify_flag);
6bbd7a29
GM
4807
4808 return obj;
7146af97 4809}
2e471eb5 4810
34400008 4811
7146af97 4812\f
34400008
GM
4813/***********************************************************************
4814 Protection from GC
4815 ***********************************************************************/
4816
2e471eb5
GM
4817/* Put an entry in staticvec, pointing at the variable with address
4818 VARADDRESS. */
7146af97
JB
4819
4820void
971de7fb 4821staticpro (Lisp_Object *varaddress)
7146af97
JB
4822{
4823 staticvec[staticidx++] = varaddress;
4824 if (staticidx >= NSTATICS)
4825 abort ();
4826}
4827
7146af97 4828\f
34400008
GM
4829/***********************************************************************
4830 Protection from GC
4831 ***********************************************************************/
1a4f1e2c 4832
e8197642
RS
4833/* Temporarily prevent garbage collection. */
4834
4835int
971de7fb 4836inhibit_garbage_collection (void)
e8197642 4837{
aed13378 4838 int count = SPECPDL_INDEX ();
54defd0d
AS
4839 int nbits = min (VALBITS, BITS_PER_INT);
4840
4841 specbind (Qgc_cons_threshold, make_number (((EMACS_INT) 1 << (nbits - 1)) - 1));
e8197642
RS
4842 return count;
4843}
4844
34400008 4845
7146af97 4846DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
7ee72033 4847 doc: /* Reclaim storage for Lisp objects no longer needed.
e1e37596
RS
4848Garbage collection happens automatically if you cons more than
4849`gc-cons-threshold' bytes of Lisp data since previous garbage collection.
4850`garbage-collect' normally returns a list with info on amount of space in use:
228299fa
GM
4851 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)
4852 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS
4853 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS)
4854 (USED-STRINGS . FREE-STRINGS))
e1e37596
RS
4855However, if there was overflow in pure space, `garbage-collect'
4856returns nil, because real GC can't be done. */)
5842a27b 4857 (void)
7146af97 4858{
7146af97
JB
4859 register struct specbinding *bind;
4860 struct catchtag *catch;
4861 struct handler *handler;
7146af97
JB
4862 char stack_top_variable;
4863 register int i;
6efc7df7 4864 int message_p;
96117bc7 4865 Lisp_Object total[8];
331379bf 4866 int count = SPECPDL_INDEX ();
2c5bd608
DL
4867 EMACS_TIME t1, t2, t3;
4868
3de0effb
RS
4869 if (abort_on_gc)
4870 abort ();
4871
9e713715
GM
4872 /* Can't GC if pure storage overflowed because we can't determine
4873 if something is a pure object or not. */
4874 if (pure_bytes_used_before_overflow)
4875 return Qnil;
4876
bbc012e0
KS
4877 CHECK_CONS_LIST ();
4878
3c7e66a8
RS
4879 /* Don't keep undo information around forever.
4880 Do this early on, so it is no problem if the user quits. */
4881 {
4882 register struct buffer *nextb = all_buffers;
4883
4884 while (nextb)
4885 {
4886 /* If a buffer's undo list is Qt, that means that undo is
4887 turned off in that buffer. Calling truncate_undo_list on
4888 Qt tends to return NULL, which effectively turns undo back on.
4889 So don't call truncate_undo_list if undo_list is Qt. */
303b0412 4890 if (! NILP (nextb->name) && ! EQ (nextb->undo_list, Qt))
3c7e66a8
RS
4891 truncate_undo_list (nextb);
4892
4893 /* Shrink buffer gaps, but skip indirect and dead buffers. */
dc7b4525
KH
4894 if (nextb->base_buffer == 0 && !NILP (nextb->name)
4895 && ! nextb->text->inhibit_shrinking)
3c7e66a8
RS
4896 {
4897 /* If a buffer's gap size is more than 10% of the buffer
4898 size, or larger than 2000 bytes, then shrink it
4899 accordingly. Keep a minimum size of 20 bytes. */
4900 int size = min (2000, max (20, (nextb->text->z_byte / 10)));
4901
4902 if (nextb->text->gap_size > size)
4903 {
4904 struct buffer *save_current = current_buffer;
4905 current_buffer = nextb;
4906 make_gap (-(nextb->text->gap_size - size));
4907 current_buffer = save_current;
4908 }
4909 }
4910
4911 nextb = nextb->next;
4912 }
4913 }
4914
4915 EMACS_GET_TIME (t1);
4916
58595309
KH
4917 /* In case user calls debug_print during GC,
4918 don't let that cause a recursive GC. */
4919 consing_since_gc = 0;
4920
6efc7df7
GM
4921 /* Save what's currently displayed in the echo area. */
4922 message_p = push_message ();
c55b0da6 4923 record_unwind_protect (pop_message_unwind, Qnil);
41c28a37 4924
7146af97
JB
4925 /* Save a copy of the contents of the stack, for debugging. */
4926#if MAX_SAVE_STACK > 0
265a9e55 4927 if (NILP (Vpurify_flag))
7146af97
JB
4928 {
4929 i = &stack_top_variable - stack_bottom;
4930 if (i < 0) i = -i;
4931 if (i < MAX_SAVE_STACK)
4932 {
4933 if (stack_copy == 0)
9ac0d9e0 4934 stack_copy = (char *) xmalloc (stack_copy_size = i);
7146af97 4935 else if (stack_copy_size < i)
9ac0d9e0 4936 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i));
7146af97
JB
4937 if (stack_copy)
4938 {
42607681 4939 if ((EMACS_INT) (&stack_top_variable - stack_bottom) > 0)
72af86bd 4940 memcpy (stack_copy, stack_bottom, i);
7146af97 4941 else
72af86bd 4942 memcpy (stack_copy, &stack_top_variable, i);
7146af97
JB
4943 }
4944 }
4945 }
4946#endif /* MAX_SAVE_STACK > 0 */
4947
299585ee 4948 if (garbage_collection_messages)
691c4285 4949 message1_nolog ("Garbage collecting...");
7146af97 4950
6e0fca1d
RS
4951 BLOCK_INPUT;
4952
eec7b73d
RS
4953 shrink_regexp_cache ();
4954
7146af97
JB
4955 gc_in_progress = 1;
4956
c23baf9f 4957 /* clear_marks (); */
7146af97 4958
005ca5c7 4959 /* Mark all the special slots that serve as the roots of accessibility. */
7146af97
JB
4960
4961 for (i = 0; i < staticidx; i++)
49723c04 4962 mark_object (*staticvec[i]);
34400008 4963
126f9c02
SM
4964 for (bind = specpdl; bind != specpdl_ptr; bind++)
4965 {
4966 mark_object (bind->symbol);
4967 mark_object (bind->old_value);
4968 }
6ed8eeff 4969 mark_terminals ();
126f9c02 4970 mark_kboards ();
98a92e2d 4971 mark_ttys ();
126f9c02
SM
4972
4973#ifdef USE_GTK
4974 {
dd4c5104 4975 extern void xg_mark_data (void);
126f9c02
SM
4976 xg_mark_data ();
4977 }
4978#endif
4979
34400008
GM
4980#if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
4981 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
4982 mark_stack ();
4983#else
acf5f7d3
SM
4984 {
4985 register struct gcpro *tail;
4986 for (tail = gcprolist; tail; tail = tail->next)
4987 for (i = 0; i < tail->nvars; i++)
005ca5c7 4988 mark_object (tail->var[i]);
acf5f7d3 4989 }
34400008 4990#endif
177c0ea7 4991
630686c8 4992 mark_byte_stack ();
7146af97
JB
4993 for (catch = catchlist; catch; catch = catch->next)
4994 {
49723c04
SM
4995 mark_object (catch->tag);
4996 mark_object (catch->val);
177c0ea7 4997 }
7146af97
JB
4998 for (handler = handlerlist; handler; handler = handler->next)
4999 {
49723c04
SM
5000 mark_object (handler->handler);
5001 mark_object (handler->var);
177c0ea7 5002 }
b40ea20a 5003 mark_backtrace ();
7146af97 5004
454d7973
KS
5005#ifdef HAVE_WINDOW_SYSTEM
5006 mark_fringe_data ();
5007#endif
5008
74c35a48
SM
5009#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
5010 mark_stack ();
5011#endif
5012
c37adf23
SM
5013 /* Everything is now marked, except for the things that require special
5014 finalization, i.e. the undo_list.
5015 Look thru every buffer's undo list
4c315bda
RS
5016 for elements that update markers that were not marked,
5017 and delete them. */
5018 {
5019 register struct buffer *nextb = all_buffers;
5020
5021 while (nextb)
5022 {
5023 /* If a buffer's undo list is Qt, that means that undo is
5024 turned off in that buffer. Calling truncate_undo_list on
5025 Qt tends to return NULL, which effectively turns undo back on.
5026 So don't call truncate_undo_list if undo_list is Qt. */
5027 if (! EQ (nextb->undo_list, Qt))
5028 {
5029 Lisp_Object tail, prev;
5030 tail = nextb->undo_list;
5031 prev = Qnil;
5032 while (CONSP (tail))
5033 {
8e50cc2d
SM
5034 if (CONSP (XCAR (tail))
5035 && MARKERP (XCAR (XCAR (tail)))
2336fe58 5036 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
4c315bda
RS
5037 {
5038 if (NILP (prev))
70949dac 5039 nextb->undo_list = tail = XCDR (tail);
4c315bda 5040 else
f3fbd155
KR
5041 {
5042 tail = XCDR (tail);
5043 XSETCDR (prev, tail);
5044 }
4c315bda
RS
5045 }
5046 else
5047 {
5048 prev = tail;
70949dac 5049 tail = XCDR (tail);
4c315bda
RS
5050 }
5051 }
5052 }
c37adf23
SM
5053 /* Now that we have stripped the elements that need not be in the
5054 undo_list any more, we can finally mark the list. */
5055 mark_object (nextb->undo_list);
4c315bda
RS
5056
5057 nextb = nextb->next;
5058 }
5059 }
5060
7146af97
JB
5061 gc_sweep ();
5062
5063 /* Clear the mark bits that we set in certain root slots. */
5064
033a5fa3 5065 unmark_byte_stack ();
3ef06d12
SM
5066 VECTOR_UNMARK (&buffer_defaults);
5067 VECTOR_UNMARK (&buffer_local_symbols);
7146af97 5068
34400008
GM
5069#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
5070 dump_zombies ();
5071#endif
5072
6e0fca1d
RS
5073 UNBLOCK_INPUT;
5074
bbc012e0
KS
5075 CHECK_CONS_LIST ();
5076
c23baf9f 5077 /* clear_marks (); */
7146af97
JB
5078 gc_in_progress = 0;
5079
5080 consing_since_gc = 0;
5081 if (gc_cons_threshold < 10000)
5082 gc_cons_threshold = 10000;
5083
96f077ad
SM
5084 if (FLOATP (Vgc_cons_percentage))
5085 { /* Set gc_cons_combined_threshold. */
5086 EMACS_INT total = 0;
974aae61 5087
96f077ad
SM
5088 total += total_conses * sizeof (struct Lisp_Cons);
5089 total += total_symbols * sizeof (struct Lisp_Symbol);
5090 total += total_markers * sizeof (union Lisp_Misc);
5091 total += total_string_size;
5092 total += total_vector_size * sizeof (Lisp_Object);
5093 total += total_floats * sizeof (struct Lisp_Float);
5094 total += total_intervals * sizeof (struct interval);
5095 total += total_strings * sizeof (struct Lisp_String);
3cd55735 5096
974aae61 5097 gc_relative_threshold = total * XFLOAT_DATA (Vgc_cons_percentage);
96f077ad 5098 }
974aae61
RS
5099 else
5100 gc_relative_threshold = 0;
96f077ad 5101
299585ee
RS
5102 if (garbage_collection_messages)
5103 {
6efc7df7
GM
5104 if (message_p || minibuf_level > 0)
5105 restore_message ();
299585ee
RS
5106 else
5107 message1_nolog ("Garbage collecting...done");
5108 }
7146af97 5109
98edb5ff 5110 unbind_to (count, Qnil);
2e471eb5
GM
5111
5112 total[0] = Fcons (make_number (total_conses),
5113 make_number (total_free_conses));
5114 total[1] = Fcons (make_number (total_symbols),
5115 make_number (total_free_symbols));
5116 total[2] = Fcons (make_number (total_markers),
5117 make_number (total_free_markers));
96117bc7
GM
5118 total[3] = make_number (total_string_size);
5119 total[4] = make_number (total_vector_size);
5120 total[5] = Fcons (make_number (total_floats),
2e471eb5 5121 make_number (total_free_floats));
96117bc7 5122 total[6] = Fcons (make_number (total_intervals),
2e471eb5 5123 make_number (total_free_intervals));
96117bc7 5124 total[7] = Fcons (make_number (total_strings),
2e471eb5
GM
5125 make_number (total_free_strings));
5126
34400008 5127#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
7146af97 5128 {
34400008
GM
5129 /* Compute average percentage of zombies. */
5130 double nlive = 0;
177c0ea7 5131
34400008 5132 for (i = 0; i < 7; ++i)
83fc9c63
DL
5133 if (CONSP (total[i]))
5134 nlive += XFASTINT (XCAR (total[i]));
34400008
GM
5135
5136 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
5137 max_live = max (nlive, max_live);
5138 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
5139 max_zombies = max (nzombies, max_zombies);
5140 ++ngcs;
5141 }
5142#endif
7146af97 5143
9e713715
GM
5144 if (!NILP (Vpost_gc_hook))
5145 {
5146 int count = inhibit_garbage_collection ();
5147 safe_run_hooks (Qpost_gc_hook);
5148 unbind_to (count, Qnil);
5149 }
2c5bd608
DL
5150
5151 /* Accumulate statistics. */
5152 EMACS_GET_TIME (t2);
5153 EMACS_SUB_TIME (t3, t2, t1);
5154 if (FLOATP (Vgc_elapsed))
69ab9f85
SM
5155 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed) +
5156 EMACS_SECS (t3) +
5157 EMACS_USECS (t3) * 1.0e-6);
2c5bd608
DL
5158 gcs_done++;
5159
96117bc7 5160 return Flist (sizeof total / sizeof *total, total);
7146af97 5161}
34400008 5162
41c28a37 5163
3770920e
GM
5164/* Mark Lisp objects in glyph matrix MATRIX. Currently the
5165 only interesting objects referenced from glyphs are strings. */
41c28a37
GM
5166
5167static void
971de7fb 5168mark_glyph_matrix (struct glyph_matrix *matrix)
41c28a37
GM
5169{
5170 struct glyph_row *row = matrix->rows;
5171 struct glyph_row *end = row + matrix->nrows;
5172
2e471eb5
GM
5173 for (; row < end; ++row)
5174 if (row->enabled_p)
5175 {
5176 int area;
5177 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
5178 {
5179 struct glyph *glyph = row->glyphs[area];
5180 struct glyph *end_glyph = glyph + row->used[area];
177c0ea7 5181
2e471eb5 5182 for (; glyph < end_glyph; ++glyph)
8e50cc2d 5183 if (STRINGP (glyph->object)
2e471eb5 5184 && !STRING_MARKED_P (XSTRING (glyph->object)))
49723c04 5185 mark_object (glyph->object);
2e471eb5
GM
5186 }
5187 }
41c28a37
GM
5188}
5189
34400008 5190
41c28a37
GM
5191/* Mark Lisp faces in the face cache C. */
5192
5193static void
971de7fb 5194mark_face_cache (struct face_cache *c)
41c28a37
GM
5195{
5196 if (c)
5197 {
5198 int i, j;
5199 for (i = 0; i < c->used; ++i)
5200 {
5201 struct face *face = FACE_FROM_ID (c->f, i);
5202
5203 if (face)
5204 {
5205 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
49723c04 5206 mark_object (face->lface[j]);
41c28a37
GM
5207 }
5208 }
5209 }
5210}
5211
5212
7146af97 5213\f
1a4f1e2c 5214/* Mark reference to a Lisp_Object.
2e471eb5
GM
5215 If the object referred to has not been seen yet, recursively mark
5216 all the references contained in it. */
7146af97 5217
785cd37f 5218#define LAST_MARKED_SIZE 500
d3d47262 5219static Lisp_Object last_marked[LAST_MARKED_SIZE];
785cd37f
RS
5220int last_marked_index;
5221
1342fc6f
RS
5222/* For debugging--call abort when we cdr down this many
5223 links of a list, in mark_object. In debugging,
5224 the call to abort will hit a breakpoint.
5225 Normally this is zero and the check never goes off. */
d3d47262 5226static int mark_object_loop_halt;
1342fc6f 5227
8f11f7ec 5228static void
971de7fb 5229mark_vectorlike (struct Lisp_Vector *ptr)
d2029e5b
SM
5230{
5231 register EMACS_INT size = ptr->size;
5232 register int i;
5233
8f11f7ec 5234 eassert (!VECTOR_MARKED_P (ptr));
d2029e5b
SM
5235 VECTOR_MARK (ptr); /* Else mark it */
5236 if (size & PSEUDOVECTOR_FLAG)
5237 size &= PSEUDOVECTOR_SIZE_MASK;
d3d47262 5238
d2029e5b
SM
5239 /* Note that this size is not the memory-footprint size, but only
5240 the number of Lisp_Object fields that we should trace.
5241 The distinction is used e.g. by Lisp_Process which places extra
5242 non-Lisp_Object fields at the end of the structure. */
5243 for (i = 0; i < size; i++) /* and then mark its elements */
5244 mark_object (ptr->contents[i]);
d2029e5b
SM
5245}
5246
58026347
KH
5247/* Like mark_vectorlike but optimized for char-tables (and
5248 sub-char-tables) assuming that the contents are mostly integers or
5249 symbols. */
5250
5251static void
971de7fb 5252mark_char_table (struct Lisp_Vector *ptr)
58026347
KH
5253{
5254 register EMACS_INT size = ptr->size & PSEUDOVECTOR_SIZE_MASK;
5255 register int i;
5256
8f11f7ec 5257 eassert (!VECTOR_MARKED_P (ptr));
58026347
KH
5258 VECTOR_MARK (ptr);
5259 for (i = 0; i < size; i++)
5260 {
5261 Lisp_Object val = ptr->contents[i];
5262
5263 if (INTEGERP (val) || SYMBOLP (val) && XSYMBOL (val)->gcmarkbit)
5264 continue;
5265 if (SUB_CHAR_TABLE_P (val))
5266 {
5267 if (! VECTOR_MARKED_P (XVECTOR (val)))
5268 mark_char_table (XVECTOR (val));
5269 }
5270 else
5271 mark_object (val);
5272 }
5273}
5274
41c28a37 5275void
971de7fb 5276mark_object (Lisp_Object arg)
7146af97 5277{
49723c04 5278 register Lisp_Object obj = arg;
4f5c1376
GM
5279#ifdef GC_CHECK_MARKED_OBJECTS
5280 void *po;
5281 struct mem_node *m;
5282#endif
1342fc6f 5283 int cdr_count = 0;
7146af97 5284
9149e743 5285 loop:
7146af97 5286
1f0b3fd2 5287 if (PURE_POINTER_P (XPNTR (obj)))
7146af97
JB
5288 return;
5289
49723c04 5290 last_marked[last_marked_index++] = obj;
785cd37f
RS
5291 if (last_marked_index == LAST_MARKED_SIZE)
5292 last_marked_index = 0;
5293
4f5c1376
GM
5294 /* Perform some sanity checks on the objects marked here. Abort if
5295 we encounter an object we know is bogus. This increases GC time
5296 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
5297#ifdef GC_CHECK_MARKED_OBJECTS
5298
5299 po = (void *) XPNTR (obj);
5300
5301 /* Check that the object pointed to by PO is known to be a Lisp
5302 structure allocated from the heap. */
5303#define CHECK_ALLOCATED() \
5304 do { \
5305 m = mem_find (po); \
5306 if (m == MEM_NIL) \
5307 abort (); \
5308 } while (0)
5309
5310 /* Check that the object pointed to by PO is live, using predicate
5311 function LIVEP. */
5312#define CHECK_LIVE(LIVEP) \
5313 do { \
5314 if (!LIVEP (m, po)) \
5315 abort (); \
5316 } while (0)
5317
5318 /* Check both of the above conditions. */
5319#define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
5320 do { \
5321 CHECK_ALLOCATED (); \
5322 CHECK_LIVE (LIVEP); \
5323 } while (0) \
177c0ea7 5324
4f5c1376 5325#else /* not GC_CHECK_MARKED_OBJECTS */
177c0ea7 5326
4f5c1376
GM
5327#define CHECK_ALLOCATED() (void) 0
5328#define CHECK_LIVE(LIVEP) (void) 0
5329#define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
177c0ea7 5330
4f5c1376
GM
5331#endif /* not GC_CHECK_MARKED_OBJECTS */
5332
8e50cc2d 5333 switch (SWITCH_ENUM_CAST (XTYPE (obj)))
7146af97
JB
5334 {
5335 case Lisp_String:
5336 {
5337 register struct Lisp_String *ptr = XSTRING (obj);
8f11f7ec
SM
5338 if (STRING_MARKED_P (ptr))
5339 break;
4f5c1376 5340 CHECK_ALLOCATED_AND_LIVE (live_string_p);
d5e35230 5341 MARK_INTERVAL_TREE (ptr->intervals);
2e471eb5 5342 MARK_STRING (ptr);
361b097f 5343#ifdef GC_CHECK_STRING_BYTES
676a7251
GM
5344 /* Check that the string size recorded in the string is the
5345 same as the one recorded in the sdata structure. */
5346 CHECK_STRING_BYTES (ptr);
361b097f 5347#endif /* GC_CHECK_STRING_BYTES */
7146af97
JB
5348 }
5349 break;
5350
76437631 5351 case Lisp_Vectorlike:
8f11f7ec
SM
5352 if (VECTOR_MARKED_P (XVECTOR (obj)))
5353 break;
4f5c1376
GM
5354#ifdef GC_CHECK_MARKED_OBJECTS
5355 m = mem_find (po);
8e50cc2d 5356 if (m == MEM_NIL && !SUBRP (obj)
4f5c1376
GM
5357 && po != &buffer_defaults
5358 && po != &buffer_local_symbols)
5359 abort ();
5360#endif /* GC_CHECK_MARKED_OBJECTS */
177c0ea7 5361
8e50cc2d 5362 if (BUFFERP (obj))
6b552283 5363 {
4f5c1376 5364#ifdef GC_CHECK_MARKED_OBJECTS
8f11f7ec
SM
5365 if (po != &buffer_defaults && po != &buffer_local_symbols)
5366 {
5367 struct buffer *b;
5368 for (b = all_buffers; b && b != po; b = b->next)
5369 ;
5370 if (b == NULL)
5371 abort ();
4f5c1376 5372 }
8f11f7ec
SM
5373#endif /* GC_CHECK_MARKED_OBJECTS */
5374 mark_buffer (obj);
6b552283 5375 }
8e50cc2d 5376 else if (SUBRP (obj))
169ee243 5377 break;
8e50cc2d 5378 else if (COMPILEDP (obj))
2e471eb5
GM
5379 /* We could treat this just like a vector, but it is better to
5380 save the COMPILED_CONSTANTS element for last and avoid
5381 recursion there. */
169ee243
RS
5382 {
5383 register struct Lisp_Vector *ptr = XVECTOR (obj);
5384 register EMACS_INT size = ptr->size;
169ee243
RS
5385 register int i;
5386
4f5c1376 5387 CHECK_LIVE (live_vector_p);
3ef06d12 5388 VECTOR_MARK (ptr); /* Else mark it */
76437631 5389 size &= PSEUDOVECTOR_SIZE_MASK;
169ee243
RS
5390 for (i = 0; i < size; i++) /* and then mark its elements */
5391 {
5392 if (i != COMPILED_CONSTANTS)
49723c04 5393 mark_object (ptr->contents[i]);
169ee243 5394 }
49723c04 5395 obj = ptr->contents[COMPILED_CONSTANTS];
169ee243
RS
5396 goto loop;
5397 }
8e50cc2d 5398 else if (FRAMEP (obj))
169ee243 5399 {
c70bbf06 5400 register struct frame *ptr = XFRAME (obj);
8f11f7ec
SM
5401 mark_vectorlike (XVECTOR (obj));
5402 mark_face_cache (ptr->face_cache);
707788bd 5403 }
8e50cc2d 5404 else if (WINDOWP (obj))
41c28a37
GM
5405 {
5406 register struct Lisp_Vector *ptr = XVECTOR (obj);
5407 struct window *w = XWINDOW (obj);
8f11f7ec
SM
5408 mark_vectorlike (ptr);
5409 /* Mark glyphs for leaf windows. Marking window matrices is
5410 sufficient because frame matrices use the same glyph
5411 memory. */
5412 if (NILP (w->hchild)
5413 && NILP (w->vchild)
5414 && w->current_matrix)
41c28a37 5415 {
8f11f7ec
SM
5416 mark_glyph_matrix (w->current_matrix);
5417 mark_glyph_matrix (w->desired_matrix);
41c28a37
GM
5418 }
5419 }
8e50cc2d 5420 else if (HASH_TABLE_P (obj))
41c28a37
GM
5421 {
5422 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
8f11f7ec
SM
5423 mark_vectorlike ((struct Lisp_Vector *)h);
5424 /* If hash table is not weak, mark all keys and values.
5425 For weak tables, mark only the vector. */
5426 if (NILP (h->weak))
5427 mark_object (h->key_and_value);
5428 else
5429 VECTOR_MARK (XVECTOR (h->key_and_value));
41c28a37 5430 }
58026347 5431 else if (CHAR_TABLE_P (obj))
8f11f7ec 5432 mark_char_table (XVECTOR (obj));
04ff9756 5433 else
d2029e5b 5434 mark_vectorlike (XVECTOR (obj));
169ee243 5435 break;
7146af97 5436
7146af97
JB
5437 case Lisp_Symbol:
5438 {
c70bbf06 5439 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
7146af97
JB
5440 struct Lisp_Symbol *ptrx;
5441
8f11f7ec
SM
5442 if (ptr->gcmarkbit)
5443 break;
4f5c1376 5444 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
2336fe58 5445 ptr->gcmarkbit = 1;
49723c04
SM
5446 mark_object (ptr->function);
5447 mark_object (ptr->plist);
ce5b453a
SM
5448 switch (ptr->redirect)
5449 {
5450 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
5451 case SYMBOL_VARALIAS:
5452 {
5453 Lisp_Object tem;
5454 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
5455 mark_object (tem);
5456 break;
5457 }
5458 case SYMBOL_LOCALIZED:
5459 {
5460 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
5461 /* If the value is forwarded to a buffer or keyboard field,
5462 these are marked when we see the corresponding object.
5463 And if it's forwarded to a C variable, either it's not
5464 a Lisp_Object var, or it's staticpro'd already. */
5465 mark_object (blv->where);
5466 mark_object (blv->valcell);
5467 mark_object (blv->defcell);
5468 break;
5469 }
5470 case SYMBOL_FORWARDED:
5471 /* If the value is forwarded to a buffer or keyboard field,
5472 these are marked when we see the corresponding object.
5473 And if it's forwarded to a C variable, either it's not
5474 a Lisp_Object var, or it's staticpro'd already. */
5475 break;
5476 default: abort ();
5477 }
8fe5665d
KR
5478 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
5479 MARK_STRING (XSTRING (ptr->xname));
d5db4077 5480 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
177c0ea7 5481
7146af97
JB
5482 ptr = ptr->next;
5483 if (ptr)
5484 {
b0846f52 5485 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
7146af97 5486 XSETSYMBOL (obj, ptrx);
49723c04 5487 goto loop;
7146af97
JB
5488 }
5489 }
5490 break;
5491
a0a38eb7 5492 case Lisp_Misc:
4f5c1376 5493 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
67ee9f6e 5494 if (XMISCANY (obj)->gcmarkbit)
2336fe58 5495 break;
67ee9f6e 5496 XMISCANY (obj)->gcmarkbit = 1;
b766f870 5497
a5da44fe 5498 switch (XMISCTYPE (obj))
a0a38eb7 5499 {
465edf35 5500
2336fe58
SM
5501 case Lisp_Misc_Marker:
5502 /* DO NOT mark thru the marker's chain.
5503 The buffer's markers chain does not preserve markers from gc;
5504 instead, markers are removed from the chain when freed by gc. */
b766f870
KS
5505 break;
5506
8f924df7 5507 case Lisp_Misc_Save_Value:
9ea306d1 5508#if GC_MARK_STACK
b766f870
KS
5509 {
5510 register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
5511 /* If DOGC is set, POINTER is the address of a memory
5512 area containing INTEGER potential Lisp_Objects. */
5513 if (ptr->dogc)
5514 {
5515 Lisp_Object *p = (Lisp_Object *) ptr->pointer;
5516 int nelt;
5517 for (nelt = ptr->integer; nelt > 0; nelt--, p++)
5518 mark_maybe_object (*p);
5519 }
5520 }
9ea306d1 5521#endif
c8616056
KH
5522 break;
5523
e202fa34
KH
5524 case Lisp_Misc_Overlay:
5525 {
5526 struct Lisp_Overlay *ptr = XOVERLAY (obj);
49723c04
SM
5527 mark_object (ptr->start);
5528 mark_object (ptr->end);
f54253ec
SM
5529 mark_object (ptr->plist);
5530 if (ptr->next)
5531 {
5532 XSETMISC (obj, ptr->next);
5533 goto loop;
5534 }
e202fa34
KH
5535 }
5536 break;
5537
a0a38eb7
KH
5538 default:
5539 abort ();
5540 }
7146af97
JB
5541 break;
5542
5543 case Lisp_Cons:
7146af97
JB
5544 {
5545 register struct Lisp_Cons *ptr = XCONS (obj);
8f11f7ec
SM
5546 if (CONS_MARKED_P (ptr))
5547 break;
4f5c1376 5548 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
08b7c2cb 5549 CONS_MARK (ptr);
c54ca951 5550 /* If the cdr is nil, avoid recursion for the car. */
28a099a4 5551 if (EQ (ptr->u.cdr, Qnil))
c54ca951 5552 {
49723c04 5553 obj = ptr->car;
1342fc6f 5554 cdr_count = 0;
c54ca951
RS
5555 goto loop;
5556 }
49723c04 5557 mark_object (ptr->car);
28a099a4 5558 obj = ptr->u.cdr;
1342fc6f
RS
5559 cdr_count++;
5560 if (cdr_count == mark_object_loop_halt)
5561 abort ();
7146af97
JB
5562 goto loop;
5563 }
5564
7146af97 5565 case Lisp_Float:
4f5c1376 5566 CHECK_ALLOCATED_AND_LIVE (live_float_p);
ab6780cd 5567 FLOAT_MARK (XFLOAT (obj));
7146af97 5568 break;
7146af97 5569
2de9f71c 5570 case_Lisp_Int:
7146af97
JB
5571 break;
5572
5573 default:
5574 abort ();
5575 }
4f5c1376
GM
5576
5577#undef CHECK_LIVE
5578#undef CHECK_ALLOCATED
5579#undef CHECK_ALLOCATED_AND_LIVE
7146af97
JB
5580}
5581
5582/* Mark the pointers in a buffer structure. */
5583
5584static void
971de7fb 5585mark_buffer (Lisp_Object buf)
7146af97 5586{
7146af97 5587 register struct buffer *buffer = XBUFFER (buf);
f54253ec 5588 register Lisp_Object *ptr, tmp;
30e3190a 5589 Lisp_Object base_buffer;
7146af97 5590
8f11f7ec 5591 eassert (!VECTOR_MARKED_P (buffer));
3ef06d12 5592 VECTOR_MARK (buffer);
7146af97 5593
30e3190a 5594 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
d5e35230 5595
c37adf23
SM
5596 /* For now, we just don't mark the undo_list. It's done later in
5597 a special way just before the sweep phase, and after stripping
5598 some of its elements that are not needed any more. */
4c315bda 5599
f54253ec
SM
5600 if (buffer->overlays_before)
5601 {
5602 XSETMISC (tmp, buffer->overlays_before);
5603 mark_object (tmp);
5604 }
5605 if (buffer->overlays_after)
5606 {
5607 XSETMISC (tmp, buffer->overlays_after);
5608 mark_object (tmp);
5609 }
5610
9ce376f9
SM
5611 /* buffer-local Lisp variables start at `undo_list',
5612 tho only the ones from `name' on are GC'd normally. */
3ef06d12 5613 for (ptr = &buffer->name;
7146af97
JB
5614 (char *)ptr < (char *)buffer + sizeof (struct buffer);
5615 ptr++)
49723c04 5616 mark_object (*ptr);
30e3190a
RS
5617
5618 /* If this is an indirect buffer, mark its base buffer. */
349bd9ed 5619 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
30e3190a 5620 {
177c0ea7 5621 XSETBUFFER (base_buffer, buffer->base_buffer);
30e3190a
RS
5622 mark_buffer (base_buffer);
5623 }
7146af97 5624}
084b1a0c 5625
4a729fd8
SM
5626/* Mark the Lisp pointers in the terminal objects.
5627 Called by the Fgarbage_collector. */
5628
4a729fd8
SM
5629static void
5630mark_terminals (void)
5631{
5632 struct terminal *t;
5633 for (t = terminal_list; t; t = t->next_terminal)
5634 {
5635 eassert (t->name != NULL);
8f11f7ec
SM
5636 if (!VECTOR_MARKED_P (t))
5637 {
354884c4 5638#ifdef HAVE_WINDOW_SYSTEM
8f11f7ec 5639 mark_image_cache (t->image_cache);
354884c4 5640#endif /* HAVE_WINDOW_SYSTEM */
8f11f7ec
SM
5641 mark_vectorlike ((struct Lisp_Vector *)t);
5642 }
4a729fd8
SM
5643 }
5644}
5645
5646
084b1a0c 5647
41c28a37
GM
5648/* Value is non-zero if OBJ will survive the current GC because it's
5649 either marked or does not need to be marked to survive. */
5650
5651int
971de7fb 5652survives_gc_p (Lisp_Object obj)
41c28a37
GM
5653{
5654 int survives_p;
177c0ea7 5655
8e50cc2d 5656 switch (XTYPE (obj))
41c28a37 5657 {
2de9f71c 5658 case_Lisp_Int:
41c28a37
GM
5659 survives_p = 1;
5660 break;
5661
5662 case Lisp_Symbol:
2336fe58 5663 survives_p = XSYMBOL (obj)->gcmarkbit;
41c28a37
GM
5664 break;
5665
5666 case Lisp_Misc:
67ee9f6e 5667 survives_p = XMISCANY (obj)->gcmarkbit;
41c28a37
GM
5668 break;
5669
5670 case Lisp_String:
08b7c2cb 5671 survives_p = STRING_MARKED_P (XSTRING (obj));
41c28a37
GM
5672 break;
5673
5674 case Lisp_Vectorlike:
8e50cc2d 5675 survives_p = SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
41c28a37
GM
5676 break;
5677
5678 case Lisp_Cons:
08b7c2cb 5679 survives_p = CONS_MARKED_P (XCONS (obj));
41c28a37
GM
5680 break;
5681
41c28a37 5682 case Lisp_Float:
ab6780cd 5683 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
41c28a37 5684 break;
41c28a37
GM
5685
5686 default:
5687 abort ();
5688 }
5689
34400008 5690 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
41c28a37
GM
5691}
5692
5693
7146af97 5694\f
1a4f1e2c 5695/* Sweep: find all structures not marked, and free them. */
7146af97
JB
5696
5697static void
971de7fb 5698gc_sweep (void)
7146af97 5699{
41c28a37
GM
5700 /* Remove or mark entries in weak hash tables.
5701 This must be done before any object is unmarked. */
5702 sweep_weak_hash_tables ();
5703
2e471eb5 5704 sweep_strings ();
676a7251
GM
5705#ifdef GC_CHECK_STRING_BYTES
5706 if (!noninteractive)
5707 check_string_bytes (1);
5708#endif
7146af97
JB
5709
5710 /* Put all unmarked conses on free list */
5711 {
5712 register struct cons_block *cblk;
6ca94ac9 5713 struct cons_block **cprev = &cons_block;
7146af97
JB
5714 register int lim = cons_block_index;
5715 register int num_free = 0, num_used = 0;
5716
5717 cons_free_list = 0;
177c0ea7 5718
6ca94ac9 5719 for (cblk = cons_block; cblk; cblk = *cprev)
7146af97 5720 {
3ae2e3a3 5721 register int i = 0;
6ca94ac9 5722 int this_free = 0;
3ae2e3a3
RS
5723 int ilim = (lim + BITS_PER_INT - 1) / BITS_PER_INT;
5724
5725 /* Scan the mark bits an int at a time. */
5726 for (i = 0; i <= ilim; i++)
5727 {
5728 if (cblk->gcmarkbits[i] == -1)
5729 {
5730 /* Fast path - all cons cells for this int are marked. */
5731 cblk->gcmarkbits[i] = 0;
5732 num_used += BITS_PER_INT;
5733 }
5734 else
5735 {
5736 /* Some cons cells for this int are not marked.
5737 Find which ones, and free them. */
5738 int start, pos, stop;
5739
5740 start = i * BITS_PER_INT;
5741 stop = lim - start;
5742 if (stop > BITS_PER_INT)
5743 stop = BITS_PER_INT;
5744 stop += start;
5745
5746 for (pos = start; pos < stop; pos++)
5747 {
5748 if (!CONS_MARKED_P (&cblk->conses[pos]))
5749 {
5750 this_free++;
5751 cblk->conses[pos].u.chain = cons_free_list;
5752 cons_free_list = &cblk->conses[pos];
34400008 5753#if GC_MARK_STACK
3ae2e3a3 5754 cons_free_list->car = Vdead;
34400008 5755#endif
3ae2e3a3
RS
5756 }
5757 else
5758 {
5759 num_used++;
5760 CONS_UNMARK (&cblk->conses[pos]);
5761 }
5762 }
5763 }
5764 }
5765
7146af97 5766 lim = CONS_BLOCK_SIZE;
6ca94ac9
KH
5767 /* If this block contains only free conses and we have already
5768 seen more than two blocks worth of free conses then deallocate
5769 this block. */
6feef451 5770 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
6ca94ac9 5771 {
6ca94ac9
KH
5772 *cprev = cblk->next;
5773 /* Unhook from the free list. */
28a099a4 5774 cons_free_list = cblk->conses[0].u.chain;
08b7c2cb 5775 lisp_align_free (cblk);
c8099634 5776 n_cons_blocks--;
6ca94ac9
KH
5777 }
5778 else
6feef451
AS
5779 {
5780 num_free += this_free;
5781 cprev = &cblk->next;
5782 }
7146af97
JB
5783 }
5784 total_conses = num_used;
5785 total_free_conses = num_free;
5786 }
5787
7146af97
JB
5788 /* Put all unmarked floats on free list */
5789 {
5790 register struct float_block *fblk;
6ca94ac9 5791 struct float_block **fprev = &float_block;
7146af97
JB
5792 register int lim = float_block_index;
5793 register int num_free = 0, num_used = 0;
5794
5795 float_free_list = 0;
177c0ea7 5796
6ca94ac9 5797 for (fblk = float_block; fblk; fblk = *fprev)
7146af97
JB
5798 {
5799 register int i;
6ca94ac9 5800 int this_free = 0;
7146af97 5801 for (i = 0; i < lim; i++)
ab6780cd 5802 if (!FLOAT_MARKED_P (&fblk->floats[i]))
7146af97 5803 {
6ca94ac9 5804 this_free++;
28a099a4 5805 fblk->floats[i].u.chain = float_free_list;
7146af97
JB
5806 float_free_list = &fblk->floats[i];
5807 }
5808 else
5809 {
5810 num_used++;
ab6780cd 5811 FLOAT_UNMARK (&fblk->floats[i]);
7146af97
JB
5812 }
5813 lim = FLOAT_BLOCK_SIZE;
6ca94ac9
KH
5814 /* If this block contains only free floats and we have already
5815 seen more than two blocks worth of free floats then deallocate
5816 this block. */
6feef451 5817 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
6ca94ac9 5818 {
6ca94ac9
KH
5819 *fprev = fblk->next;
5820 /* Unhook from the free list. */
28a099a4 5821 float_free_list = fblk->floats[0].u.chain;
ab6780cd 5822 lisp_align_free (fblk);
c8099634 5823 n_float_blocks--;
6ca94ac9
KH
5824 }
5825 else
6feef451
AS
5826 {
5827 num_free += this_free;
5828 fprev = &fblk->next;
5829 }
7146af97
JB
5830 }
5831 total_floats = num_used;
5832 total_free_floats = num_free;
5833 }
7146af97 5834
d5e35230
JA
5835 /* Put all unmarked intervals on free list */
5836 {
5837 register struct interval_block *iblk;
6ca94ac9 5838 struct interval_block **iprev = &interval_block;
d5e35230
JA
5839 register int lim = interval_block_index;
5840 register int num_free = 0, num_used = 0;
5841
5842 interval_free_list = 0;
5843
6ca94ac9 5844 for (iblk = interval_block; iblk; iblk = *iprev)
d5e35230
JA
5845 {
5846 register int i;
6ca94ac9 5847 int this_free = 0;
d5e35230
JA
5848
5849 for (i = 0; i < lim; i++)
5850 {
2336fe58 5851 if (!iblk->intervals[i].gcmarkbit)
d5e35230 5852 {
439d5cb4 5853 SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
d5e35230 5854 interval_free_list = &iblk->intervals[i];
6ca94ac9 5855 this_free++;
d5e35230
JA
5856 }
5857 else
5858 {
5859 num_used++;
2336fe58 5860 iblk->intervals[i].gcmarkbit = 0;
d5e35230
JA
5861 }
5862 }
5863 lim = INTERVAL_BLOCK_SIZE;
6ca94ac9
KH
5864 /* If this block contains only free intervals and we have already
5865 seen more than two blocks worth of free intervals then
5866 deallocate this block. */
6feef451 5867 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
6ca94ac9 5868 {
6ca94ac9
KH
5869 *iprev = iblk->next;
5870 /* Unhook from the free list. */
439d5cb4 5871 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
c8099634
RS
5872 lisp_free (iblk);
5873 n_interval_blocks--;
6ca94ac9
KH
5874 }
5875 else
6feef451
AS
5876 {
5877 num_free += this_free;
5878 iprev = &iblk->next;
5879 }
d5e35230
JA
5880 }
5881 total_intervals = num_used;
5882 total_free_intervals = num_free;
5883 }
d5e35230 5884
7146af97
JB
5885 /* Put all unmarked symbols on free list */
5886 {
5887 register struct symbol_block *sblk;
6ca94ac9 5888 struct symbol_block **sprev = &symbol_block;
7146af97
JB
5889 register int lim = symbol_block_index;
5890 register int num_free = 0, num_used = 0;
5891
d285b373 5892 symbol_free_list = NULL;
177c0ea7 5893
6ca94ac9 5894 for (sblk = symbol_block; sblk; sblk = *sprev)
7146af97 5895 {
6ca94ac9 5896 int this_free = 0;
d285b373
GM
5897 struct Lisp_Symbol *sym = sblk->symbols;
5898 struct Lisp_Symbol *end = sym + lim;
5899
5900 for (; sym < end; ++sym)
5901 {
20035321
SM
5902 /* Check if the symbol was created during loadup. In such a case
5903 it might be pointed to by pure bytecode which we don't trace,
5904 so we conservatively assume that it is live. */
8fe5665d 5905 int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
177c0ea7 5906
2336fe58 5907 if (!sym->gcmarkbit && !pure_p)
d285b373 5908 {
ce5b453a
SM
5909 if (sym->redirect == SYMBOL_LOCALIZED)
5910 xfree (SYMBOL_BLV (sym));
28a099a4 5911 sym->next = symbol_free_list;
d285b373 5912 symbol_free_list = sym;
34400008 5913#if GC_MARK_STACK
d285b373 5914 symbol_free_list->function = Vdead;
34400008 5915#endif
d285b373
GM
5916 ++this_free;
5917 }
5918 else
5919 {
5920 ++num_used;
5921 if (!pure_p)
8fe5665d 5922 UNMARK_STRING (XSTRING (sym->xname));
2336fe58 5923 sym->gcmarkbit = 0;
d285b373
GM
5924 }
5925 }
177c0ea7 5926
7146af97 5927 lim = SYMBOL_BLOCK_SIZE;
6ca94ac9
KH
5928 /* If this block contains only free symbols and we have already
5929 seen more than two blocks worth of free symbols then deallocate
5930 this block. */
6feef451 5931 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
6ca94ac9 5932 {
6ca94ac9
KH
5933 *sprev = sblk->next;
5934 /* Unhook from the free list. */
28a099a4 5935 symbol_free_list = sblk->symbols[0].next;
c8099634
RS
5936 lisp_free (sblk);
5937 n_symbol_blocks--;
6ca94ac9
KH
5938 }
5939 else
6feef451
AS
5940 {
5941 num_free += this_free;
5942 sprev = &sblk->next;
5943 }
7146af97
JB
5944 }
5945 total_symbols = num_used;
5946 total_free_symbols = num_free;
5947 }
5948
a9faeabe
RS
5949 /* Put all unmarked misc's on free list.
5950 For a marker, first unchain it from the buffer it points into. */
7146af97
JB
5951 {
5952 register struct marker_block *mblk;
6ca94ac9 5953 struct marker_block **mprev = &marker_block;
7146af97
JB
5954 register int lim = marker_block_index;
5955 register int num_free = 0, num_used = 0;
5956
5957 marker_free_list = 0;
177c0ea7 5958
6ca94ac9 5959 for (mblk = marker_block; mblk; mblk = *mprev)
7146af97
JB
5960 {
5961 register int i;
6ca94ac9 5962 int this_free = 0;
fa05e253 5963
7146af97 5964 for (i = 0; i < lim; i++)
465edf35 5965 {
d314756e 5966 if (!mblk->markers[i].u_any.gcmarkbit)
465edf35 5967 {
d314756e 5968 if (mblk->markers[i].u_any.type == Lisp_Misc_Marker)
ef89c2ce 5969 unchain_marker (&mblk->markers[i].u_marker);
fa05e253
RS
5970 /* Set the type of the freed object to Lisp_Misc_Free.
5971 We could leave the type alone, since nobody checks it,
465edf35 5972 but this might catch bugs faster. */
a5da44fe 5973 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
465edf35
KH
5974 mblk->markers[i].u_free.chain = marker_free_list;
5975 marker_free_list = &mblk->markers[i];
6ca94ac9 5976 this_free++;
465edf35
KH
5977 }
5978 else
5979 {
5980 num_used++;
d314756e 5981 mblk->markers[i].u_any.gcmarkbit = 0;
465edf35
KH
5982 }
5983 }
7146af97 5984 lim = MARKER_BLOCK_SIZE;
6ca94ac9
KH
5985 /* If this block contains only free markers and we have already
5986 seen more than two blocks worth of free markers then deallocate
5987 this block. */
6feef451 5988 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
6ca94ac9 5989 {
6ca94ac9
KH
5990 *mprev = mblk->next;
5991 /* Unhook from the free list. */
5992 marker_free_list = mblk->markers[0].u_free.chain;
c8099634
RS
5993 lisp_free (mblk);
5994 n_marker_blocks--;
6ca94ac9
KH
5995 }
5996 else
6feef451
AS
5997 {
5998 num_free += this_free;
5999 mprev = &mblk->next;
6000 }
7146af97
JB
6001 }
6002
6003 total_markers = num_used;
6004 total_free_markers = num_free;
6005 }
6006
6007 /* Free all unmarked buffers */
6008 {
6009 register struct buffer *buffer = all_buffers, *prev = 0, *next;
6010
6011 while (buffer)
3ef06d12 6012 if (!VECTOR_MARKED_P (buffer))
7146af97
JB
6013 {
6014 if (prev)
6015 prev->next = buffer->next;
6016 else
6017 all_buffers = buffer->next;
6018 next = buffer->next;
34400008 6019 lisp_free (buffer);
7146af97
JB
6020 buffer = next;
6021 }
6022 else
6023 {
3ef06d12 6024 VECTOR_UNMARK (buffer);
30e3190a 6025 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
7146af97
JB
6026 prev = buffer, buffer = buffer->next;
6027 }
6028 }
6029
7146af97
JB
6030 /* Free all unmarked vectors */
6031 {
6032 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
6033 total_vector_size = 0;
6034
6035 while (vector)
3ef06d12 6036 if (!VECTOR_MARKED_P (vector))
7146af97
JB
6037 {
6038 if (prev)
6039 prev->next = vector->next;
6040 else
6041 all_vectors = vector->next;
6042 next = vector->next;
c8099634
RS
6043 lisp_free (vector);
6044 n_vectors--;
7146af97 6045 vector = next;
41c28a37 6046
7146af97
JB
6047 }
6048 else
6049 {
3ef06d12 6050 VECTOR_UNMARK (vector);
fa05e253
RS
6051 if (vector->size & PSEUDOVECTOR_FLAG)
6052 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
6053 else
6054 total_vector_size += vector->size;
7146af97
JB
6055 prev = vector, vector = vector->next;
6056 }
6057 }
177c0ea7 6058
676a7251
GM
6059#ifdef GC_CHECK_STRING_BYTES
6060 if (!noninteractive)
6061 check_string_bytes (1);
6062#endif
7146af97 6063}
7146af97 6064
7146af97 6065
7146af97 6066
7146af97 6067\f
20d24714
JB
6068/* Debugging aids. */
6069
31ce1c91 6070DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
a6266d23 6071 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
228299fa 6072This may be helpful in debugging Emacs's memory usage.
7ee72033 6073We divide the value by 1024 to make sure it fits in a Lisp integer. */)
5842a27b 6074 (void)
20d24714
JB
6075{
6076 Lisp_Object end;
6077
45d12a89 6078 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
20d24714
JB
6079
6080 return end;
6081}
6082
310ea200 6083DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
a6266d23 6084 doc: /* Return a list of counters that measure how much consing there has been.
228299fa
GM
6085Each of these counters increments for a certain kind of object.
6086The counters wrap around from the largest positive integer to zero.
6087Garbage collection does not decrease them.
6088The elements of the value are as follows:
6089 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
6090All are in units of 1 = one object consed
6091except for VECTOR-CELLS and STRING-CHARS, which count the total length of
6092objects consed.
6093MISCS include overlays, markers, and some internal types.
6094Frames, windows, buffers, and subprocesses count as vectors
7ee72033 6095 (but the contents of a buffer's text do not count here). */)
5842a27b 6096 (void)
310ea200 6097{
2e471eb5 6098 Lisp_Object consed[8];
310ea200 6099
78e985eb
GM
6100 consed[0] = make_number (min (MOST_POSITIVE_FIXNUM, cons_cells_consed));
6101 consed[1] = make_number (min (MOST_POSITIVE_FIXNUM, floats_consed));
6102 consed[2] = make_number (min (MOST_POSITIVE_FIXNUM, vector_cells_consed));
6103 consed[3] = make_number (min (MOST_POSITIVE_FIXNUM, symbols_consed));
6104 consed[4] = make_number (min (MOST_POSITIVE_FIXNUM, string_chars_consed));
6105 consed[5] = make_number (min (MOST_POSITIVE_FIXNUM, misc_objects_consed));
6106 consed[6] = make_number (min (MOST_POSITIVE_FIXNUM, intervals_consed));
6107 consed[7] = make_number (min (MOST_POSITIVE_FIXNUM, strings_consed));
310ea200 6108
2e471eb5 6109 return Flist (8, consed);
310ea200 6110}
e0b8c689
KR
6111
6112int suppress_checking;
d3d47262 6113
e0b8c689 6114void
971de7fb 6115die (const char *msg, const char *file, int line)
e0b8c689 6116{
67ee9f6e 6117 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: %s\r\n",
e0b8c689
KR
6118 file, line, msg);
6119 abort ();
6120}
20d24714 6121\f
7146af97
JB
6122/* Initialization */
6123
dfcf069d 6124void
971de7fb 6125init_alloc_once (void)
7146af97
JB
6126{
6127 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
9e713715
GM
6128 purebeg = PUREBEG;
6129 pure_size = PURESIZE;
1f0b3fd2 6130 pure_bytes_used = 0;
e5bc14d4 6131 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
9e713715
GM
6132 pure_bytes_used_before_overflow = 0;
6133
ab6780cd
SM
6134 /* Initialize the list of free aligned blocks. */
6135 free_ablock = NULL;
6136
877935b1 6137#if GC_MARK_STACK || defined GC_MALLOC_CHECK
34400008
GM
6138 mem_init ();
6139 Vdead = make_pure_string ("DEAD", 4, 4, 0);
6140#endif
9e713715 6141
7146af97
JB
6142 all_vectors = 0;
6143 ignore_warnings = 1;
d1658221
RS
6144#ifdef DOUG_LEA_MALLOC
6145 mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
6146 mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
81d492d5 6147 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* max. number of mmap'ed areas */
d1658221 6148#endif
7146af97
JB
6149 init_strings ();
6150 init_cons ();
6151 init_symbol ();
6152 init_marker ();
7146af97 6153 init_float ();
34400008 6154 init_intervals ();
5ac58e4c 6155 init_weak_hash_tables ();
d5e35230 6156
276cbe5a
RS
6157#ifdef REL_ALLOC
6158 malloc_hysteresis = 32;
6159#else
6160 malloc_hysteresis = 0;
6161#endif
6162
24d8a105 6163 refill_memory_reserve ();
276cbe5a 6164
7146af97
JB
6165 ignore_warnings = 0;
6166 gcprolist = 0;
630686c8 6167 byte_stack_list = 0;
7146af97
JB
6168 staticidx = 0;
6169 consing_since_gc = 0;
7d179cea 6170 gc_cons_threshold = 100000 * sizeof (Lisp_Object);
974aae61 6171 gc_relative_threshold = 0;
7146af97
JB
6172}
6173
dfcf069d 6174void
971de7fb 6175init_alloc (void)
7146af97
JB
6176{
6177 gcprolist = 0;
630686c8 6178 byte_stack_list = 0;
182ff242
GM
6179#if GC_MARK_STACK
6180#if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
6181 setjmp_tested_p = longjmps_done = 0;
6182#endif
6183#endif
2c5bd608
DL
6184 Vgc_elapsed = make_float (0.0);
6185 gcs_done = 0;
7146af97
JB
6186}
6187
6188void
971de7fb 6189syms_of_alloc (void)
7146af97 6190{
7ee72033 6191 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
a6266d23 6192 doc: /* *Number of bytes of consing between garbage collections.
228299fa
GM
6193Garbage collection can happen automatically once this many bytes have been
6194allocated since the last garbage collection. All data types count.
7146af97 6195
228299fa 6196Garbage collection happens automatically only when `eval' is called.
7146af97 6197
228299fa 6198By binding this temporarily to a large number, you can effectively
96f077ad
SM
6199prevent garbage collection during a part of the program.
6200See also `gc-cons-percentage'. */);
6201
6202 DEFVAR_LISP ("gc-cons-percentage", &Vgc_cons_percentage,
6203 doc: /* *Portion of the heap used for allocation.
6204Garbage collection can happen automatically once this portion of the heap
6205has been allocated since the last garbage collection.
6206If this portion is smaller than `gc-cons-threshold', this is ignored. */);
6207 Vgc_cons_percentage = make_float (0.1);
0819585c 6208
7ee72033 6209 DEFVAR_INT ("pure-bytes-used", &pure_bytes_used,
a6266d23 6210 doc: /* Number of bytes of sharable Lisp data allocated so far. */);
0819585c 6211
7ee72033 6212 DEFVAR_INT ("cons-cells-consed", &cons_cells_consed,
a6266d23 6213 doc: /* Number of cons cells that have been consed so far. */);
0819585c 6214
7ee72033 6215 DEFVAR_INT ("floats-consed", &floats_consed,
a6266d23 6216 doc: /* Number of floats that have been consed so far. */);
0819585c 6217
7ee72033 6218 DEFVAR_INT ("vector-cells-consed", &vector_cells_consed,
a6266d23 6219 doc: /* Number of vector cells that have been consed so far. */);
0819585c 6220
7ee72033 6221 DEFVAR_INT ("symbols-consed", &symbols_consed,
a6266d23 6222 doc: /* Number of symbols that have been consed so far. */);
0819585c 6223
7ee72033 6224 DEFVAR_INT ("string-chars-consed", &string_chars_consed,
a6266d23 6225 doc: /* Number of string characters that have been consed so far. */);
0819585c 6226
7ee72033 6227 DEFVAR_INT ("misc-objects-consed", &misc_objects_consed,
a6266d23 6228 doc: /* Number of miscellaneous objects that have been consed so far. */);
2e471eb5 6229
7ee72033 6230 DEFVAR_INT ("intervals-consed", &intervals_consed,
a6266d23 6231 doc: /* Number of intervals that have been consed so far. */);
7146af97 6232
7ee72033 6233 DEFVAR_INT ("strings-consed", &strings_consed,
a6266d23 6234 doc: /* Number of strings that have been consed so far. */);
228299fa 6235
7ee72033 6236 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
a6266d23 6237 doc: /* Non-nil means loading Lisp code in order to dump an executable.
e9515805
SM
6238This means that certain objects should be allocated in shared (pure) space.
6239It can also be set to a hash-table, in which case this table is used to
6240do hash-consing of the objects allocated to pure space. */);
228299fa 6241
7ee72033 6242 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
a6266d23 6243 doc: /* Non-nil means display messages at start and end of garbage collection. */);
299585ee
RS
6244 garbage_collection_messages = 0;
6245
7ee72033 6246 DEFVAR_LISP ("post-gc-hook", &Vpost_gc_hook,
a6266d23 6247 doc: /* Hook run after garbage collection has finished. */);
9e713715 6248 Vpost_gc_hook = Qnil;
d67b4f80 6249 Qpost_gc_hook = intern_c_string ("post-gc-hook");
9e713715
GM
6250 staticpro (&Qpost_gc_hook);
6251
74a54b04
RS
6252 DEFVAR_LISP ("memory-signal-data", &Vmemory_signal_data,
6253 doc: /* Precomputed `signal' argument for memory-full error. */);
bcb61d60
KH
6254 /* We build this in advance because if we wait until we need it, we might
6255 not be able to allocate the memory to hold it. */
74a54b04 6256 Vmemory_signal_data
f4265f6c
DN
6257 = pure_cons (Qerror,
6258 pure_cons (make_pure_c_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"), Qnil));
74a54b04
RS
6259
6260 DEFVAR_LISP ("memory-full", &Vmemory_full,
24d8a105 6261 doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);
74a54b04 6262 Vmemory_full = Qnil;
bcb61d60 6263
e8197642 6264 staticpro (&Qgc_cons_threshold);
d67b4f80 6265 Qgc_cons_threshold = intern_c_string ("gc-cons-threshold");
e8197642 6266
a59de17b 6267 staticpro (&Qchar_table_extra_slots);
d67b4f80 6268 Qchar_table_extra_slots = intern_c_string ("char-table-extra-slots");
a59de17b 6269
2c5bd608
DL
6270 DEFVAR_LISP ("gc-elapsed", &Vgc_elapsed,
6271 doc: /* Accumulated time elapsed in garbage collections.
e7415487 6272The time is in seconds as a floating point value. */);
2c5bd608 6273 DEFVAR_INT ("gcs-done", &gcs_done,
e7415487 6274 doc: /* Accumulated number of garbage collections done. */);
2c5bd608 6275
7146af97
JB
6276 defsubr (&Scons);
6277 defsubr (&Slist);
6278 defsubr (&Svector);
6279 defsubr (&Smake_byte_code);
6280 defsubr (&Smake_list);
6281 defsubr (&Smake_vector);
6282 defsubr (&Smake_string);
7b07587b 6283 defsubr (&Smake_bool_vector);
7146af97
JB
6284 defsubr (&Smake_symbol);
6285 defsubr (&Smake_marker);
6286 defsubr (&Spurecopy);
6287 defsubr (&Sgarbage_collect);
20d24714 6288 defsubr (&Smemory_limit);
310ea200 6289 defsubr (&Smemory_use_counts);
34400008
GM
6290
6291#if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
6292 defsubr (&Sgc_status);
6293#endif
7146af97 6294}
005ca5c7
DL
6295
6296/* arch-tag: 6695ca10-e3c5-4c2c-8bc3-ed26a7dda857
6297 (do not change this comment) */