annotate src/alloc.c @ 112352:19348bd13f81

Improve performance on non-GCC hosts with __aligned__.
author Paul Eggert <eggert@cs.ucla.edu>
date Mon, 17 Jan 2011 20:54:23 -0800
parents 56d3e9c28eb0
children 42e22c4f06b7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* Storage allocation and gc for GNU Emacs Lisp interpreter.
57098
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
2 Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999,
112125
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
79759
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78811
diff changeset
4 Free Software Foundation, Inc.
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 This file is part of GNU Emacs.
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94293
diff changeset
8 GNU Emacs is free software: you can redistribute it and/or modify
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94293
diff changeset
10 the Free Software Foundation, either version 3 of the License, or
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94293
diff changeset
11 (at your option) any later version.
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 GNU Emacs is distributed in the hope that it will be useful,
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 GNU General Public License for more details.
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94293
diff changeset
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25762
diff changeset
21 #include <config.h>
28374
7a3e8a76057b Include stdio.h. Test STDC_HEADERS, not __STDC__.
Dave Love <fx@gnu.org>
parents: 28365
diff changeset
22 #include <stdio.h>
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
23 #include <limits.h> /* For CHAR_BIT. */
105669
68dd71358159 * alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104582
diff changeset
24 #include <setjmp.h>
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 25762
diff changeset
25
47185
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
26 #ifdef ALLOC_DEBUG
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
27 #undef INLINE
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
28 #endif
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
29
3003
5a73d384f45e * syssignal.h: Don't #include <signal.h>
Jim Blandy <jimb@redhat.com>
parents: 2961
diff changeset
30 #include <signal.h>
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
32 #ifdef HAVE_GTK_AND_PTHREAD
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
33 #include <pthread.h>
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
34 #endif
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
35
26164
d39ec0a27081 more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents: 26088
diff changeset
36 /* This file is part of the core Lisp implementation, and thus must
d39ec0a27081 more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents: 26088
diff changeset
37 deal with the real data structures. If the Lisp implementation is
d39ec0a27081 more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents: 26088
diff changeset
38 replaced, this file likely will not be used. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
39
26164
d39ec0a27081 more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents: 26088
diff changeset
40 #undef HIDE_LISP_IMPLEMENTATION
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 #include "lisp.h"
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
42 #include "process.h"
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
43 #include "intervals.h"
356
5b180834eacf *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 300
diff changeset
44 #include "puresize.h"
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 #include "buffer.h"
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 #include "window.h"
31102
6a0caa788013 Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents: 30914
diff changeset
47 #include "keyboard.h"
764
bb24f1180bb6 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 727
diff changeset
48 #include "frame.h"
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
49 #include "blockinput.h"
88353
8e996bb689ca Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents: 43314
diff changeset
50 #include "character.h"
638
40b255f55df3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 624
diff changeset
51 #include "syssignal.h"
84693
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
52 #include "termhooks.h" /* For struct terminal. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
53 #include <setjmp.h>
638
40b255f55df3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 624
diff changeset
54
52547
623355edbb1d (GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents: 52475
diff changeset
55 /* GC_MALLOC_CHECK defined means perform validity checks of malloc'd
623355edbb1d (GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents: 52475
diff changeset
56 memory. Can do this only if using gmalloc.c. */
623355edbb1d (GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents: 52475
diff changeset
57
623355edbb1d (GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents: 52475
diff changeset
58 #if defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC
623355edbb1d (GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents: 52475
diff changeset
59 #undef GC_MALLOC_CHECK
623355edbb1d (GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents: 52475
diff changeset
60 #endif
623355edbb1d (GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents: 52475
diff changeset
61
30784
dbc1e69a89a9 [HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents: 30557
diff changeset
62 #include <unistd.h>
112317
7df2e30d72ec Include <unistd.h> unilaterally.
Paul Eggert <eggert@cs.ucla.edu>
parents: 112125
diff changeset
63 #ifndef HAVE_UNISTD_H
30784
dbc1e69a89a9 [HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents: 30557
diff changeset
64 extern POINTER_TYPE *sbrk ();
dbc1e69a89a9 [HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents: 30557
diff changeset
65 #endif
12096
cdc859dd813b Declare sbrk.
Karl Heuer <kwzh@gnu.org>
parents: 11892
diff changeset
66
67216
fc58516afccd Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents: 66889
diff changeset
67 #include <fcntl.h>
fc58516afccd Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents: 66889
diff changeset
68
72177
4eba80d54b43 [WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 72167
diff changeset
69 #ifdef WINDOWSNT
72288
94e8cc9b752d Include w32.h.
Eli Zaretskii <eliz@gnu.org>
parents: 72177
diff changeset
70 #include "w32.h"
72177
4eba80d54b43 [WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 72167
diff changeset
71 #endif
4eba80d54b43 [WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents: 72167
diff changeset
72
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
73 #ifdef DOUG_LEA_MALLOC
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
74
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
75 #include <malloc.h>
31892
2f3d88ac2b38 (__malloc_size_t) [DOUG_LEA_MALLOC]: Don't redefine it.
Dave Love <fx@gnu.org>
parents: 31889
diff changeset
76 /* malloc.h #defines this as size_t, at least in glibc2. */
2f3d88ac2b38 (__malloc_size_t) [DOUG_LEA_MALLOC]: Don't redefine it.
Dave Love <fx@gnu.org>
parents: 31889
diff changeset
77 #ifndef __malloc_size_t
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
78 #define __malloc_size_t int
31892
2f3d88ac2b38 (__malloc_size_t) [DOUG_LEA_MALLOC]: Don't redefine it.
Dave Love <fx@gnu.org>
parents: 31889
diff changeset
79 #endif
23973
2eb9e2f5aa33 (MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 23958
diff changeset
80
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
81 /* Specify maximum number of areas to mmap. It would be nice to use a
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
82 value that explicitly means "no limit". */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
83
23973
2eb9e2f5aa33 (MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 23958
diff changeset
84 #define MMAP_MAX_AREAS 100000000
2eb9e2f5aa33 (MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 23958
diff changeset
85
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
86 #else /* not DOUG_LEA_MALLOC */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
87
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
88 /* The following come from gmalloc.c. */
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
89
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
90 #define __malloc_size_t size_t
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
91 extern __malloc_size_t _bytes_used;
31892
2f3d88ac2b38 (__malloc_size_t) [DOUG_LEA_MALLOC]: Don't redefine it.
Dave Love <fx@gnu.org>
parents: 31889
diff changeset
92 extern __malloc_size_t __malloc_extra_blocks;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
93
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
94 #endif /* not DOUG_LEA_MALLOC */
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
95
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
96 #if ! defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD)
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
97
58831
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
98 /* When GTK uses the file chooser dialog, different backends can be loaded
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
99 dynamically. One such a backend is the Gnome VFS backend that gets loaded
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
100 if you run Gnome. That backend creates several threads and also allocates
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
101 memory with malloc.
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
102
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
103 If Emacs sets malloc hooks (! SYSTEM_MALLOC) and the emacs_blocked_*
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
104 functions below are called from malloc, there is a chance that one
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
105 of these threads preempts the Emacs main thread and the hook variables
58986
59945307b86b * syssignal.h: Declare main_thread.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58831
diff changeset
106 end up in an inconsistent state. So we have a mutex to prevent that (note
58831
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
107 that the backend handles concurrent access to malloc within its own threads
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
108 but Emacs code running in the main thread is not included in that control).
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
109
59359
1678d14c4109 (refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59314
diff changeset
110 When UNBLOCK_INPUT is called, reinvoke_input_signal may be called. If this
58831
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
111 happens in one of the backend threads we will have two threads that tries
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
112 to run Emacs code at once, and the code is not prepared for that.
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
113 To prevent that, we only call BLOCK/UNBLOCK from the main thread. */
408c5135b0a2 * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58818
diff changeset
114
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
115 static pthread_mutex_t alloc_mutex;
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
116
75192
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
117 #define BLOCK_INPUT_ALLOC \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
118 do \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
119 { \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
120 if (pthread_equal (pthread_self (), main_thread)) \
75406
b176aeeb7253 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 75348
diff changeset
121 BLOCK_INPUT; \
75192
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
122 pthread_mutex_lock (&alloc_mutex); \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
123 } \
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
124 while (0)
75192
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
125 #define UNBLOCK_INPUT_ALLOC \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
126 do \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
127 { \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
128 pthread_mutex_unlock (&alloc_mutex); \
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
129 if (pthread_equal (pthread_self (), main_thread)) \
75406
b176aeeb7253 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 75348
diff changeset
130 UNBLOCK_INPUT; \
75192
a62f8b0494a2 (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents: 73964
diff changeset
131 } \
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
132 while (0)
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
133
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
134 #else /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
135
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
136 #define BLOCK_INPUT_ALLOC BLOCK_INPUT
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
137 #define UNBLOCK_INPUT_ALLOC UNBLOCK_INPUT
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
138
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
139 #endif /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
140
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
141 /* Value of _bytes_used, when spare_memory was freed. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
142
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
143 static __malloc_size_t bytes_used_when_full;
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
144
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
145 /* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
146 to a struct Lisp_String. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
147
51985
b52e88c3d6d0 (MARK_STRING, UNMARK_STRING, STRING_MARKED_P)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51974
diff changeset
148 #define MARK_STRING(S) ((S)->size |= ARRAY_MARK_FLAG)
b52e88c3d6d0 (MARK_STRING, UNMARK_STRING, STRING_MARKED_P)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51974
diff changeset
149 #define UNMARK_STRING(S) ((S)->size &= ~ARRAY_MARK_FLAG)
59657
f3aa25eacdb3 (STRING_MARKED_P, VECTOR_MARKED_P): Return boolean.
Kim F. Storm <storm@cua.dk>
parents: 59400
diff changeset
150 #define STRING_MARKED_P(S) (((S)->size & ARRAY_MARK_FLAG) != 0)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
151
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
152 #define VECTOR_MARK(V) ((V)->size |= ARRAY_MARK_FLAG)
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
153 #define VECTOR_UNMARK(V) ((V)->size &= ~ARRAY_MARK_FLAG)
59657
f3aa25eacdb3 (STRING_MARKED_P, VECTOR_MARKED_P): Return boolean.
Kim F. Storm <storm@cua.dk>
parents: 59400
diff changeset
154 #define VECTOR_MARKED_P(V) (((V)->size & ARRAY_MARK_FLAG) != 0)
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
155
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
156 /* Value is the number of bytes/chars of S, a pointer to a struct
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
157 Lisp_String. This must be used instead of STRING_BYTES (S) or
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
158 S->size during GC, because S->size contains the mark bit for
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
159 strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
160
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
161 #define GC_STRING_BYTES(S) (STRING_BYTES (S))
51985
b52e88c3d6d0 (MARK_STRING, UNMARK_STRING, STRING_MARKED_P)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51974
diff changeset
162 #define GC_STRING_CHARS(S) ((S)->size & ~ARRAY_MARK_FLAG)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
163
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
164 /* Number of bytes of consing done since the last gc. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
165
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 int consing_since_gc;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
168 /* Count the amount of consing of various sorts of space. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
169
43713
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
170 EMACS_INT cons_cells_consed;
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
171 EMACS_INT floats_consed;
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
172 EMACS_INT vector_cells_consed;
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
173 EMACS_INT symbols_consed;
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
174 EMACS_INT string_chars_consed;
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
175 EMACS_INT misc_objects_consed;
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
176 EMACS_INT intervals_consed;
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
177 EMACS_INT strings_consed;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
178
64611
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
179 /* Minimum number of bytes of consing since GC before next GC. */
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
180
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
181 EMACS_INT gc_cons_threshold;
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
182
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
183 /* Similar minimum, computed from Vgc_cons_percentage. */
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
184
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
185 EMACS_INT gc_relative_threshold;
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
186
64267
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
187 static Lisp_Object Vgc_cons_percentage;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
189 /* Minimum number of bytes of consing since GC before next GC,
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
190 when memory is full. */
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
191
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
192 EMACS_INT memory_full_cons_threshold;
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
193
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
194 /* Nonzero during GC. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
195
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 int gc_in_progress;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197
50745
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
198 /* Nonzero means abort if try to GC.
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
199 This is for code which is written on the assumption that
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
200 no GC will happen, so as to verify that assumption. */
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
201
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
202 int abort_on_gc;
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
203
14959
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
204 /* Nonzero means display messages at beginning and end of GC. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
205
14959
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
206 int garbage_collection_messages;
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
207
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
208 /* Number of live and free conses etc. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
209
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
210 static int total_conses, total_markers, total_symbols, total_vector_size;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
211 static int total_free_conses, total_free_markers, total_free_symbols;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
212 static int total_free_floats, total_floats;
19332
58f14958f5d5 (free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18621
diff changeset
213
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
214 /* Points to memory space allocated as "spare", to be freed if we run
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
215 out of memory. We keep one large block, four cons-blocks, and
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
216 two string blocks. */
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
217
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
218 static char *spare_memory[7];
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
219
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
220 /* Amount of spare memory to keep in large reserve block. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
221
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
222 #define SPARE_MEMORY (1 << 14)
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
223
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
224 /* Number of extra blocks malloc should get when it needs more core. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
225
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
226 static int malloc_hysteresis;
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
227
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
228 /* Non-nil means defun should do purecopy on the function definition. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
229
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 Lisp_Object Vpurify_flag;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231
46305
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
232 /* Non-nil means we are handling a memory-full error. */
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
233
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
234 Lisp_Object Vmemory_full;
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
235
57137
646750cbd594 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 57098
diff changeset
236 /* Initialize it to a nonzero value to force it into data space
646750cbd594 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 57098
diff changeset
237 (rather than bss space). That way unexec will remap it into text
646750cbd594 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 57098
diff changeset
238 space (pure), on some systems. We have not implemented the
646750cbd594 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 57098
diff changeset
239 remapping on more recent systems because this is less important
646750cbd594 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 57098
diff changeset
240 nowadays than in the days of small memories and timesharing. */
51908
cb3976b5e59f (pure, staticvec): Initialize these arrays to nonzero, so that they're
Paul Eggert <eggert@twinsun.com>
parents: 51907
diff changeset
241
78593
5d078cae9374 (pure): Round PURESIZE up.
Andreas Schwab <schwab@suse.de>
parents: 78260
diff changeset
242 EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 #define PUREBEG (char *) pure
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
244
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
245 /* Pointer to the pure area, and its size. */
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
246
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
247 static char *purebeg;
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
248 static size_t pure_size;
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
249
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
250 /* Number of bytes of pure storage used before pure storage overflowed.
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
251 If this is non-zero, this implies that an overflow occurred. */
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
252
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
253 static size_t pure_bytes_used_before_overflow;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
255 /* Value is non-zero if P points into pure space. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
256
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
257 #define PURE_POINTER_P(P) \
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
258 (((PNTR_COMPARISON_TYPE) (P) \
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
259 < (PNTR_COMPARISON_TYPE) ((char *) purebeg + pure_size)) \
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
260 && ((PNTR_COMPARISON_TYPE) (P) \
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
261 >= (PNTR_COMPARISON_TYPE) purebeg))
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
262
72027
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
263 /* Total number of bytes allocated in pure storage. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
264
43713
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43314
diff changeset
265 EMACS_INT pure_bytes_used;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266
72027
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
267 /* Index in pure at which next pure Lisp object will be allocated.. */
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
268
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
269 static EMACS_INT pure_bytes_used_lisp;
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
270
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
271 /* Number of bytes allocated for non-Lisp objects in pure storage. */
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
272
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
273 static EMACS_INT pure_bytes_used_non_lisp;
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
274
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
275 /* If nonzero, this is a warning delivered by malloc and not yet
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
276 displayed. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
277
109313
e856a274549b Constify functions taking char *
Andreas Schwab <schwab@linux-m68k.org>
parents: 109302
diff changeset
278 const char *pending_malloc_warning;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279
6116
64417bbbb128 (memory_full): Use new variable memory_signal_data with precomputed value
Karl Heuer <kwzh@gnu.org>
parents: 5874
diff changeset
280 /* Pre-computed signal argument for use when memory is exhausted. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
281
46305
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
282 Lisp_Object Vmemory_signal_data;
6116
64417bbbb128 (memory_full): Use new variable memory_signal_data with precomputed value
Karl Heuer <kwzh@gnu.org>
parents: 5874
diff changeset
283
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 /* Maximum amount of C stack to save when a GC happens. */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286 #ifndef MAX_SAVE_STACK
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 #define MAX_SAVE_STACK 16000
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 #endif
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 /* Buffer in which we save a copy of the C stack at each GC. */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
292 static char *stack_copy;
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
293 static int stack_copy_size;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
295 /* Non-zero means ignore malloc warnings. Set during initialization.
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
296 Currently not used. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
297
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
298 static int ignore_warnings;
1318
0edeba6fc9fc Fixed typos.
Joseph Arceneaux <jla@gnu.org>
parents: 1300
diff changeset
299
13219
99b5164a319d (Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 13150
diff changeset
300 Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots;
11374
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
301
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
302 /* Hook run after GC has finished. */
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
303
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
304 Lisp_Object Vpost_gc_hook, Qpost_gc_hook;
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
305
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
306 Lisp_Object Vgc_elapsed; /* accumulated elapsed time in GC */
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
307 EMACS_INT gcs_done; /* accumulated GCs */
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
308
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
309 static void mark_buffer (Lisp_Object);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
310 static void mark_terminals (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
311 extern void mark_kboards (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
312 extern void mark_ttys (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
313 extern void mark_backtrace (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
314 static void gc_sweep (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
315 static void mark_glyph_matrix (struct glyph_matrix *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
316 static void mark_face_cache (struct face_cache *);
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
317
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
318 #ifdef HAVE_WINDOW_SYSTEM
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
319 extern void mark_fringe_data (void);
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
320 #endif /* HAVE_WINDOW_SYSTEM */
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
321
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
322 static struct Lisp_String *allocate_string (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
323 static void compact_small_strings (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
324 static void free_large_strings (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
325 static void sweep_strings (void);
20495
db1be942dc12 (Fgarbage_collect):
Richard M. Stallman <rms@gnu.org>
parents: 20391
diff changeset
326
db1be942dc12 (Fgarbage_collect):
Richard M. Stallman <rms@gnu.org>
parents: 20391
diff changeset
327 extern int message_enable_multibyte;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
328
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
329 /* When scanning the C stack for live Lisp objects, Emacs keeps track
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
330 of what memory allocated via lisp_malloc is intended for what
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
331 purpose. This enumeration specifies the type of memory. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
332
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
333 enum mem_type
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
334 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
335 MEM_TYPE_NON_LISP,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
336 MEM_TYPE_BUFFER,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
337 MEM_TYPE_CONS,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
338 MEM_TYPE_STRING,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
339 MEM_TYPE_MISC,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
340 MEM_TYPE_SYMBOL,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
341 MEM_TYPE_FLOAT,
84978
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
342 /* We used to keep separate mem_types for subtypes of vectors such as
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
343 process, hash_table, frame, terminal, and window, but we never made
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
344 use of the distinction, so it only caused source-code complexity
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
345 and runtime slowdown. Minor but pointless. */
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
346 MEM_TYPE_VECTORLIKE
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
347 };
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
348
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
349 static POINTER_TYPE *lisp_align_malloc (size_t, enum mem_type);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
350 static POINTER_TYPE *lisp_malloc (size_t, enum mem_type);
66662
6ab8d86f8a2b (refill_memory_reserve): Move decl out of conditionals.
Richard M. Stallman <rms@gnu.org>
parents: 66547
diff changeset
351
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
352
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
353 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
27746
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
354
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
355 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
356 #include <stdio.h> /* For fprintf. */
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
357 #endif
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
358
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
359 /* A unique object in pure space used to make some Lisp objects
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
360 on free lists recognizable in O(1). */
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
361
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
362 static Lisp_Object Vdead;
27746
2556e20596b8 (enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents: 27738
diff changeset
363
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
364 #ifdef GC_MALLOC_CHECK
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
365
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
366 enum mem_type allocated_mem_type;
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
367 static int dont_register_blocks;
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
368
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
369 #endif /* GC_MALLOC_CHECK */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
370
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
371 /* A node in the red-black tree describing allocated memory containing
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
372 Lisp data. Each such block is recorded with its start and end
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
373 address when it is allocated, and removed from the tree when it
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
374 is freed.
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
375
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
376 A red-black tree is a balanced binary tree with the following
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
377 properties:
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
378
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
379 1. Every node is either red or black.
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
380 2. Every leaf is black.
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
381 3. If a node is red, then both of its children are black.
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
382 4. Every simple path from a node to a descendant leaf contains
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
383 the same number of black nodes.
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
384 5. The root is always black.
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
385
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
386 When nodes are inserted into the tree, or deleted from the tree,
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
387 the tree is "fixed" so that these properties are always true.
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
388
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
389 A red-black tree with N internal nodes has height at most 2
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
390 log(N+1). Searches, insertions and deletions are done in O(log N).
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
391 Please see a text book about data structures for a detailed
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
392 description of red-black trees. Any book worth its salt should
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
393 describe them. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
394
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
395 struct mem_node
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
396 {
48907
3bf6323fe318 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 48316
diff changeset
397 /* Children of this node. These pointers are never NULL. When there
3bf6323fe318 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 48316
diff changeset
398 is no child, the value is MEM_NIL, which points to a dummy node. */
3bf6323fe318 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 48316
diff changeset
399 struct mem_node *left, *right;
3bf6323fe318 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 48316
diff changeset
400
3bf6323fe318 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 48316
diff changeset
401 /* The parent of this node. In the root node, this is NULL. */
3bf6323fe318 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 48316
diff changeset
402 struct mem_node *parent;
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
403
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
404 /* Start and end of allocated region. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
405 void *start, *end;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
406
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
407 /* Node color. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
408 enum {MEM_BLACK, MEM_RED} color;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
409
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
410 /* Memory type. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
411 enum mem_type type;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
412 };
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
413
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
414 /* Base address of stack. Set in main. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
415
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
416 Lisp_Object *stack_base;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
417
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
418 /* Root of the tree describing allocated Lisp memory. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
419
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
420 static struct mem_node *mem_root;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
421
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
422 /* Lowest and highest known address in the heap. */
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
423
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
424 static void *min_heap_address, *max_heap_address;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
425
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
426 /* Sentinel node of the tree. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
427
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
428 static struct mem_node mem_z;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
429 #define MEM_NIL &mem_z
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
430
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
431 static struct Lisp_Vector *allocate_vectorlike (EMACS_INT);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
432 static void lisp_free (POINTER_TYPE *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
433 static void mark_stack (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
434 static int live_vector_p (struct mem_node *, void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
435 static int live_buffer_p (struct mem_node *, void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
436 static int live_string_p (struct mem_node *, void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
437 static int live_cons_p (struct mem_node *, void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
438 static int live_symbol_p (struct mem_node *, void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
439 static int live_float_p (struct mem_node *, void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
440 static int live_misc_p (struct mem_node *, void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
441 static void mark_maybe_object (Lisp_Object);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
442 static void mark_memory (void *, void *, int);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
443 static void mem_init (void);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
444 static struct mem_node *mem_insert (void *, void *, enum mem_type);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
445 static void mem_insert_fixup (struct mem_node *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
446 static void mem_rotate_left (struct mem_node *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
447 static void mem_rotate_right (struct mem_node *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
448 static void mem_delete (struct mem_node *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
449 static void mem_delete_fixup (struct mem_node *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
450 static INLINE struct mem_node *mem_find (void *);
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
451
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
452
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
453 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
454 static void check_gcpros (void);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
455 #endif
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
456
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
457 #endif /* GC_MARK_STACK || GC_MALLOC_CHECK */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
458
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
459 /* Recording what needs to be marked for gc. */
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
460
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
461 struct gcpro *gcprolist;
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
462
51908
cb3976b5e59f (pure, staticvec): Initialize these arrays to nonzero, so that they're
Paul Eggert <eggert@twinsun.com>
parents: 51907
diff changeset
463 /* Addresses of staticpro'd variables. Initialize it to a nonzero
cb3976b5e59f (pure, staticvec): Initialize these arrays to nonzero, so that they're
Paul Eggert <eggert@twinsun.com>
parents: 51907
diff changeset
464 value; otherwise some compilers put it into BSS. */
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
465
97230
a279d4c66e68 (NSTATICS): Bump to 0x640.
Eli Zaretskii <eliz@gnu.org>
parents: 96602
diff changeset
466 #define NSTATICS 0x640
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
467 static Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag};
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
468
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
469 /* Index of next unused slot in staticvec. */
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
470
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
471 static int staticidx = 0;
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
472
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
473 static POINTER_TYPE *pure_alloc (size_t, int);
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
474
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
475
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
476 /* Value is SZ rounded up to the next multiple of ALIGNMENT.
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
477 ALIGNMENT must be a power of 2. */
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
478
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
479 #define ALIGN(ptr, ALIGNMENT) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
480 ((POINTER_TYPE *) ((((EMACS_UINT)(ptr)) + (ALIGNMENT) - 1) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
481 & ~((ALIGNMENT) - 1)))
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
482
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
483
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
484
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
485 /************************************************************************
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
486 Malloc
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
487 ************************************************************************/
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
488
47185
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
489 /* Function malloc calls this if it finds we are near exhausting storage. */
20375
1dd0bd0749b5 (malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents: 20057
diff changeset
490
1dd0bd0749b5 (malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents: 20057
diff changeset
491 void
109313
e856a274549b Constify functions taking char *
Andreas Schwab <schwab@linux-m68k.org>
parents: 109302
diff changeset
492 malloc_warning (const char *str)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
493 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
494 pending_malloc_warning = str;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
495 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
496
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
497
47185
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
498 /* Display an already-pending malloc warning. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
499
20375
1dd0bd0749b5 (malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents: 20057
diff changeset
500 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
501 display_malloc_warning (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
502 {
47185
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
503 call3 (intern ("display-warning"),
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
504 intern ("alloc"),
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
505 build_string (pending_malloc_warning),
2ff45b08a155 (display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents: 46833
diff changeset
506 intern ("emergency"));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
507 pending_malloc_warning = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
510
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
511 #ifdef DOUG_LEA_MALLOC
66547
9373f926904a (BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents: 66541
diff changeset
512 # define BYTES_USED (mallinfo ().uordblks)
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
513 #else
17831
9238a2254a23 (BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents: 17348
diff changeset
514 # define BYTES_USED _bytes_used
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
515 #endif
65832
5159ee08b219 (refill_memory_reserve): Conditionalize the body, not the function's existence.
Richard M. Stallman <rms@gnu.org>
parents: 65764
diff changeset
516
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
517 /* Called if we can't allocate relocatable space for a buffer. */
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
518
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
519 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
520 buffer_memory_full (void)
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
521 {
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
522 /* If buffers use the relocating allocator, no need to free
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
523 spare_memory, because we may have plenty of malloc space left
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
524 that we could get, and if we don't, the malloc that fails will
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
525 itself cause spare_memory to be freed. If buffers don't use the
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
526 relocating allocator, treat this like any other failing
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
527 malloc. */
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
528
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
529 #ifndef REL_ALLOC
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
530 memory_full ();
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
531 #endif
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
532
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
533 /* This used to call error, but if we've run out of memory, we could
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
534 get infinite recursion trying to build the string. */
71967
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
535 xsignal (Qnil, Vmemory_signal_data);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
536 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
538
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
539 #ifdef XMALLOC_OVERRUN_CHECK
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
540
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
541 /* Check for overrun in malloc'ed buffers by wrapping a 16 byte header
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
542 and a 16 byte trailer around each block.
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
543
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
544 The header consists of 12 fixed bytes + a 4 byte integer contaning the
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
545 original block size, while the trailer consists of 16 fixed bytes.
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
546
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
547 The header is used to detect whether this block has been allocated
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
548 through these functions -- as it seems that some low-level libc
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
549 functions may bypass the malloc hooks.
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
550 */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
551
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
552
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
553 #define XMALLOC_OVERRUN_CHECK_SIZE 16
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
554
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
555 static char xmalloc_overrun_check_header[XMALLOC_OVERRUN_CHECK_SIZE-4] =
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
556 { 0x9a, 0x9b, 0xae, 0xaf,
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
557 0xbf, 0xbe, 0xce, 0xcf,
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
558 0xea, 0xeb, 0xec, 0xed };
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
559
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
560 static char xmalloc_overrun_check_trailer[XMALLOC_OVERRUN_CHECK_SIZE] =
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
561 { 0xaa, 0xab, 0xac, 0xad,
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
562 0xba, 0xbb, 0xbc, 0xbd,
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
563 0xca, 0xcb, 0xcc, 0xcd,
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
564 0xda, 0xdb, 0xdc, 0xdd };
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
565
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
566 /* Macros to insert and extract the block size in the header. */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
567
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
568 #define XMALLOC_PUT_SIZE(ptr, size) \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
569 (ptr[-1] = (size & 0xff), \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
570 ptr[-2] = ((size >> 8) & 0xff), \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
571 ptr[-3] = ((size >> 16) & 0xff), \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
572 ptr[-4] = ((size >> 24) & 0xff))
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
573
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
574 #define XMALLOC_GET_SIZE(ptr) \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
575 (size_t)((unsigned)(ptr[-1]) | \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
576 ((unsigned)(ptr[-2]) << 8) | \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
577 ((unsigned)(ptr[-3]) << 16) | \
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
578 ((unsigned)(ptr[-4]) << 24))
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
579
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
580
59083
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
581 /* The call depth in overrun_check functions. For example, this might happen:
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
582 xmalloc()
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
583 overrun_check_malloc()
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
584 -> malloc -> (via hook)_-> emacs_blocked_malloc
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
585 -> overrun_check_malloc
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
586 call malloc (hooks are NULL, so real malloc is called).
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
587 malloc returns 10000.
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
588 add overhead, return 10016.
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
589 <- (back in overrun_check_malloc)
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
590 add overhead again, return 10032
59083
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
591 xmalloc returns 10032.
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
592
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
593 (time passes).
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
594
59083
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
595 xfree(10032)
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
596 overrun_check_free(10032)
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
597 decrease overhed
4295cf593352 Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59082
diff changeset
598 free(10016) <- crash, because 10000 is the original pointer. */
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
599
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
600 static int check_depth;
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
601
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
602 /* Like malloc, but wraps allocated block with header and trailer. */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
603
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
604 POINTER_TYPE *
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
605 overrun_check_malloc (size)
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
606 size_t size;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
607 {
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
608 register unsigned char *val;
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
609 size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
610
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
611 val = (unsigned char *) malloc (size + overhead);
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
612 if (val && check_depth == 1)
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
613 {
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
614 memcpy (val, xmalloc_overrun_check_header,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
615 XMALLOC_OVERRUN_CHECK_SIZE - 4);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
616 val += XMALLOC_OVERRUN_CHECK_SIZE;
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
617 XMALLOC_PUT_SIZE(val, size);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
618 memcpy (val + size, xmalloc_overrun_check_trailer,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
619 XMALLOC_OVERRUN_CHECK_SIZE);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
620 }
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
621 --check_depth;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
622 return (POINTER_TYPE *)val;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
623 }
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
624
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
625
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
626 /* Like realloc, but checks old block for overrun, and wraps new block
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
627 with header and trailer. */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
628
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
629 POINTER_TYPE *
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
630 overrun_check_realloc (block, size)
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
631 POINTER_TYPE *block;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
632 size_t size;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
633 {
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
634 register unsigned char *val = (unsigned char *)block;
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
635 size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
636
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
637 if (val
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
638 && check_depth == 1
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
639 && memcmp (xmalloc_overrun_check_header,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
640 val - XMALLOC_OVERRUN_CHECK_SIZE,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
641 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
642 {
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
643 size_t osize = XMALLOC_GET_SIZE (val);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
644 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
645 XMALLOC_OVERRUN_CHECK_SIZE))
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
646 abort ();
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
647 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
648 val -= XMALLOC_OVERRUN_CHECK_SIZE;
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
649 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
650 }
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
651
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
652 val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + overhead);
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
653
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
654 if (val && check_depth == 1)
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
655 {
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
656 memcpy (val, xmalloc_overrun_check_header,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
657 XMALLOC_OVERRUN_CHECK_SIZE - 4);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
658 val += XMALLOC_OVERRUN_CHECK_SIZE;
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
659 XMALLOC_PUT_SIZE(val, size);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
660 memcpy (val + size, xmalloc_overrun_check_trailer,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
661 XMALLOC_OVERRUN_CHECK_SIZE);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
662 }
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
663 --check_depth;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
664 return (POINTER_TYPE *)val;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
665 }
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
666
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
667 /* Like free, but checks block for overrun. */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
668
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
669 void
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
670 overrun_check_free (block)
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
671 POINTER_TYPE *block;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
672 {
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
673 unsigned char *val = (unsigned char *)block;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
674
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
675 ++check_depth;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
676 if (val
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
677 && check_depth == 1
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
678 && memcmp (xmalloc_overrun_check_header,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
679 val - XMALLOC_OVERRUN_CHECK_SIZE,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
680 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
681 {
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
682 size_t osize = XMALLOC_GET_SIZE (val);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
683 if (memcmp (xmalloc_overrun_check_trailer, val + osize,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
684 XMALLOC_OVERRUN_CHECK_SIZE))
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
685 abort ();
59400
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
686 #ifdef XMALLOC_CLEAR_FREE_MEMORY
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
687 val -= XMALLOC_OVERRUN_CHECK_SIZE;
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
688 memset (val, 0xff, osize + XMALLOC_OVERRUN_CHECK_SIZE*2);
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
689 #else
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
690 memset (val + osize, 0, XMALLOC_OVERRUN_CHECK_SIZE);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
691 val -= XMALLOC_OVERRUN_CHECK_SIZE;
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
692 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE);
59400
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
693 #endif
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
694 }
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
695
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
696 free (val);
59082
f487226310e0 * alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents: 59047
diff changeset
697 --check_depth;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
698 }
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
699
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
700 #undef malloc
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
701 #undef realloc
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
702 #undef free
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
703 #define malloc overrun_check_malloc
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
704 #define realloc overrun_check_realloc
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
705 #define free overrun_check_free
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
706 #endif
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
707
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
708 #ifdef SYNC_INPUT
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
709 /* When using SYNC_INPUT, we don't call malloc from a signal handler, so
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
710 there's no need to block input around malloc. */
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
711 #define MALLOC_BLOCK_INPUT ((void)0)
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
712 #define MALLOC_UNBLOCK_INPUT ((void)0)
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
713 #else
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
714 #define MALLOC_BLOCK_INPUT BLOCK_INPUT
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
715 #define MALLOC_UNBLOCK_INPUT UNBLOCK_INPUT
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
716 #endif
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
717
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
718 /* Like malloc but check for no memory and block interrupt input.. */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
719
29781
4a3b0c2cbcd5 (xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 29743
diff changeset
720 POINTER_TYPE *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
721 xmalloc (size_t size)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
722 {
29781
4a3b0c2cbcd5 (xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 29743
diff changeset
723 register POINTER_TYPE *val;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
724
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
725 MALLOC_BLOCK_INPUT;
29781
4a3b0c2cbcd5 (xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 29743
diff changeset
726 val = (POINTER_TYPE *) malloc (size);
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
727 MALLOC_UNBLOCK_INPUT;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
728
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
729 if (!val && size)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
730 memory_full ();
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
732 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
733
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
734
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
735 /* Like realloc but check for no memory and block interrupt input.. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
736
29781
4a3b0c2cbcd5 (xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 29743
diff changeset
737 POINTER_TYPE *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
738 xrealloc (POINTER_TYPE *block, size_t size)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
739 {
29781
4a3b0c2cbcd5 (xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 29743
diff changeset
740 register POINTER_TYPE *val;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
742 MALLOC_BLOCK_INPUT;
590
1a6483439acc *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
743 /* We must call malloc explicitly when BLOCK is 0, since some
1a6483439acc *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
744 reallocs don't do this. */
1a6483439acc *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
745 if (! block)
29781
4a3b0c2cbcd5 (xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 29743
diff changeset
746 val = (POINTER_TYPE *) malloc (size);
600
a8d78999e46d *** empty log message ***
Noah Friedman <friedman@splode.com>
parents: 590
diff changeset
747 else
29781
4a3b0c2cbcd5 (xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 29743
diff changeset
748 val = (POINTER_TYPE *) realloc (block, size);
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
749 MALLOC_UNBLOCK_INPUT;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
750
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
751 if (!val && size) memory_full ();
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
752 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
753 }
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
754
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
755
52276
5623f26dff58 (lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents: 52256
diff changeset
756 /* Like free but block interrupt input. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
757
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
758 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
759 xfree (POINTER_TYPE *block)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
760 {
95481
4390d64d3328 Make "xfree (NULL)" a no-op; remove useless if-before-xfree.
Jim Meyering <jim@meyering.net>
parents: 94993
diff changeset
761 if (!block)
4390d64d3328 Make "xfree (NULL)" a no-op; remove useless if-before-xfree.
Jim Meyering <jim@meyering.net>
parents: 94993
diff changeset
762 return;
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
763 MALLOC_BLOCK_INPUT;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
764 free (block);
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
765 MALLOC_UNBLOCK_INPUT;
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
766 /* We don't call refill_memory_reserve here
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
767 because that duplicates doing so in emacs_blocked_free
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
768 and the criterion should go there. */
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
769 }
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
770
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
771
28411
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
772 /* Like strdup, but uses xmalloc. */
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
773
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
774 char *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
775 xstrdup (const char *s)
28411
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
776 {
30557
5056adb52e97 (lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents: 30317
diff changeset
777 size_t len = strlen (s) + 1;
28411
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
778 char *p = (char *) xmalloc (len);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
779 memcpy (p, s, len);
28411
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
780 return p;
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
781 }
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
782
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
783
56187
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
784 /* Unwind for SAFE_ALLOCA */
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
785
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
786 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
787 safe_alloca_unwind (Lisp_Object arg)
56187
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
788 {
56202
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
789 register struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
790
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
791 p->dogc = 0;
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
792 xfree (p->pointer);
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
793 p->pointer = 0;
56239
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
794 free_misc (arg);
56187
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
795 return Qnil;
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
796 }
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
797
e3720731abbb (safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents: 55838
diff changeset
798
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
799 /* Like malloc but used for allocating Lisp data. NBYTES is the
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
800 number of bytes to allocate, TYPE describes the intended use of the
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
801 allcated memory block (for strings, for conses, ...). */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
802
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
803 #ifndef USE_LSB_TAG
50468
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
804 static void *lisp_malloc_loser;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
805 #endif
50468
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
806
30557
5056adb52e97 (lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents: 30317
diff changeset
807 static POINTER_TYPE *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
808 lisp_malloc (size_t nbytes, enum mem_type type)
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
809 {
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
810 register void *val;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
811
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
812 MALLOC_BLOCK_INPUT;
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
813
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
814 #ifdef GC_MALLOC_CHECK
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
815 allocated_mem_type = type;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
816 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
817
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
818 val = (void *) malloc (nbytes);
28411
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
819
53650
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
820 #ifndef USE_LSB_TAG
50468
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
821 /* If the memory just allocated cannot be addressed thru a Lisp
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
822 object's pointer, and it needs to be,
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
823 that's equivalent to running out of memory. */
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
824 if (val && type != MEM_TYPE_NON_LISP)
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
825 {
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
826 Lisp_Object tem;
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
827 XSETCONS (tem, (char *) val + nbytes - 1);
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
828 if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
829 {
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
830 lisp_malloc_loser = val;
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
831 free (val);
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
832 val = 0;
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
833 }
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
834 }
53650
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
835 #endif
50468
16fdb9f87d89 (VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents: 50274
diff changeset
836
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
837 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
28411
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
838 if (val && type != MEM_TYPE_NON_LISP)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
839 mem_insert (val, (char *) val + nbytes, type);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
840 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
841
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
842 MALLOC_UNBLOCK_INPUT;
28411
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
843 if (!val && nbytes)
ecba29fa0198 (xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents: 28406
diff changeset
844 memory_full ();
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
845 return val;
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
846 }
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
847
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
848 /* Free BLOCK. This must be called to free memory allocated with a
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
849 call to lisp_malloc. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
850
30784
dbc1e69a89a9 [HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents: 30557
diff changeset
851 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
852 lisp_free (POINTER_TYPE *block)
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
853 {
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
854 MALLOC_BLOCK_INPUT;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
855 free (block);
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
856 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
857 mem_delete (mem_find (block));
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
858 #endif
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
859 MALLOC_UNBLOCK_INPUT;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
860 }
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
861
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
862 /* Allocation of aligned blocks of memory to store Lisp data. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
863 /* The entry point is lisp_align_malloc which returns blocks of at most */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
864 /* BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
865
69348
2c8e608f28e7 (USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68974
diff changeset
866 /* Use posix_memalloc if the system has it and we're using the system's
2c8e608f28e7 (USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68974
diff changeset
867 malloc (because our gmalloc.c routines don't have posix_memalign although
2c8e608f28e7 (USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68974
diff changeset
868 its memalloc could be used). */
69355
a685fca1ccb6 (USE_POSIX_MEMALIGN): Fix last change.
Kim F. Storm <storm@cua.dk>
parents: 69348
diff changeset
869 #if defined (HAVE_POSIX_MEMALIGN) && defined (SYSTEM_MALLOC)
a685fca1ccb6 (USE_POSIX_MEMALIGN): Fix last change.
Kim F. Storm <storm@cua.dk>
parents: 69348
diff changeset
870 #define USE_POSIX_MEMALIGN 1
a685fca1ccb6 (USE_POSIX_MEMALIGN): Fix last change.
Kim F. Storm <storm@cua.dk>
parents: 69348
diff changeset
871 #endif
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
872
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
873 /* BLOCK_ALIGN has to be a power of 2. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
874 #define BLOCK_ALIGN (1 << 10)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
875
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
876 /* Padding to leave at the end of a malloc'd block. This is to give
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
877 malloc a chance to minimize the amount of memory wasted to alignment.
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
878 It should be tuned to the particular malloc library used.
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
879 On glibc-2.3.2, malloc never tries to align, so a padding of 0 is best.
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
880 posix_memalign on the other hand would ideally prefer a value of 4
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
881 because otherwise, there's 1020 bytes wasted between each ablocks.
60143
84ff5b7a4139 (BLOCK_BYTES): Harmless typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59657
diff changeset
882 In Emacs, testing shows that those 1020 can most of the time be
84ff5b7a4139 (BLOCK_BYTES): Harmless typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59657
diff changeset
883 efficiently used by malloc to place other objects, so a value of 0 can
84ff5b7a4139 (BLOCK_BYTES): Harmless typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59657
diff changeset
884 still preferable unless you have a lot of aligned blocks and virtually
84ff5b7a4139 (BLOCK_BYTES): Harmless typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59657
diff changeset
885 nothing else. */
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
886 #define BLOCK_PADDING 0
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
887 #define BLOCK_BYTES \
60143
84ff5b7a4139 (BLOCK_BYTES): Harmless typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59657
diff changeset
888 (BLOCK_ALIGN - sizeof (struct ablock *) - BLOCK_PADDING)
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
889
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
890 /* Internal data structures and constants. */
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
891
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
892 #define ABLOCKS_SIZE 16
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
893
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
894 /* An aligned block of memory. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
895 struct ablock
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
896 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
897 union
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
898 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
899 char payload[BLOCK_BYTES];
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
900 struct ablock *next_free;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
901 } x;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
902 /* `abase' is the aligned base of the ablocks. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
903 /* It is overloaded to hold the virtual `busy' field that counts
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
904 the number of used ablock in the parent ablocks.
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
905 The first ablock has the `busy' field, the others have the `abase'
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
906 field. To tell the difference, we assume that pointers will have
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
907 integer values larger than 2 * ABLOCKS_SIZE. The lowest bit of `busy'
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
908 is used to tell whether the real base of the parent ablocks is `abase'
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
909 (if not, the word before the first ablock holds a pointer to the
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
910 real base). */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
911 struct ablocks *abase;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
912 /* The padding of all but the last ablock is unused. The padding of
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
913 the last ablock in an ablocks is not allocated. */
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
914 #if BLOCK_PADDING
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
915 char padding[BLOCK_PADDING];
51758
ff38ea4b40ed (struct ablock): Only include padding when there is some.
Jason Rumney <jasonr@gnu.org>
parents: 51723
diff changeset
916 #endif
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
917 };
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
918
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
919 /* A bunch of consecutive aligned blocks. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
920 struct ablocks
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
921 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
922 struct ablock blocks[ABLOCKS_SIZE];
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
923 };
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
924
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
925 /* Size of the block requested from malloc or memalign. */
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
926 #define ABLOCKS_BYTES (sizeof (struct ablocks) - BLOCK_PADDING)
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
927
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
928 #define ABLOCK_ABASE(block) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
929 (((unsigned long) (block)->abase) <= (1 + 2 * ABLOCKS_SIZE) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
930 ? (struct ablocks *)(block) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
931 : (block)->abase)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
932
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
933 /* Virtual `busy' field. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
934 #define ABLOCKS_BUSY(abase) ((abase)->blocks[0].abase)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
935
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
936 /* Pointer to the (not necessarily aligned) malloc block. */
69348
2c8e608f28e7 (USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68974
diff changeset
937 #ifdef USE_POSIX_MEMALIGN
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
938 #define ABLOCKS_BASE(abase) (abase)
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
939 #else
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
940 #define ABLOCKS_BASE(abase) \
52453
62fcd311bb98 Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
941 (1 & (long) ABLOCKS_BUSY (abase) ? abase : ((void**)abase)[-1])
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
942 #endif
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
943
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
944 /* The list of free ablock. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
945 static struct ablock *free_ablock;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
946
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
947 /* Allocate an aligned block of nbytes.
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
948 Alignment is on a multiple of BLOCK_ALIGN and `nbytes' has to be
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
949 smaller or equal to BLOCK_BYTES. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
950 static POINTER_TYPE *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
951 lisp_align_malloc (size_t nbytes, enum mem_type type)
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
952 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
953 void *base, *val;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
954 struct ablocks *abase;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
955
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
956 eassert (nbytes <= BLOCK_BYTES);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
957
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
958 MALLOC_BLOCK_INPUT;
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
959
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
960 #ifdef GC_MALLOC_CHECK
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
961 allocated_mem_type = type;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
962 #endif
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
963
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
964 if (!free_ablock)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
965 {
52276
5623f26dff58 (lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents: 52256
diff changeset
966 int i;
5623f26dff58 (lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents: 52256
diff changeset
967 EMACS_INT aligned; /* int gets warning casting to 64-bit pointer. */
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
968
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
969 #ifdef DOUG_LEA_MALLOC
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
970 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
971 because mapped region contents are not preserved in
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
972 a dumped Emacs. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
973 mallopt (M_MMAP_MAX, 0);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
974 #endif
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
975
69348
2c8e608f28e7 (USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68974
diff changeset
976 #ifdef USE_POSIX_MEMALIGN
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
977 {
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
978 int err = posix_memalign (&base, BLOCK_ALIGN, ABLOCKS_BYTES);
55836
a05a653f63af (lisp_align_malloc): Check for base == 0 regardless of HAVE_POSIX_MEMALIGN.
Richard M. Stallman <rms@gnu.org>
parents: 55816
diff changeset
979 if (err)
a05a653f63af (lisp_align_malloc): Check for base == 0 regardless of HAVE_POSIX_MEMALIGN.
Richard M. Stallman <rms@gnu.org>
parents: 55816
diff changeset
980 base = NULL;
a05a653f63af (lisp_align_malloc): Check for base == 0 regardless of HAVE_POSIX_MEMALIGN.
Richard M. Stallman <rms@gnu.org>
parents: 55816
diff changeset
981 abase = base;
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
982 }
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
983 #else
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
984 base = malloc (ABLOCKS_BYTES);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
985 abase = ALIGN (base, BLOCK_ALIGN);
55836
a05a653f63af (lisp_align_malloc): Check for base == 0 regardless of HAVE_POSIX_MEMALIGN.
Richard M. Stallman <rms@gnu.org>
parents: 55816
diff changeset
986 #endif
a05a653f63af (lisp_align_malloc): Check for base == 0 regardless of HAVE_POSIX_MEMALIGN.
Richard M. Stallman <rms@gnu.org>
parents: 55816
diff changeset
987
52837
1bbf3f566879 (lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents: 52547
diff changeset
988 if (base == 0)
1bbf3f566879 (lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents: 52547
diff changeset
989 {
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
990 MALLOC_UNBLOCK_INPUT;
52837
1bbf3f566879 (lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents: 52547
diff changeset
991 memory_full ();
1bbf3f566879 (lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents: 52547
diff changeset
992 }
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
993
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
994 aligned = (base == abase);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
995 if (!aligned)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
996 ((void**)abase)[-1] = base;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
997
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
998 #ifdef DOUG_LEA_MALLOC
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
999 /* Back to a reasonable maximum of mmap'ed areas. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1000 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1001 #endif
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1002
53650
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
1003 #ifndef USE_LSB_TAG
52256
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1004 /* If the memory just allocated cannot be addressed thru a Lisp
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1005 object's pointer, and it needs to be, that's equivalent to
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1006 running out of memory. */
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1007 if (type != MEM_TYPE_NON_LISP)
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1008 {
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1009 Lisp_Object tem;
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1010 char *end = (char *) base + ABLOCKS_BYTES - 1;
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1011 XSETCONS (tem, end);
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1012 if ((char *) XCONS (tem) != end)
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1013 {
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1014 lisp_malloc_loser = base;
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1015 free (base);
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1016 MALLOC_UNBLOCK_INPUT;
52256
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1017 memory_full ();
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1018 }
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1019 }
53650
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
1020 #endif
52256
36e112575ca8 (lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents: 52166
diff changeset
1021
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1022 /* Initialize the blocks and put them on the free list.
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1023 Is `base' was not properly aligned, we can't use the last block. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1024 for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1025 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1026 abase->blocks[i].abase = abase;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1027 abase->blocks[i].x.next_free = free_ablock;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1028 free_ablock = &abase->blocks[i];
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1029 }
52453
62fcd311bb98 Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
1030 ABLOCKS_BUSY (abase) = (struct ablocks *) (long) aligned;
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1031
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
1032 eassert (0 == ((EMACS_UINT)abase) % BLOCK_ALIGN);
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1033 eassert (ABLOCK_ABASE (&abase->blocks[3]) == abase); /* 3 is arbitrary */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1034 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1035 eassert (ABLOCKS_BASE (abase) == base);
52453
62fcd311bb98 Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
1036 eassert (aligned == (long) ABLOCKS_BUSY (abase));
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1037 }
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1038
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1039 abase = ABLOCK_ABASE (free_ablock);
52453
62fcd311bb98 Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
1040 ABLOCKS_BUSY (abase) = (struct ablocks *) (2 + (long) ABLOCKS_BUSY (abase));
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1041 val = free_ablock;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1042 free_ablock = free_ablock->x.next_free;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1043
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1044 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1045 if (val && type != MEM_TYPE_NON_LISP)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1046 mem_insert (val, (char *) val + nbytes, type);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1047 #endif
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1048
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1049 MALLOC_UNBLOCK_INPUT;
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1050 if (!val && nbytes)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1051 memory_full ();
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1052
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1053 eassert (0 == ((EMACS_UINT)val) % BLOCK_ALIGN);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1054 return val;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1055 }
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1056
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1057 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1058 lisp_align_free (POINTER_TYPE *block)
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1059 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1060 struct ablock *ablock = block;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1061 struct ablocks *abase = ABLOCK_ABASE (ablock);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1062
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1063 MALLOC_BLOCK_INPUT;
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1064 #if GC_MARK_STACK && !defined GC_MALLOC_CHECK
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1065 mem_delete (mem_find (block));
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1066 #endif
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1067 /* Put on free list. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1068 ablock->x.next_free = free_ablock;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1069 free_ablock = ablock;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1070 /* Update busy count. */
52453
62fcd311bb98 Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
1071 ABLOCKS_BUSY (abase) = (struct ablocks *) (-2 + (long) ABLOCKS_BUSY (abase));
55634
d3542bbadad7 (mark_object): Ignore Lisp_Misc_Free objects.
Kim F. Storm <storm@cua.dk>
parents: 55159
diff changeset
1072
52453
62fcd311bb98 Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
1073 if (2 > (long) ABLOCKS_BUSY (abase))
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1074 { /* All the blocks are free. */
52453
62fcd311bb98 Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
1075 int i = 0, aligned = (long) ABLOCKS_BUSY (abase);
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1076 struct ablock **tem = &free_ablock;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1077 struct ablock *atop = &abase->blocks[aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1];
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1078
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1079 while (*tem)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1080 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1081 if (*tem >= (struct ablock *) abase && *tem < atop)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1082 {
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1083 i++;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1084 *tem = (*tem)->x.next_free;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1085 }
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1086 else
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1087 tem = &(*tem)->x.next_free;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1088 }
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1089 eassert ((aligned & 1) == aligned);
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1090 eassert (i == (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1));
69348
2c8e608f28e7 (USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68974
diff changeset
1091 #ifdef USE_POSIX_MEMALIGN
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
1092 eassert ((unsigned long)ABLOCKS_BASE (abase) % BLOCK_ALIGN == 0);
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
1093 #endif
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1094 free (ABLOCKS_BASE (abase));
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1095 }
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1096 MALLOC_UNBLOCK_INPUT;
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
1097 }
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1098
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1099 /* Return a new buffer structure allocated from the heap with
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1100 a call to lisp_malloc. */
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1101
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1102 struct buffer *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1103 allocate_buffer (void)
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1104 {
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1105 struct buffer *b
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1106 = (struct buffer *) lisp_malloc (sizeof (struct buffer),
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1107 MEM_TYPE_BUFFER);
85328
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
1108 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
1109 XSETPVECTYPE (b, PVEC_BUFFER);
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1110 return b;
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1111 }
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
1112
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1113
59359
1678d14c4109 (refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59314
diff changeset
1114 #ifndef SYSTEM_MALLOC
1678d14c4109 (refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59314
diff changeset
1115
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1116 /* Arranging to disable input signals while we're in malloc.
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1117
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1118 This only works with GNU malloc. To help out systems which can't
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1119 use GNU malloc, all the calls to malloc, realloc, and free
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1120 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
59359
1678d14c4109 (refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59314
diff changeset
1121 pair; unfortunately, we have no idea what C library functions
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1122 might call malloc, so we can't really protect them unless you're
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
1123 using GNU malloc. Fortunately, most of the major operating systems
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
1124 can use GNU malloc. */
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1125
59359
1678d14c4109 (refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59314
diff changeset
1126 #ifndef SYNC_INPUT
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1127 /* When using SYNC_INPUT, we don't call malloc from a signal handler, so
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1128 there's no need to block input around malloc. */
59359
1678d14c4109 (refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59314
diff changeset
1129
30914
6362b1fc09f2 (lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 30823
diff changeset
1130 #ifndef DOUG_LEA_MALLOC
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1131 extern void * (*__malloc_hook) (size_t, const void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1132 extern void * (*__realloc_hook) (void *, size_t, const void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1133 extern void (*__free_hook) (void *, const void *);
30914
6362b1fc09f2 (lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 30823
diff changeset
1134 /* Else declared in malloc.h, perhaps with an extra arg. */
6362b1fc09f2 (lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents: 30823
diff changeset
1135 #endif /* DOUG_LEA_MALLOC */
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1136 static void * (*old_malloc_hook) (size_t, const void *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1137 static void * (*old_realloc_hook) (void *, size_t, const void*);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1138 static void (*old_free_hook) (void*, const void*);
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1139
111997
a5a188ddc758 Minor clean up to silence some gcc warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 111779
diff changeset
1140 static __malloc_size_t bytes_used_when_reconsidered;
a5a188ddc758 Minor clean up to silence some gcc warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 111779
diff changeset
1141
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1142 /* This function is used as the hook for free to call. */
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1143
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1144 static void
109480
d12162869c07 Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109320
diff changeset
1145 emacs_blocked_free (void *ptr, const void *ptr2)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1146 {
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1147 BLOCK_INPUT_ALLOC;
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1148
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1149 #ifdef GC_MALLOC_CHECK
32776
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1150 if (ptr)
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1151 {
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1152 struct mem_node *m;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1153
32776
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1154 m = mem_find (ptr);
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1155 if (m == MEM_NIL || m->start != ptr)
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1156 {
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1157 fprintf (stderr,
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1158 "Freeing `%p' which wasn't allocated with malloc\n", ptr);
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1159 abort ();
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1160 }
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1161 else
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1162 {
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1163 /* fprintf (stderr, "free %p...%p (%p)\n", m->start, m->end, ptr); */
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1164 mem_delete (m);
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1165 }
416924b6f303 (emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents: 32700
diff changeset
1166 }
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1167 #endif /* GC_MALLOC_CHECK */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1168
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1169 __free_hook = old_free_hook;
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1170 free (ptr);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1171
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1172 /* If we released our reserve (due to running out of memory),
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1173 and we have a fair amount free once again,
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1174 try to set aside another reserve in case we run out once more. */
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
1175 if (! NILP (Vmemory_full)
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1176 /* Verify there is enough space that even with the malloc
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1177 hysteresis this call won't run out again.
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1178 The code here is correct as long as SPARE_MEMORY
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1179 is substantially larger than the block size malloc uses. */
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1180 && (bytes_used_when_full
66547
9373f926904a (BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents: 66541
diff changeset
1181 > ((bytes_used_when_reconsidered = BYTES_USED)
66541
60d77f0435af * alloc.c (emacs_blocked_free): Fix typo.
Chong Yidong <cyd@stupidchicken.com>
parents: 66530
diff changeset
1182 + max (malloc_hysteresis, 4) * SPARE_MEMORY)))
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
1183 refill_memory_reserve ();
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1184
2507
7ba4316ae840 * alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
1185 __free_hook = emacs_blocked_free;
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1186 UNBLOCK_INPUT_ALLOC;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1187 }
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1188
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1189
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1190 /* This function is the malloc hook that Emacs uses. */
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
1191
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1192 static void *
109480
d12162869c07 Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109320
diff changeset
1193 emacs_blocked_malloc (size_t size, const void *ptr)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1194 {
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1195 void *value;
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1196
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1197 BLOCK_INPUT_ALLOC;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1198 __malloc_hook = old_malloc_hook;
17831
9238a2254a23 (BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents: 17348
diff changeset
1199 #ifdef DOUG_LEA_MALLOC
83543
6b25ef5cc276 Fix obvious runtime errors after merge.
Karoly Lorentey <lorentey@elte.hu>
parents: 83541
diff changeset
1200 /* Segfaults on my system. --lorentey */
6b25ef5cc276 Fix obvious runtime errors after merge.
Karoly Lorentey <lorentey@elte.hu>
parents: 83541
diff changeset
1201 /* mallopt (M_TOP_PAD, malloc_hysteresis * 4096); */
17831
9238a2254a23 (BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents: 17348
diff changeset
1202 #else
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
1203 __malloc_extra_blocks = malloc_hysteresis;
17831
9238a2254a23 (BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents: 17348
diff changeset
1204 #endif
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1205
3581
152fd924c7bb * alloc.c (emacs_blocked_malloc, emacs_blocked_realloc): Cast the
Jim Blandy <jimb@redhat.com>
parents: 3536
diff changeset
1206 value = (void *) malloc (size);
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1207
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1208 #ifdef GC_MALLOC_CHECK
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1209 {
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1210 struct mem_node *m = mem_find (value);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1211 if (m != MEM_NIL)
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1212 {
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1213 fprintf (stderr, "Malloc returned %p which is already in use\n",
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1214 value);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1215 fprintf (stderr, "Region in use is %p...%p, %u bytes, type %d\n",
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1216 m->start, m->end, (char *) m->end - (char *) m->start,
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1217 m->type);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1218 abort ();
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1219 }
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1220
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1221 if (!dont_register_blocks)
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1222 {
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1223 mem_insert (value, (char *) value + max (1, size), allocated_mem_type);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1224 allocated_mem_type = MEM_TYPE_NON_LISP;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1225 }
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1226 }
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1227 #endif /* GC_MALLOC_CHECK */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1228
2507
7ba4316ae840 * alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
1229 __malloc_hook = emacs_blocked_malloc;
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1230 UNBLOCK_INPUT_ALLOC;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1231
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1232 /* fprintf (stderr, "%p malloc\n", value); */
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1233 return value;
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1234 }
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1235
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1236
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1237 /* This function is the realloc hook that Emacs uses. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1238
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1239 static void *
109480
d12162869c07 Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109320
diff changeset
1240 emacs_blocked_realloc (void *ptr, size_t size, const void *ptr2)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1241 {
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1242 void *value;
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1243
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1244 BLOCK_INPUT_ALLOC;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1245 __realloc_hook = old_realloc_hook;
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1246
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1247 #ifdef GC_MALLOC_CHECK
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1248 if (ptr)
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1249 {
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1250 struct mem_node *m = mem_find (ptr);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1251 if (m == MEM_NIL || m->start != ptr)
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1252 {
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1253 fprintf (stderr,
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1254 "Realloc of %p which wasn't allocated with malloc\n",
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1255 ptr);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1256 abort ();
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1257 }
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1258
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1259 mem_delete (m);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1260 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1261
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1262 /* fprintf (stderr, "%p -> realloc\n", ptr); */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1263
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1264 /* Prevent malloc from registering blocks. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1265 dont_register_blocks = 1;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1266 #endif /* GC_MALLOC_CHECK */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1267
3581
152fd924c7bb * alloc.c (emacs_blocked_malloc, emacs_blocked_realloc): Cast the
Jim Blandy <jimb@redhat.com>
parents: 3536
diff changeset
1268 value = (void *) realloc (ptr, size);
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1269
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1270 #ifdef GC_MALLOC_CHECK
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1271 dont_register_blocks = 0;
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1272
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1273 {
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1274 struct mem_node *m = mem_find (value);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1275 if (m != MEM_NIL)
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1276 {
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1277 fprintf (stderr, "Realloc returns memory that is already in use\n");
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1278 abort ();
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1279 }
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1280
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1281 /* Can't handle zero size regions in the red-black tree. */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1282 mem_insert (value, (char *) value + max (size, 1), MEM_TYPE_NON_LISP);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1283 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1284
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1285 /* fprintf (stderr, "%p <- realloc\n", value); */
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
1286 #endif /* GC_MALLOC_CHECK */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1287
2507
7ba4316ae840 * alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
1288 __realloc_hook = emacs_blocked_realloc;
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1289 UNBLOCK_INPUT_ALLOC;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1290
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1291 return value;
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1292 }
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1293
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1294
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1295 #ifdef HAVE_GTK_AND_PTHREAD
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1296 /* Called from Fdump_emacs so that when the dumped Emacs starts, it has a
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1297 normal malloc. Some thread implementations need this as they call
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1298 malloc before main. The pthread_self call in BLOCK_INPUT_ALLOC then
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1299 calls malloc because it is the first call, and we have an endless loop. */
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1300
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1301 void
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1302 reset_malloc_hooks ()
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1303 {
78811
6ebdc9c66c94 (reset_malloc_hooks): Set the hooks to the previous
Andreas Schwab <schwab@suse.de>
parents: 78593
diff changeset
1304 __free_hook = old_free_hook;
6ebdc9c66c94 (reset_malloc_hooks): Set the hooks to the previous
Andreas Schwab <schwab@suse.de>
parents: 78593
diff changeset
1305 __malloc_hook = old_malloc_hook;
6ebdc9c66c94 (reset_malloc_hooks): Set the hooks to the previous
Andreas Schwab <schwab@suse.de>
parents: 78593
diff changeset
1306 __realloc_hook = old_realloc_hook;
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1307 }
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1308 #endif /* HAVE_GTK_AND_PTHREAD */
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1309
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1310
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1311 /* Called from main to set up malloc to use our hooks. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1312
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1313 void
109480
d12162869c07 Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109320
diff changeset
1314 uninterrupt_malloc (void)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1315 {
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1316 #ifdef HAVE_GTK_AND_PTHREAD
80502
07f3d63ad3d3 [!SYSTEM_MALLOC && !SYNC_INPUT] (uninterrupt_malloc)
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 79759
diff changeset
1317 #ifdef DOUG_LEA_MALLOC
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1318 pthread_mutexattr_t attr;
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1319
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1320 /* GLIBC has a faster way to do this, but lets keep it portable.
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1321 This is according to the Single UNIX Specification. */
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1322 pthread_mutexattr_init (&attr);
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1323 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1324 pthread_mutex_init (&alloc_mutex, &attr);
80502
07f3d63ad3d3 [!SYSTEM_MALLOC && !SYNC_INPUT] (uninterrupt_malloc)
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 79759
diff changeset
1325 #else /* !DOUG_LEA_MALLOC */
107984
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
1326 /* Some systems such as Solaris 2.6 don't have a recursive mutex,
80502
07f3d63ad3d3 [!SYSTEM_MALLOC && !SYNC_INPUT] (uninterrupt_malloc)
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 79759
diff changeset
1327 and the bundled gmalloc.c doesn't require it. */
07f3d63ad3d3 [!SYSTEM_MALLOC && !SYNC_INPUT] (uninterrupt_malloc)
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 79759
diff changeset
1328 pthread_mutex_init (&alloc_mutex, NULL);
07f3d63ad3d3 [!SYSTEM_MALLOC && !SYNC_INPUT] (uninterrupt_malloc)
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 79759
diff changeset
1329 #endif /* !DOUG_LEA_MALLOC */
58818
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1330 #endif /* HAVE_GTK_AND_PTHREAD */
f8cddae7d959 * gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents: 58707
diff changeset
1331
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1332 if (__free_hook != emacs_blocked_free)
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1333 old_free_hook = __free_hook;
2507
7ba4316ae840 * alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
1334 __free_hook = emacs_blocked_free;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1335
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1336 if (__malloc_hook != emacs_blocked_malloc)
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1337 old_malloc_hook = __malloc_hook;
2507
7ba4316ae840 * alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
1338 __malloc_hook = emacs_blocked_malloc;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1339
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1340 if (__realloc_hook != emacs_blocked_realloc)
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1341 old_realloc_hook = __realloc_hook;
2507
7ba4316ae840 * alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
1342 __realloc_hook = emacs_blocked_realloc;
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
1343 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1344
59359
1678d14c4109 (refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59314
diff changeset
1345 #endif /* not SYNC_INPUT */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1346 #endif /* not SYSTEM_MALLOC */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1347
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1348
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1349
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1350 /***********************************************************************
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1351 Interval Allocation
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1352 ***********************************************************************/
1908
d649f2179d67 * alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents: 1893
diff changeset
1353
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1354 /* Number of intervals allocated in an interval_block structure.
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1355 The 1020 is 1024 minus malloc overhead. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1356
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1357 #define INTERVAL_BLOCK_SIZE \
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1358 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1359
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1360 /* Intervals are allocated in chunks in form of an interval_block
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1361 structure. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1362
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1363 struct interval_block
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1364 {
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
1365 /* Place `intervals' first, to preserve alignment. */
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
1366 struct interval intervals[INTERVAL_BLOCK_SIZE];
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1367 struct interval_block *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1368 };
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1369
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1370 /* Current interval block. Its `next' pointer points to older
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1371 blocks. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1372
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
1373 static struct interval_block *interval_block;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1374
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1375 /* Index in interval_block above of the next unused interval
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1376 structure. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1377
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1378 static int interval_block_index;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1379
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1380 /* Number of free and live intervals. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1381
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1382 static int total_free_intervals, total_intervals;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1383
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1384 /* List of free intervals. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1385
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1386 INTERVAL interval_free_list;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1387
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1388 /* Total number of interval blocks now in use. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1389
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
1390 static int n_interval_blocks;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1391
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1392
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1393 /* Initialize interval allocation. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1394
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1395 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1396 init_intervals (void)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1397 {
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
1398 interval_block = NULL;
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
1399 interval_block_index = INTERVAL_BLOCK_SIZE;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1400 interval_free_list = 0;
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
1401 n_interval_blocks = 0;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1402 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1403
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1404
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1405 /* Return a new interval. */
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1406
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1407 INTERVAL
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1408 make_interval (void)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1409 {
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1410 INTERVAL val;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1411
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1412 /* eassert (!handling_signal); */
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1413
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1414 MALLOC_BLOCK_INPUT;
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
1415
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1416 if (interval_free_list)
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1417 {
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1418 val = interval_free_list;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 28220
diff changeset
1419 interval_free_list = INTERVAL_PARENT (interval_free_list);
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1420 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1421 else
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1422 {
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1423 if (interval_block_index == INTERVAL_BLOCK_SIZE)
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1424 {
12529
c7d32f5da2b3 (Flist): Rewritten.
Karl Heuer <kwzh@gnu.org>
parents: 12273
diff changeset
1425 register struct interval_block *newi;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1426
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1427 newi = (struct interval_block *) lisp_malloc (sizeof *newi,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1428 MEM_TYPE_NON_LISP);
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1429
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1430 newi->next = interval_block;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1431 interval_block = newi;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1432 interval_block_index = 0;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
1433 n_interval_blocks++;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1434 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1435 val = &interval_block->intervals[interval_block_index++];
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1436 }
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1437
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1438 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1439
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1440 consing_since_gc += sizeof (struct interval);
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
1441 intervals_consed++;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1442 RESET_INTERVAL (val);
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
1443 val->gcmarkbit = 0;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1444 return val;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1445 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1446
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1447
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1448 /* Mark Lisp objects in interval I. */
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1449
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1450 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1451 mark_interval (register INTERVAL i, Lisp_Object dummy)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1452 {
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
1453 eassert (!i->gcmarkbit); /* Intervals are never shared. */
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
1454 i->gcmarkbit = 1;
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
1455 mark_object (i->plist);
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1456 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1457
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1458
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1459 /* Mark the interval tree rooted in TREE. Don't call this directly;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1460 use the macro MARK_INTERVAL_TREE instead. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1461
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1462 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1463 mark_interval_tree (register INTERVAL tree)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1464 {
4139
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1465 /* No need to test if this tree has been marked already; this
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1466 function is always called through the MARK_INTERVAL_TREE macro,
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1467 which takes care of that. */
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1468
39859
36068b62b4c1 (mark_interval_tree): Use traverse_intervals_noorder.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39682
diff changeset
1469 traverse_intervals_noorder (tree, mark_interval, Qnil);
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1470 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1471
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1472
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1473 /* Mark the interval tree rooted in I. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1474
4139
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1475 #define MARK_INTERVAL_TREE(i) \
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1476 do { \
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
1477 if (!NULL_INTERVAL_P (i) && !i->gcmarkbit) \
4139
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1478 mark_interval_tree (i); \
0b32ee899a3a Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents: 4087
diff changeset
1479 } while (0)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1480
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1481
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1482 #define UNMARK_BALANCE_INTERVALS(i) \
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1483 do { \
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1484 if (! NULL_INTERVAL_P (i)) \
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
1485 (i) = balance_intervals (i); \
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1486 } while (0)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1487
28469
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1488
96602
0e3e875ffade * lisp.h:
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96545
diff changeset
1489 /* Number support. If USE_LISP_UNION_TYPE is in effect, we
28469
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1490 can't create number objects in macros. */
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1491 #ifndef make_number
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1492 Lisp_Object
111997
a5a188ddc758 Minor clean up to silence some gcc warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 111779
diff changeset
1493 make_number (EMACS_INT n)
28469
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1494 {
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1495 Lisp_Object obj;
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1496 obj.s.val = n;
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1497 obj.s.type = Lisp_Int;
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1498 return obj;
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1499 }
f66f2b4d5eb7 * alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents: 28411
diff changeset
1500 #endif
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
1501
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1502 /***********************************************************************
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1503 String Allocation
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1504 ***********************************************************************/
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1505
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1506 /* Lisp_Strings are allocated in string_block structures. When a new
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1507 string_block is allocated, all the Lisp_Strings it contains are
41831
fa7af2e13043 (Fgarbage_collect): Shrink buffer gaps that are
Andrew Innes <andrewi@gnu.org>
parents: 40977
diff changeset
1508 added to a free-list string_free_list. When a new Lisp_String is
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1509 needed, it is taken from that list. During the sweep phase of GC,
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1510 string_blocks that are entirely free are freed, except two which
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1511 we keep.
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1512
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1513 String data is allocated from sblock structures. Strings larger
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1514 than LARGE_STRING_BYTES, get their own sblock, data for smaller
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1515 strings is sub-allocated out of sblocks of size SBLOCK_SIZE.
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1516
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1517 Sblocks consist internally of sdata structures, one for each
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1518 Lisp_String. The sdata structure points to the Lisp_String it
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1519 belongs to. The Lisp_String points back to the `u.data' member of
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1520 its sdata structure.
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1521
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1522 When a Lisp_String is freed during GC, it is put back on
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1523 string_free_list, and its `data' member and its sdata's `string'
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1524 pointer is set to null. The size of the string is recorded in the
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1525 `u.nbytes' member of the sdata. So, sdata structures that are no
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1526 longer used, can be easily recognized, and it's easy to compact the
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1527 sblocks of small strings which we do in compact_small_strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1528
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1529 /* Size in bytes of an sblock structure used for small strings. This
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1530 is 8192 minus malloc overhead. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1531
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1532 #define SBLOCK_SIZE 8188
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1533
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1534 /* Strings larger than this are considered large strings. String data
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1535 for large strings is allocated from individual sblocks. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1536
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1537 #define LARGE_STRING_BYTES 1024
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1538
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1539 /* Structure describing string memory sub-allocated from an sblock.
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1540 This is where the contents of Lisp strings are stored. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1541
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1542 struct sdata
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1543 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1544 /* Back-pointer to the string this sdata belongs to. If null, this
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1545 structure is free, and the NBYTES member of the union below
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1546 contains the string's byte size (the same value that STRING_BYTES
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1547 would return if STRING were non-null). If non-null, STRING_BYTES
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1548 (STRING) is the size of the data, and DATA contains the string's
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1549 contents. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1550 struct Lisp_String *string;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1551
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1552 #ifdef GC_CHECK_STRING_BYTES
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1553
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1554 EMACS_INT nbytes;
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1555 unsigned char data[1];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1556
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1557 #define SDATA_NBYTES(S) (S)->nbytes
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1558 #define SDATA_DATA(S) (S)->data
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1559
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1560 #else /* not GC_CHECK_STRING_BYTES */
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1561
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1562 union
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1563 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1564 /* When STRING in non-null. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1565 unsigned char data[1];
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1566
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1567 /* When STRING is null. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1568 EMACS_INT nbytes;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1569 } u;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1570
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1571
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1572 #define SDATA_NBYTES(S) (S)->u.nbytes
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1573 #define SDATA_DATA(S) (S)->u.data
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1574
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1575 #endif /* not GC_CHECK_STRING_BYTES */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1576 };
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1577
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1578
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1579 /* Structure describing a block of memory which is sub-allocated to
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1580 obtain string data memory for strings. Blocks for small strings
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1581 are of fixed size SBLOCK_SIZE. Blocks for large strings are made
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1582 as large as needed. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1583
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1584 struct sblock
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1585 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1586 /* Next in list. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1587 struct sblock *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1588
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1589 /* Pointer to the next free sdata block. This points past the end
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1590 of the sblock if there isn't any space left in this block. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1591 struct sdata *next_free;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1592
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1593 /* Start of data. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1594 struct sdata first_data;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1595 };
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1596
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1597 /* Number of Lisp strings in a string_block structure. The 1020 is
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1598 1024 minus malloc overhead. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1599
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
1600 #define STRING_BLOCK_SIZE \
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1601 ((1020 - sizeof (struct string_block *)) / sizeof (struct Lisp_String))
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1602
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1603 /* Structure describing a block from which Lisp_String structures
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1604 are allocated. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1605
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1606 struct string_block
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1607 {
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
1608 /* Place `strings' first, to preserve alignment. */
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
1609 struct Lisp_String strings[STRING_BLOCK_SIZE];
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1610 struct string_block *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1611 };
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1612
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1613 /* Head and tail of the list of sblock structures holding Lisp string
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1614 data. We always allocate from current_sblock. The NEXT pointers
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1615 in the sblock structures go from oldest_sblock to current_sblock. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1616
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1617 static struct sblock *oldest_sblock, *current_sblock;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1618
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1619 /* List of sblocks for large strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1620
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1621 static struct sblock *large_sblocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1622
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1623 /* List of string_block structures, and how many there are. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1624
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1625 static struct string_block *string_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1626 static int n_string_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1627
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1628 /* Free-list of Lisp_Strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1629
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1630 static struct Lisp_String *string_free_list;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1631
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1632 /* Number of live and free Lisp_Strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1633
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1634 static int total_strings, total_free_strings;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1635
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1636 /* Number of bytes used by live strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1637
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1638 static EMACS_INT total_string_size;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1639
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1640 /* Given a pointer to a Lisp_String S which is on the free-list
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1641 string_free_list, return a pointer to its successor in the
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1642 free-list. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1643
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1644 #define NEXT_FREE_LISP_STRING(S) (*(struct Lisp_String **) (S))
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1645
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1646 /* Return a pointer to the sdata structure belonging to Lisp string S.
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1647 S must be live, i.e. S->data must not be null. S->data is actually
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1648 a pointer to the `u.data' member of its sdata structure; the
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1649 structure starts at a constant offset in front of that. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1650
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1651 #ifdef GC_CHECK_STRING_BYTES
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1652
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1653 #define SDATA_OF_STRING(S) \
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1654 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *) \
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1655 - sizeof (EMACS_INT)))
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1656
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1657 #else /* not GC_CHECK_STRING_BYTES */
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1658
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1659 #define SDATA_OF_STRING(S) \
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1660 ((struct sdata *) ((S)->data - sizeof (struct Lisp_String *)))
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1661
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1662 #endif /* not GC_CHECK_STRING_BYTES */
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1663
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1664
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1665 #ifdef GC_CHECK_STRING_OVERRUN
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1666
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1667 /* We check for overrun in string data blocks by appending a small
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1668 "cookie" after each allocated string data block, and check for the
62681
d140f1408030 Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 62335
diff changeset
1669 presence of this cookie during GC. */
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1670
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1671 #define GC_STRING_OVERRUN_COOKIE_SIZE 4
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1672 static char string_overrun_cookie[GC_STRING_OVERRUN_COOKIE_SIZE] =
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1673 { 0xde, 0xad, 0xbe, 0xef };
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1674
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1675 #else
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1676 #define GC_STRING_OVERRUN_COOKIE_SIZE 0
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1677 #endif
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1678
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1679 /* Value is the size of an sdata structure large enough to hold NBYTES
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1680 bytes of string data. The value returned includes a terminating
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1681 NUL byte, the size of the sdata structure, and padding. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1682
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1683 #ifdef GC_CHECK_STRING_BYTES
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1684
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1685 #define SDATA_SIZE(NBYTES) \
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1686 ((sizeof (struct Lisp_String *) \
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1687 + (NBYTES) + 1 \
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1688 + sizeof (EMACS_INT) \
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1689 + sizeof (EMACS_INT) - 1) \
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1690 & ~(sizeof (EMACS_INT) - 1))
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1691
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1692 #else /* not GC_CHECK_STRING_BYTES */
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1693
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1694 #define SDATA_SIZE(NBYTES) \
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1695 ((sizeof (struct Lisp_String *) \
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1696 + (NBYTES) + 1 \
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1697 + sizeof (EMACS_INT) - 1) \
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1698 & ~(sizeof (EMACS_INT) - 1))
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1699
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1700 #endif /* not GC_CHECK_STRING_BYTES */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1701
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1702 /* Extra bytes to allocate for each string. */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1703
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1704 #define GC_STRING_EXTRA (GC_STRING_OVERRUN_COOKIE_SIZE)
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1705
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1706 /* Initialize string allocation. Called from init_alloc_once. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1707
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
1708 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1709 init_strings (void)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1710 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1711 total_strings = total_free_strings = total_string_size = 0;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1712 oldest_sblock = current_sblock = large_sblocks = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1713 string_blocks = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1714 n_string_blocks = 0;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1715 string_free_list = NULL;
81272
1842d7137ff2 (init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents: 77260
diff changeset
1716 empty_unibyte_string = make_pure_string ("", 0, 0, 0);
1842d7137ff2 (init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents: 77260
diff changeset
1717 empty_multibyte_string = make_pure_string ("", 0, 0, 1);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1718 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1719
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1720
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1721 #ifdef GC_CHECK_STRING_BYTES
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1722
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1723 static int check_string_bytes_count;
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1724
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1725 static void check_string_bytes (int);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108908
diff changeset
1726 static void check_sblock (struct sblock *);
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1727
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1728 #define CHECK_STRING_BYTES(S) STRING_BYTES (S)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1729
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1730
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1731 /* Like GC_STRING_BYTES, but with debugging check. */
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1732
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1733 EMACS_INT
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1734 string_bytes (struct Lisp_String *s)
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1735 {
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1736 EMACS_INT nbytes =
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1737 (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte);
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1738
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1739 if (!PURE_POINTER_P (s)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1740 && s->data
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1741 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1742 abort ();
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1743 return nbytes;
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1744 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1745
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
1746 /* Check validity of Lisp strings' string_bytes member in B. */
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1747
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
1748 static void
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1749 check_sblock (b)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1750 struct sblock *b;
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1751 {
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1752 struct sdata *from, *end, *from_end;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1753
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1754 end = b->next_free;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1755
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1756 for (from = &b->first_data; from < end; from = from_end)
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1757 {
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1758 /* Compute the next FROM here because copying below may
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1759 overwrite data we need to compute it. */
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1760 EMACS_INT nbytes;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1761
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1762 /* Check that the string size recorded in the string is the
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1763 same as the one recorded in the sdata structure. */
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1764 if (from->string)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1765 CHECK_STRING_BYTES (from->string);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1766
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1767 if (from->string)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1768 nbytes = GC_STRING_BYTES (from->string);
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1769 else
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1770 nbytes = SDATA_NBYTES (from);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1771
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1772 nbytes = SDATA_SIZE (nbytes);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1773 from_end = (struct sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1774 }
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1775 }
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1776
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1777
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1778 /* Check validity of Lisp strings' string_bytes member. ALL_P
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1779 non-zero means check all strings, otherwise check only most
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1780 recently allocated strings. Used for hunting a bug. */
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1781
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
1782 static void
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1783 check_string_bytes (all_p)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1784 int all_p;
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1785 {
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1786 if (all_p)
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1787 {
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1788 struct sblock *b;
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1789
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1790 for (b = large_sblocks; b; b = b->next)
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1791 {
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1792 struct Lisp_String *s = b->first_data.string;
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1793 if (s)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1794 CHECK_STRING_BYTES (s);
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1795 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1796
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1797 for (b = oldest_sblock; b; b = b->next)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1798 check_sblock (b);
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1799 }
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1800 else
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1801 check_sblock (current_sblock);
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1802 }
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1803
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1804 #endif /* GC_CHECK_STRING_BYTES */
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1805
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1806 #ifdef GC_CHECK_STRING_FREE_LIST
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1807
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1808 /* Walk through the string free list looking for bogus next pointers.
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1809 This may catch buffer overrun from a previous string. */
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1810
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1811 static void
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1812 check_string_free_list ()
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1813 {
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1814 struct Lisp_String *s;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1815
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1816 /* Pop a Lisp_String off the free-list. */
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1817 s = string_free_list;
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1818 while (s != NULL)
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1819 {
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1820 if ((unsigned long)s < 1024)
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1821 abort();
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1822 s = NEXT_FREE_LISP_STRING (s);
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1823 }
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1824 }
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1825 #else
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1826 #define check_string_free_list()
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1827 #endif
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1828
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1829 /* Return a new Lisp_String. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1830
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1831 static struct Lisp_String *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1832 allocate_string (void)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1833 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1834 struct Lisp_String *s;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1835
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1836 /* eassert (!handling_signal); */
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1837
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1838 MALLOC_BLOCK_INPUT;
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
1839
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1840 /* If the free-list is empty, allocate a new string_block, and
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1841 add all the Lisp_Strings in it to the free-list. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1842 if (string_free_list == NULL)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1843 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1844 struct string_block *b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1845 int i;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1846
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1847 b = (struct string_block *) lisp_malloc (sizeof *b, MEM_TYPE_STRING);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
1848 memset (b, 0, sizeof *b);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1849 b->next = string_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1850 string_blocks = b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1851 ++n_string_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1852
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
1853 for (i = STRING_BLOCK_SIZE - 1; i >= 0; --i)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1854 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1855 s = b->strings + i;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1856 NEXT_FREE_LISP_STRING (s) = string_free_list;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1857 string_free_list = s;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1858 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1859
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
1860 total_free_strings += STRING_BLOCK_SIZE;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1861 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1862
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
1863 check_string_free_list ();
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1864
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1865 /* Pop a Lisp_String off the free-list. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1866 s = string_free_list;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1867 string_free_list = NEXT_FREE_LISP_STRING (s);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1868
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1869 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1870
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1871 /* Probably not strictly necessary, but play it safe. */
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
1872 memset (s, 0, sizeof *s);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1873
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1874 --total_free_strings;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1875 ++total_strings;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1876 ++strings_consed;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1877 consing_since_gc += sizeof *s;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1878
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1879 #ifdef GC_CHECK_STRING_BYTES
87730
91da483b3fa5 * movemail.c:
Dan Nicolaescu <dann@ics.uci.edu>
parents: 87649
diff changeset
1880 if (!noninteractive)
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1881 {
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1882 if (++check_string_bytes_count == 200)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1883 {
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1884 check_string_bytes_count = 0;
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1885 check_string_bytes (1);
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1886 }
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1887 else
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1888 check_string_bytes (0);
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1889 }
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
1890 #endif /* GC_CHECK_STRING_BYTES */
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
1891
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1892 return s;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1893 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1894
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1895
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1896 /* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1897 plus a NUL byte at the end. Allocate an sdata structure for S, and
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1898 set S->data to its `u.data' member. Store a NUL byte at the end of
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1899 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1900 S->data if it was initially non-null. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1901
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1902 void
110480
5290c80fda43 Fix some uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 109901
diff changeset
1903 allocate_string_data (struct Lisp_String *s,
5290c80fda43 Fix some uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 109901
diff changeset
1904 EMACS_INT nchars, EMACS_INT nbytes)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1905 {
30293
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1906 struct sdata *data, *old_data;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1907 struct sblock *b;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
1908 EMACS_INT needed, old_nbytes;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1909
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1910 /* Determine the number of bytes needed to store NBYTES bytes
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1911 of string data. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1912 needed = SDATA_SIZE (nbytes);
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1913 old_data = s->data ? SDATA_OF_STRING (s) : NULL;
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1914 old_nbytes = GC_STRING_BYTES (s);
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1915
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1916 MALLOC_BLOCK_INPUT;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1917
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1918 if (nbytes > LARGE_STRING_BYTES)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1919 {
30557
5056adb52e97 (lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents: 30317
diff changeset
1920 size_t size = sizeof *b - sizeof (struct sdata) + needed;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1921
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1922 #ifdef DOUG_LEA_MALLOC
31576
717e7e2ca4fd Add some comments about DOUG_LEA_MALLOC's use of mmap
Gerd Moellmann <gerd@gnu.org>
parents: 31102
diff changeset
1923 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
717e7e2ca4fd Add some comments about DOUG_LEA_MALLOC's use of mmap
Gerd Moellmann <gerd@gnu.org>
parents: 31102
diff changeset
1924 because mapped region contents are not preserved in
51318
0b5248964d32 Comment.
Dave Love <fx@gnu.org>
parents: 51252
diff changeset
1925 a dumped Emacs.
0b5248964d32 Comment.
Dave Love <fx@gnu.org>
parents: 51252
diff changeset
1926
0b5248964d32 Comment.
Dave Love <fx@gnu.org>
parents: 51252
diff changeset
1927 In case you think of allowing it in a dumped Emacs at the
0b5248964d32 Comment.
Dave Love <fx@gnu.org>
parents: 51252
diff changeset
1928 cost of not being able to re-dump, there's another reason:
0b5248964d32 Comment.
Dave Love <fx@gnu.org>
parents: 51252
diff changeset
1929 mmap'ed data typically have an address towards the top of the
0b5248964d32 Comment.
Dave Love <fx@gnu.org>
parents: 51252
diff changeset
1930 address space, which won't fit into an EMACS_INT (at least on
0b5248964d32 Comment.
Dave Love <fx@gnu.org>
parents: 51252
diff changeset
1931 32-bit systems with the current tagging scheme). --fx */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1932 mallopt (M_MMAP_MAX, 0);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1933 #endif
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1934
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1935 b = (struct sblock *) lisp_malloc (size + GC_STRING_EXTRA, MEM_TYPE_NON_LISP);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1936
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1937 #ifdef DOUG_LEA_MALLOC
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1938 /* Back to a reasonable maximum of mmap'ed areas. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1939 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1940 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1941
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1942 b->next_free = &b->first_data;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1943 b->first_data.string = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1944 b->next = large_sblocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1945 large_sblocks = b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1946 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1947 else if (current_sblock == NULL
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1948 || (((char *) current_sblock + SBLOCK_SIZE
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1949 - (char *) current_sblock->next_free)
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1950 < (needed + GC_STRING_EXTRA)))
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1951 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1952 /* Not enough room in the current sblock. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
1953 b = (struct sblock *) lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1954 b->next_free = &b->first_data;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1955 b->first_data.string = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1956 b->next = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1957
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1958 if (current_sblock)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1959 current_sblock->next = b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1960 else
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1961 oldest_sblock = b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1962 current_sblock = b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1963 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1964 else
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1965 b = current_sblock;
30293
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1966
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1967 data = b->next_free;
68369
3422c551ad06 * alloc.c (allocate_string_data): Update next_free immediately, to
Chong Yidong <cyd@stupidchicken.com>
parents: 68350
diff changeset
1968 b->next_free = (struct sdata *) ((char *) data + needed + GC_STRING_EXTRA);
3422c551ad06 * alloc.c (allocate_string_data): Update next_free immediately, to
Chong Yidong <cyd@stupidchicken.com>
parents: 68350
diff changeset
1969
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
1970 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
1971
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1972 data->string = s;
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1973 s->data = SDATA_DATA (data);
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1974 #ifdef GC_CHECK_STRING_BYTES
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1975 SDATA_NBYTES (data) = nbytes;
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1976 #endif
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1977 s->size = nchars;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1978 s->size_byte = nbytes;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1979 s->data[nbytes] = '\0';
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1980 #ifdef GC_CHECK_STRING_OVERRUN
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
1981 memcpy (data + needed, string_overrun_cookie, GC_STRING_OVERRUN_COOKIE_SIZE);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
1982 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
1983
30293
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1984 /* If S had already data assigned, mark that as free by setting its
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1985 string back-pointer to null, and recording the size of the data
30317
96e65dc07fd7 (allocate_string_data): Don't copy old string contents.
Gerd Moellmann <gerd@gnu.org>
parents: 30293
diff changeset
1986 in it. */
30293
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1987 if (old_data)
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1988 {
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
1989 SDATA_NBYTES (old_data) = old_nbytes;
30293
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1990 old_data->string = NULL;
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1991 }
4a27d6a88c43 (allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents: 29781
diff changeset
1992
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1993 consing_since_gc += needed;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1994 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1995
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1996
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1997 /* Sweep and compact strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1998
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
1999 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2000 sweep_strings (void)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2001 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2002 struct string_block *b, *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2003 struct string_block *live_blocks = NULL;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2004
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2005 string_free_list = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2006 total_strings = total_free_strings = 0;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2007 total_string_size = 0;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2008
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2009 /* Scan strings_blocks, free Lisp_Strings that aren't marked. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2010 for (b = string_blocks; b; b = next)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2011 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2012 int i, nfree = 0;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2013 struct Lisp_String *free_list_before = string_free_list;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2014
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2015 next = b->next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2016
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
2017 for (i = 0; i < STRING_BLOCK_SIZE; ++i)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2018 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2019 struct Lisp_String *s = b->strings + i;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2020
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2021 if (s->data)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2022 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2023 /* String was not on free-list before. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2024 if (STRING_MARKED_P (s))
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2025 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2026 /* String is live; unmark it and its intervals. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2027 UNMARK_STRING (s);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2028
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2029 if (!NULL_INTERVAL_P (s->intervals))
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2030 UNMARK_BALANCE_INTERVALS (s->intervals);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2031
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2032 ++total_strings;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2033 total_string_size += STRING_BYTES (s);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2034 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2035 else
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2036 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2037 /* String is dead. Put it on the free-list. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2038 struct sdata *data = SDATA_OF_STRING (s);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2039
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2040 /* Save the size of S in its sdata so that we know
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2041 how large that is. Reset the sdata's string
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2042 back-pointer so that we know it's free. */
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2043 #ifdef GC_CHECK_STRING_BYTES
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2044 if (GC_STRING_BYTES (s) != SDATA_NBYTES (data))
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2045 abort ();
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2046 #else
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2047 data->u.nbytes = GC_STRING_BYTES (s);
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2048 #endif
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2049 data->string = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2050
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2051 /* Reset the strings's `data' member so that we
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2052 know it's free. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2053 s->data = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2054
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2055 /* Put the string on the free-list. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2056 NEXT_FREE_LISP_STRING (s) = string_free_list;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2057 string_free_list = s;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2058 ++nfree;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2059 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2060 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2061 else
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2062 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2063 /* S was on the free-list before. Put it there again. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2064 NEXT_FREE_LISP_STRING (s) = string_free_list;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2065 string_free_list = s;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2066 ++nfree;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2067 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2068 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2069
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2070 /* Free blocks that contain free Lisp_Strings only, except
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2071 the first two of them. */
51907
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
2072 if (nfree == STRING_BLOCK_SIZE
4073a8ee4fc0 (BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51843
diff changeset
2073 && total_free_strings > STRING_BLOCK_SIZE)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2074 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2075 lisp_free (b);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2076 --n_string_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2077 string_free_list = free_list_before;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2078 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2079 else
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2080 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2081 total_free_strings += nfree;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2082 b->next = live_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2083 live_blocks = b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2084 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2085 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2086
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
2087 check_string_free_list ();
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2088
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2089 string_blocks = live_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2090 free_large_strings ();
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2091 compact_small_strings ();
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2092
58707
57741ce4cd6b Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents: 58631
diff changeset
2093 check_string_free_list ();
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2094 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2095
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2096
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2097 /* Free dead large strings. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2098
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2099 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2100 free_large_strings (void)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2101 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2102 struct sblock *b, *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2103 struct sblock *live_blocks = NULL;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2104
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2105 for (b = large_sblocks; b; b = next)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2106 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2107 next = b->next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2108
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2109 if (b->first_data.string == NULL)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2110 lisp_free (b);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2111 else
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2112 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2113 b->next = live_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2114 live_blocks = b;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2115 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2116 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2117
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2118 large_sblocks = live_blocks;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2119 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2120
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2121
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2122 /* Compact data of small strings. Free sblocks that don't contain
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2123 data of live strings after compaction. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2124
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2125 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2126 compact_small_strings (void)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2127 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2128 struct sblock *b, *tb, *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2129 struct sdata *from, *to, *end, *tb_end;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2130 struct sdata *to_end, *from_end;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2131
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2132 /* TB is the sblock we copy to, TO is the sdata within TB we copy
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2133 to, and TB_END is the end of TB. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2134 tb = oldest_sblock;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2135 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2136 to = &tb->first_data;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2137
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2138 /* Step through the blocks from the oldest to the youngest. We
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2139 expect that old blocks will stabilize over time, so that less
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2140 copying will happen this way. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2141 for (b = oldest_sblock; b; b = b->next)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2142 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2143 end = b->next_free;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2144 xassert ((char *) end <= (char *) b + SBLOCK_SIZE);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2145
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2146 for (from = &b->first_data; from < end; from = from_end)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2147 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2148 /* Compute the next FROM here because copying below may
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2149 overwrite data we need to compute it. */
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2150 EMACS_INT nbytes;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2151
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2152 #ifdef GC_CHECK_STRING_BYTES
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2153 /* Check that the string size recorded in the string is the
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2154 same as the one recorded in the sdata structure. */
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2155 if (from->string
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2156 && GC_STRING_BYTES (from->string) != SDATA_NBYTES (from))
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2157 abort ();
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2158 #endif /* GC_CHECK_STRING_BYTES */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2159
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2160 if (from->string)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2161 nbytes = GC_STRING_BYTES (from->string);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2162 else
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2163 nbytes = SDATA_NBYTES (from);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2164
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2165 if (nbytes > LARGE_STRING_BYTES)
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2166 abort ();
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2167
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2168 nbytes = SDATA_SIZE (nbytes);
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2169 from_end = (struct sdata *) ((char *) from + nbytes + GC_STRING_EXTRA);
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2170
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2171 #ifdef GC_CHECK_STRING_OVERRUN
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2172 if (memcmp (string_overrun_cookie,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2173 (char *) from_end - GC_STRING_OVERRUN_COOKIE_SIZE,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2174 GC_STRING_OVERRUN_COOKIE_SIZE))
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2175 abort ();
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2176 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2177
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2178 /* FROM->string non-null means it's alive. Copy its data. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2179 if (from->string)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2180 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2181 /* If TB is full, proceed with the next sblock. */
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2182 to_end = (struct sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2183 if (to_end > tb_end)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2184 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2185 tb->next_free = to;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2186 tb = tb->next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2187 tb_end = (struct sdata *) ((char *) tb + SBLOCK_SIZE);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2188 to = &tb->first_data;
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2189 to_end = (struct sdata *) ((char *) to + nbytes + GC_STRING_EXTRA);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2190 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2191
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2192 /* Copy, and update the string's `data' pointer. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2193 if (from != to)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2194 {
30823
8ee3740aaf60 (compact_small_strings): Use safe_bcopy, add an
Gerd Moellmann <gerd@gnu.org>
parents: 30784
diff changeset
2195 xassert (tb != b || to <= from);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2196 memmove (to, from, nbytes + GC_STRING_EXTRA);
31897
a292cc13911a (GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents: 31892
diff changeset
2197 to->string->data = SDATA_DATA (to);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2198 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2199
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2200 /* Advance past the sdata we copied to. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2201 to = to_end;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2202 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2203 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2204 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2205
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2206 /* The rest of the sblocks following TB don't contain live data, so
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2207 we can free them. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2208 for (b = tb->next; b; b = next)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2209 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2210 next = b->next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2211 lisp_free (b);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2212 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2213
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2214 tb->next_free = to;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2215 tb->next = NULL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2216 current_sblock = tb;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2217 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2218
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2219
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2220 DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
55745
1c3b8ce97c63 (Fmake_string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 55720
diff changeset
2221 doc: /* Return a newly created string of length LENGTH, with INIT in each element.
1c3b8ce97c63 (Fmake_string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 55720
diff changeset
2222 LENGTH must be an integer.
1c3b8ce97c63 (Fmake_string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 55720
diff changeset
2223 INIT must be an integer that represents a character. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2224 (Lisp_Object length, Lisp_Object init)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2225 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2226 register Lisp_Object val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2227 register unsigned char *p, *end;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2228 int c;
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2229 EMACS_INT nbytes;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2230
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40113
diff changeset
2231 CHECK_NATNUM (length);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40113
diff changeset
2232 CHECK_NUMBER (init);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2233
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2234 c = XINT (init);
88898
ac49af641799 (Fmake_string): Use ASCII_CHAR_P, not SINGLE_BYTE_CHAR_P.
Kenichi Handa <handa@m17n.org>
parents: 88353
diff changeset
2235 if (ASCII_CHAR_P (c))
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2236 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2237 nbytes = XINT (length);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2238 val = make_uninit_string (nbytes);
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2239 p = SDATA (val);
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2240 end = p + SCHARS (val);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2241 while (p != end)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2242 *p++ = c;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2243 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2244 else
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2245 {
33800
7f148cfbd1f7 (Fmake_string): Use MAX_MULTIBYTE_LENGTH, instead of hard coded `4'.
Kenichi Handa <handa@m17n.org>
parents: 33764
diff changeset
2246 unsigned char str[MAX_MULTIBYTE_LENGTH];
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2247 int len = CHAR_STRING (c, str);
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2248 EMACS_INT string_len = XINT (length);
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2249
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2250 if (string_len > MOST_POSITIVE_FIXNUM / len)
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2251 error ("Maximum string size exceeded");
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2252 nbytes = len * string_len;
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2253 val = make_uninit_multibyte_string (string_len, nbytes);
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2254 p = SDATA (val);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2255 end = p + nbytes;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2256 while (p != end)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2257 {
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2258 memcpy (p, str, len);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2259 p += len;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2260 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2261 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2262
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2263 *p = 0;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2264 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2265 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2266
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2267
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2268 DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
68741
2892a36e596e (Fmake_bool_vector, Fpurecopy): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 68430
diff changeset
2269 doc: /* Return a new bool-vector of length LENGTH, using INIT for each element.
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
2270 LENGTH must be a number. INIT matters only in whether it is t or nil. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2271 (Lisp_Object length, Lisp_Object init)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2272 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2273 register Lisp_Object val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2274 struct Lisp_Bool_Vector *p;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2275 int real_init, i;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2276 EMACS_INT length_in_chars, length_in_elts;
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2277 int bits_per_value;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2278
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40113
diff changeset
2279 CHECK_NATNUM (length);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2280
55159
e4e9ec547c6f (Fmake_bool_vector): Use BOOL_VECTOR_BITS_PER_CHAR instead of
Andreas Schwab <schwab@suse.de>
parents: 53705
diff changeset
2281 bits_per_value = sizeof (EMACS_INT) * BOOL_VECTOR_BITS_PER_CHAR;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2282
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2283 length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value;
55159
e4e9ec547c6f (Fmake_bool_vector): Use BOOL_VECTOR_BITS_PER_CHAR instead of
Andreas Schwab <schwab@suse.de>
parents: 53705
diff changeset
2284 length_in_chars = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1)
e4e9ec547c6f (Fmake_bool_vector): Use BOOL_VECTOR_BITS_PER_CHAR instead of
Andreas Schwab <schwab@suse.de>
parents: 53705
diff changeset
2285 / BOOL_VECTOR_BITS_PER_CHAR);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2286
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2287 /* We must allocate one more elements than LENGTH_IN_ELTS for the
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2288 slot `size' of the struct Lisp_Bool_Vector. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2289 val = Fmake_vector (make_number (length_in_elts + 1), Qnil);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2290
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2291 /* Get rid of any bits that would cause confusion. */
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2292 XVECTOR (val)->size = 0; /* No Lisp_Object to trace in there. */
85022
96eb42c9e0e3 * window.h (struct window):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85021
diff changeset
2293 /* Use XVECTOR (val) rather than `p' because p->size is not TRT. */
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2294 XSETPVECTYPE (XVECTOR (val), PVEC_BOOL_VECTOR);
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2295
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2296 p = XBOOL_VECTOR (val);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2297 p->size = XFASTINT (length);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2298
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2299 real_init = (NILP (init) ? 0 : -1);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2300 for (i = 0; i < length_in_chars ; i++)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2301 p->data[i] = real_init;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2302
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2303 /* Clear the extraneous bits in the last byte. */
55159
e4e9ec547c6f (Fmake_bool_vector): Use BOOL_VECTOR_BITS_PER_CHAR instead of
Andreas Schwab <schwab@suse.de>
parents: 53705
diff changeset
2304 if (XINT (length) != length_in_chars * BOOL_VECTOR_BITS_PER_CHAR)
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2305 p->data[length_in_chars - 1]
55159
e4e9ec547c6f (Fmake_bool_vector): Use BOOL_VECTOR_BITS_PER_CHAR instead of
Andreas Schwab <schwab@suse.de>
parents: 53705
diff changeset
2306 &= (1 << (XINT (length) % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2307
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2308 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2309 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2310
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2311
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2312 /* Make a string from NBYTES bytes at CONTENTS, and compute the number
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2313 of characters from the contents. This string may be unibyte or
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2314 multibyte, depending on the contents. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2315
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2316 Lisp_Object
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2317 make_string (const char *contents, EMACS_INT nbytes)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2318 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2319 register Lisp_Object val;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2320 EMACS_INT nchars, multibyte_nbytes;
28997
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
2321
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
2322 parse_str_as_multibyte (contents, nbytes, &nchars, &multibyte_nbytes);
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
2323 if (nbytes == nchars || nbytes != multibyte_nbytes)
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
2324 /* CONTENTS contains no multibyte sequences or contains an invalid
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
2325 multibyte sequence. We must make unibyte string. */
33623
dda5cbf94928 (make_string): Fix previous change. Be sure to make
Kenichi Handa <handa@m17n.org>
parents: 32776
diff changeset
2326 val = make_unibyte_string (contents, nbytes);
dda5cbf94928 (make_string): Fix previous change. Be sure to make
Kenichi Handa <handa@m17n.org>
parents: 32776
diff changeset
2327 else
dda5cbf94928 (make_string): Fix previous change. Be sure to make
Kenichi Handa <handa@m17n.org>
parents: 32776
diff changeset
2328 val = make_multibyte_string (contents, nchars, nbytes);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2329 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2330 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2331
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2332
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2333 /* Make an unibyte string from LENGTH bytes at CONTENTS. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2334
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2335 Lisp_Object
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2336 make_unibyte_string (const char *contents, EMACS_INT length)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2337 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2338 register Lisp_Object val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2339 val = make_uninit_string (length);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2340 memcpy (SDATA (val), contents, length);
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2341 STRING_SET_UNIBYTE (val);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2342 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2343 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2344
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2345
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2346 /* Make a multibyte string from NCHARS characters occupying NBYTES
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2347 bytes at CONTENTS. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2348
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2349 Lisp_Object
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2350 make_multibyte_string (const char *contents,
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2351 EMACS_INT nchars, EMACS_INT nbytes)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2352 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2353 register Lisp_Object val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2354 val = make_uninit_multibyte_string (nchars, nbytes);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2355 memcpy (SDATA (val), contents, nbytes);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2356 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2357 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2358
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2359
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2360 /* Make a string from NCHARS characters occupying NBYTES bytes at
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2361 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2362
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2363 Lisp_Object
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2364 make_string_from_bytes (const char *contents,
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2365 EMACS_INT nchars, EMACS_INT nbytes)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2366 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2367 register Lisp_Object val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2368 val = make_uninit_multibyte_string (nchars, nbytes);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2369 memcpy (SDATA (val), contents, nbytes);
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2370 if (SBYTES (val) == SCHARS (val))
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2371 STRING_SET_UNIBYTE (val);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2372 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2373 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2374
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2375
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2376 /* Make a string from NCHARS characters occupying NBYTES bytes at
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2377 CONTENTS. The argument MULTIBYTE controls whether to label the
50200
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2378 string as multibyte. If NCHARS is negative, it counts the number of
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2379 characters by itself. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2380
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2381 Lisp_Object
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2382 make_specified_string (const char *contents,
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2383 EMACS_INT nchars, EMACS_INT nbytes, int multibyte)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2384 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2385 register Lisp_Object val;
50200
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2386
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2387 if (nchars < 0)
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2388 {
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2389 if (multibyte)
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2390 nchars = multibyte_chars_in_text (contents, nbytes);
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2391 else
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2392 nchars = nbytes;
fdeb795fc0ec (make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49911
diff changeset
2393 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2394 val = make_uninit_multibyte_string (nchars, nbytes);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2395 memcpy (SDATA (val), contents, nbytes);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2396 if (!multibyte)
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2397 STRING_SET_UNIBYTE (val);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2398 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2399 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2400
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2401
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2402 /* Make a string from the data at STR, treating it as multibyte if the
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2403 data warrants. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2404
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2405 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2406 build_string (const char *str)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2407 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2408 return make_string (str, strlen (str));
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2409 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2410
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2411
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2412 /* Return an unibyte Lisp_String set up to hold LENGTH characters
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2413 occupying LENGTH bytes. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2414
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2415 Lisp_Object
110480
5290c80fda43 Fix some uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 109901
diff changeset
2416 make_uninit_string (EMACS_INT length)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2417 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2418 Lisp_Object val;
81272
1842d7137ff2 (init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents: 77260
diff changeset
2419
1842d7137ff2 (init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents: 77260
diff changeset
2420 if (!length)
1842d7137ff2 (init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents: 77260
diff changeset
2421 return empty_unibyte_string;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2422 val = make_uninit_multibyte_string (length, length);
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
2423 STRING_SET_UNIBYTE (val);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2424 return val;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2425 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2426
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2427
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2428 /* Return a multibyte Lisp_String set up to hold NCHARS characters
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2429 which occupy NBYTES bytes. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2430
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2431 Lisp_Object
110480
5290c80fda43 Fix some uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 109901
diff changeset
2432 make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2433 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2434 Lisp_Object string;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2435 struct Lisp_String *s;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2436
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2437 if (nchars < 0)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2438 abort ();
81272
1842d7137ff2 (init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents: 77260
diff changeset
2439 if (!nbytes)
1842d7137ff2 (init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents: 77260
diff changeset
2440 return empty_multibyte_string;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2441
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2442 s = allocate_string ();
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2443 allocate_string_data (s, nchars, nbytes);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2444 XSETSTRING (string, s);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2445 string_chars_consed += nbytes;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2446 return string;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2447 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2448
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2449
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2450
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2451 /***********************************************************************
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2452 Float Allocation
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2453 ***********************************************************************/
1908
d649f2179d67 * alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents: 1893
diff changeset
2454
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2455 /* We store float cells inside of float_blocks, allocating a new
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2456 float_block with malloc whenever necessary. Float cells reclaimed
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2457 by GC are put on a free list to be reallocated before allocating
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2458 any new float cells from the latest float_block. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2459
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
2460 #define FLOAT_BLOCK_SIZE \
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
2461 (((BLOCK_BYTES - sizeof (struct float_block *) \
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
2462 /* The compiler might add padding at the end. */ \
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
2463 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2464 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2465
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2466 #define GETMARKBIT(block,n) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2467 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2468 >> ((n) % (sizeof(int) * CHAR_BIT))) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2469 & 1)
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2470
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2471 #define SETMARKBIT(block,n) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2472 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2473 |= 1 << ((n) % (sizeof(int) * CHAR_BIT))
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2474
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2475 #define UNSETMARKBIT(block,n) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2476 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2477 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT)))
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2478
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2479 #define FLOAT_BLOCK(fptr) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2480 ((struct float_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1)))
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2481
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2482 #define FLOAT_INDEX(fptr) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2483 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2484
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2485 struct float_block
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2486 {
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2487 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2488 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2489 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2490 struct float_block *next;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2491 };
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2492
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2493 #define FLOAT_MARKED_P(fptr) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2494 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2495
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2496 #define FLOAT_MARK(fptr) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2497 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2498
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2499 #define FLOAT_UNMARK(fptr) \
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2500 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr)))
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2501
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2502 /* Current float_block. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2503
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2504 struct float_block *float_block;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2505
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2506 /* Index of first unused Lisp_Float in the current float_block. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2507
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2508 int float_block_index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2509
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2510 /* Total number of float blocks now in use. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2511
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2512 int n_float_blocks;
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2513
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2514 /* Free-list of Lisp_Floats. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2515
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2516 struct Lisp_Float *float_free_list;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2517
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2518
39297
aff361cfdccb Fix a typo in a comment. From Pavel Janik.
Eli Zaretskii <eliz@gnu.org>
parents: 39228
diff changeset
2519 /* Initialize float allocation. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2520
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
2521 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2522 init_float (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2523 {
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2524 float_block = NULL;
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2525 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2526 float_free_list = 0;
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2527 n_float_blocks = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2528 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2529
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2530
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2531 /* Return a new float object with value FLOAT_VALUE. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2532
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2533 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2534 make_float (double float_value)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2535 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2536 register Lisp_Object val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2537
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2538 /* eassert (!handling_signal); */
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2539
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
2540 MALLOC_BLOCK_INPUT;
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
2541
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2542 if (float_free_list)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2543 {
19666
81957e8b80e2 (free_float, free_cons): Don't use the same field for chaining as for marking.
Richard M. Stallman <rms@gnu.org>
parents: 19621
diff changeset
2544 /* We use the data field for chaining the free list
81957e8b80e2 (free_float, free_cons): Don't use the same field for chaining as for marking.
Richard M. Stallman <rms@gnu.org>
parents: 19621
diff changeset
2545 so that we won't use the same field that has the mark bit. */
9261
e5ba7993d378 (VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents: 9144
diff changeset
2546 XSETFLOAT (val, float_free_list);
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
2547 float_free_list = float_free_list->u.chain;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2548 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2549 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2550 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2551 if (float_block_index == FLOAT_BLOCK_SIZE)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2552 {
12529
c7d32f5da2b3 (Flist): Rewritten.
Karl Heuer <kwzh@gnu.org>
parents: 12273
diff changeset
2553 register struct float_block *new;
c7d32f5da2b3 (Flist): Rewritten.
Karl Heuer <kwzh@gnu.org>
parents: 12273
diff changeset
2554
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2555 new = (struct float_block *) lisp_align_malloc (sizeof *new,
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
2556 MEM_TYPE_FLOAT);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2557 new->next = float_block;
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2558 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2559 float_block = new;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2560 float_block_index = 0;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2561 n_float_blocks++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2562 }
53093
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
2563 XSETFLOAT (val, &float_block->floats[float_block_index]);
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
2564 float_block_index++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2565 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2566
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
2567 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2568
104313
73f76307d49b * lisp.h (XFLOAT_DATA): Produce an rvalue by adding 0 to the value.
Ken Raeburn <raeburn@raeburn.org>
parents: 101689
diff changeset
2569 XFLOAT_INIT (val, float_value);
53093
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
2570 eassert (!FLOAT_MARKED_P (XFLOAT (val)));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2571 consing_since_gc += sizeof (struct Lisp_Float);
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
2572 floats_consed++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2573 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2574 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2575
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2576
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2577
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2578 /***********************************************************************
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2579 Cons Allocation
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2580 ***********************************************************************/
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2581
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2582 /* We store cons cells inside of cons_blocks, allocating a new
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2583 cons_block with malloc whenever necessary. Cons cells reclaimed by
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2584 GC are put on a free list to be reallocated before allocating
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2585 any new cons cells from the latest cons_block. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2586
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2587 #define CONS_BLOCK_SIZE \
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2588 (((BLOCK_BYTES - sizeof (struct cons_block *)) * CHAR_BIT) \
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2589 / (sizeof (struct Lisp_Cons) * CHAR_BIT + 1))
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2590
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2591 #define CONS_BLOCK(fptr) \
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2592 ((struct cons_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1)))
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2593
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2594 #define CONS_INDEX(fptr) \
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2595 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2596
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2597 struct cons_block
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2598 {
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2599 /* Place `conses' at the beginning, to ease up CONS_INDEX's job. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2600 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2601 int gcmarkbits[1 + CONS_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)];
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2602 struct cons_block *next;
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2603 };
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2604
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2605 #define CONS_MARKED_P(fptr) \
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2606 GETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2607
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2608 #define CONS_MARK(fptr) \
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2609 SETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2610
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2611 #define CONS_UNMARK(fptr) \
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2612 UNSETMARKBIT (CONS_BLOCK (fptr), CONS_INDEX ((fptr)))
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2613
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2614 /* Current cons_block. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2615
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2616 struct cons_block *cons_block;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2617
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2618 /* Index of first unused Lisp_Cons in the current block. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2619
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2620 int cons_block_index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2621
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2622 /* Free-list of Lisp_Cons structures. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2623
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2624 struct Lisp_Cons *cons_free_list;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2625
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2626 /* Total number of cons blocks now in use. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2627
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
2628 static int n_cons_blocks;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2629
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2630
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2631 /* Initialize cons allocation. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2632
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
2633 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2634 init_cons (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2635 {
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2636 cons_block = NULL;
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2637 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2638 cons_free_list = 0;
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2639 n_cons_blocks = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2640 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2641
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2642
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2643 /* Explicitly free a cons cell by putting it on the free-list. */
20375
1dd0bd0749b5 (malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents: 20057
diff changeset
2644
1dd0bd0749b5 (malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents: 20057
diff changeset
2645 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2646 free_cons (struct Lisp_Cons *ptr)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2647 {
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
2648 ptr->u.chain = cons_free_list;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2649 #if GC_MARK_STACK
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2650 ptr->car = Vdead;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2651 #endif
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2652 cons_free_list = ptr;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2653 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2654
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2655 DEFUN ("cons", Fcons, Scons, 2, 2, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
2656 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2657 (Lisp_Object car, Lisp_Object cdr)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2658 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2659 register Lisp_Object val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2660
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2661 /* eassert (!handling_signal); */
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2662
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
2663 MALLOC_BLOCK_INPUT;
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
2664
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2665 if (cons_free_list)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2666 {
19666
81957e8b80e2 (free_float, free_cons): Don't use the same field for chaining as for marking.
Richard M. Stallman <rms@gnu.org>
parents: 19621
diff changeset
2667 /* We use the cdr for chaining the free list
81957e8b80e2 (free_float, free_cons): Don't use the same field for chaining as for marking.
Richard M. Stallman <rms@gnu.org>
parents: 19621
diff changeset
2668 so that we won't use the same field that has the mark bit. */
9261
e5ba7993d378 (VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents: 9144
diff changeset
2669 XSETCONS (val, cons_free_list);
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
2670 cons_free_list = cons_free_list->u.chain;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2671 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2672 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2673 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2674 if (cons_block_index == CONS_BLOCK_SIZE)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2675 {
12529
c7d32f5da2b3 (Flist): Rewritten.
Karl Heuer <kwzh@gnu.org>
parents: 12273
diff changeset
2676 register struct cons_block *new;
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2677 new = (struct cons_block *) lisp_align_malloc (sizeof *new,
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
2678 MEM_TYPE_CONS);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2679 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2680 new->next = cons_block;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2681 cons_block = new;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2682 cons_block_index = 0;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2683 n_cons_blocks++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2684 }
53093
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
2685 XSETCONS (val, &cons_block->conses[cons_block_index]);
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
2686 cons_block_index++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2687 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2688
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
2689 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2690
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39914
diff changeset
2691 XSETCAR (val, car);
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39914
diff changeset
2692 XSETCDR (val, cdr);
53093
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
2693 eassert (!CONS_MARKED_P (XCONS (val)));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2694 consing_since_gc += sizeof (struct Lisp_Cons);
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
2695 cons_cells_consed++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2696 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2697 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2698
56539
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2699 /* Get an error now if there's any junk in the cons free list. */
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2700 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2701 check_cons_list (void)
56539
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2702 {
58631
7c469d30a12d Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents: 58593
diff changeset
2703 #ifdef GC_CHECK_CONS_LIST
56539
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2704 struct Lisp_Cons *tail = cons_free_list;
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2705
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2706 while (tail)
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
2707 tail = tail->u.chain;
56539
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2708 #endif
9fc5aae4053e (check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents: 56401
diff changeset
2709 }
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2710
71967
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
2711 /* Make a list of 1, 2, 3, 4 or 5 specified objects. */
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
2712
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
2713 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2714 list1 (Lisp_Object arg1)
71967
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
2715 {
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
2716 return Fcons (arg1, Qnil);
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
2717 }
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2718
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2719 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2720 list2 (Lisp_Object arg1, Lisp_Object arg2)
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2721 {
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2722 return Fcons (arg1, Fcons (arg2, Qnil));
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2723 }
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2724
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2725
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2726 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2727 list3 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2728 {
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2729 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2730 }
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2731
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2732
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2733 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2734 list4 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4)
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2735 {
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2736 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2737 }
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2738
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2739
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2740 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2741 list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
20849
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2742 {
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2743 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2744 Fcons (arg5, Qnil)))));
3b2f72ed135c (list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 20768
diff changeset
2745 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2746
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2747
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2748 DEFUN ("list", Flist, Slist, 0, MANY, 0,
40977
6ec709b442c8 (Flist): Reindent.
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
2749 doc: /* Return a newly created list with specified arguments as elements.
40113
66132b83e52a (Fmake_byte_code, Fvector, Flist): Add usage: string to doc string.
Miles Bader <miles@gnu.org>
parents: 40107
diff changeset
2750 Any number of arguments, even zero arguments, are allowed.
66132b83e52a (Fmake_byte_code, Fvector, Flist): Add usage: string to doc string.
Miles Bader <miles@gnu.org>
parents: 40107
diff changeset
2751 usage: (list &rest OBJECTS) */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2752 (int nargs, register Lisp_Object *args)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2753 {
13610
8e82e46aa77b (Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents: 13553
diff changeset
2754 register Lisp_Object val;
8e82e46aa77b (Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents: 13553
diff changeset
2755 val = Qnil;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2756
13610
8e82e46aa77b (Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents: 13553
diff changeset
2757 while (nargs > 0)
8e82e46aa77b (Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents: 13553
diff changeset
2758 {
8e82e46aa77b (Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents: 13553
diff changeset
2759 nargs--;
8e82e46aa77b (Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents: 13553
diff changeset
2760 val = Fcons (args[nargs], val);
8e82e46aa77b (Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents: 13553
diff changeset
2761 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2762 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2763 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2764
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2765
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2766 DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
2767 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2768 (register Lisp_Object length, Lisp_Object init)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2769 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2770 register Lisp_Object val;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2771 register EMACS_INT size;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2772
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40113
diff changeset
2773 CHECK_NATNUM (length);
9953
e0672d4cf470 (Fmake_list, Fmake_vector, Fmake_string): Use CHECK_NATNUM instead of its
Karl Heuer <kwzh@gnu.org>
parents: 9942
diff changeset
2774 size = XFASTINT (length);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2775
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2776 val = Qnil;
35762
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2777 while (size > 0)
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2778 {
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2779 val = Fcons (init, val);
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2780 --size;
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2781
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2782 if (size > 0)
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2783 {
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2784 val = Fcons (init, val);
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2785 --size;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2786
35762
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2787 if (size > 0)
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2788 {
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2789 val = Fcons (init, val);
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2790 --size;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2791
35762
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2792 if (size > 0)
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2793 {
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2794 val = Fcons (init, val);
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2795 --size;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2796
35762
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2797 if (size > 0)
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2798 {
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2799 val = Fcons (init, val);
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2800 --size;
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2801 }
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2802 }
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2803 }
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2804 }
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2805
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2806 QUIT;
e197a82c3286 (Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents: 35660
diff changeset
2807 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2808
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2809 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2810 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2811
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2812
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2813
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2814 /***********************************************************************
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2815 Vector Allocation
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2816 ***********************************************************************/
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2817
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2818 /* Singly-linked list of all vectors. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2819
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
2820 static struct Lisp_Vector *all_vectors;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2821
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2822 /* Total number of vector-like objects now in use. */
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
2823
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
2824 static int n_vectors;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
2825
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2826
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2827 /* Value is a pointer to a newly allocated Lisp_Vector structure
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2828 with room for LEN Lisp_Objects. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2829
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2830 static struct Lisp_Vector *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2831 allocate_vectorlike (EMACS_INT len)
9968
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2832 {
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2833 struct Lisp_Vector *p;
30557
5056adb52e97 (lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents: 30317
diff changeset
2834 size_t nbytes;
9968
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2835
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
2836 MALLOC_BLOCK_INPUT;
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
2837
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
2838 #ifdef DOUG_LEA_MALLOC
31576
717e7e2ca4fd Add some comments about DOUG_LEA_MALLOC's use of mmap
Gerd Moellmann <gerd@gnu.org>
parents: 31102
diff changeset
2839 /* Prevent mmap'ing the chunk. Lisp data may not be mmap'ed
717e7e2ca4fd Add some comments about DOUG_LEA_MALLOC's use of mmap
Gerd Moellmann <gerd@gnu.org>
parents: 31102
diff changeset
2840 because mapped region contents are not preserved in
717e7e2ca4fd Add some comments about DOUG_LEA_MALLOC's use of mmap
Gerd Moellmann <gerd@gnu.org>
parents: 31102
diff changeset
2841 a dumped Emacs. */
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
2842 mallopt (M_MMAP_MAX, 0);
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
2843 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2844
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
2845 /* This gets triggered by code which I haven't bothered to fix. --Stef */
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
2846 /* eassert (!handling_signal); */
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
2847
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2848 nbytes = sizeof *p + (len - 1) * sizeof p->contents[0];
84978
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
2849 p = (struct Lisp_Vector *) lisp_malloc (nbytes, MEM_TYPE_VECTORLIKE);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2850
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
2851 #ifdef DOUG_LEA_MALLOC
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2852 /* Back to a reasonable maximum of mmap'ed areas. */
23973
2eb9e2f5aa33 (MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 23958
diff changeset
2853 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
2854 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2855
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2856 consing_since_gc += nbytes;
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
2857 vector_cells_consed += len;
9968
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2858
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2859 p->next = all_vectors;
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2860 all_vectors = p;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2861
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
2862 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
2863
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2864 ++n_vectors;
9968
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2865 return p;
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2866 }
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2867
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2868
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2869 /* Allocate a vector with NSLOTS slots. */
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2870
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2871 struct Lisp_Vector *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2872 allocate_vector (EMACS_INT nslots)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2873 {
84978
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
2874 struct Lisp_Vector *v = allocate_vectorlike (nslots);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2875 v->size = nslots;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2876 return v;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2877 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2878
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2879
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2880 /* Allocate other vector-like structures. */
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2881
86160
1ede747999c6 * alloc.c (ALLOCATE_PSEUDOVECTOR): Move to lisp.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85674
diff changeset
2882 struct Lisp_Vector *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2883 allocate_pseudovector (int memlen, int lisplen, EMACS_INT tag)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2884 {
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2885 struct Lisp_Vector *v = allocate_vectorlike (memlen);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2886 EMACS_INT i;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2887
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2888 /* Only the first lisplen slots will be traced normally by the GC. */
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2889 v->size = lisplen;
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2890 for (i = 0; i < lisplen; ++i)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2891 v->contents[i] = Qnil;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
2892
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2893 XSETPVECTYPE (v, tag); /* Add the appropriate tag. */
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2894 return v;
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2895 }
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2896
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2897 struct Lisp_Hash_Table *
85021
a0c901e4e649 * lisp.h (struct Lisp_Hash_Table): Move non-traced elements at the end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85020
diff changeset
2898 allocate_hash_table (void)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2899 {
85021
a0c901e4e649 * lisp.h (struct Lisp_Hash_Table): Move non-traced elements at the end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85020
diff changeset
2900 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2901 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2902
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2903
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2904 struct window *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2905 allocate_window (void)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2906 {
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2907 return ALLOCATE_PSEUDOVECTOR(struct window, current_matrix, PVEC_WINDOW);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2908 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2909
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2910
84693
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
2911 struct terminal *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2912 allocate_terminal (void)
84693
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
2913 {
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2914 struct terminal *t = ALLOCATE_PSEUDOVECTOR (struct terminal,
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2915 next_terminal, PVEC_TERMINAL);
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2916 /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2917 memset (&t->next_terminal, 0,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2918 (char*) (t + 1) - (char*) &t->next_terminal);
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2919
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2920 return t;
84693
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
2921 }
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
2922
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2923 struct frame *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2924 allocate_frame (void)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2925 {
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2926 struct frame *f = ALLOCATE_PSEUDOVECTOR (struct frame,
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2927 face_cache, PVEC_FRAME);
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2928 /* Zero out the non-GC'd fields. FIXME: This should be made unnecessary. */
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2929 memset (&f->face_cache, 0,
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
2930 (char *) (f + 1) - (char *) &f->face_cache);
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2931 return f;
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2932 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2933
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2934
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2935 struct Lisp_Process *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
2936 allocate_process (void)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2937 {
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
2938 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2939 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2940
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2941
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2942 DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
2943 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
2944 See also the function `vector'. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2945 (register Lisp_Object length, Lisp_Object init)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2946 {
9968
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2947 Lisp_Object vector;
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2948 register EMACS_INT sizei;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
2949 register EMACS_INT index;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2950 register struct Lisp_Vector *p;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2951
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40113
diff changeset
2952 CHECK_NATNUM (length);
9953
e0672d4cf470 (Fmake_list, Fmake_vector, Fmake_string): Use CHECK_NATNUM instead of its
Karl Heuer <kwzh@gnu.org>
parents: 9942
diff changeset
2953 sizei = XFASTINT (length);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2954
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
2955 p = allocate_vector (sizei);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2956 for (index = 0; index < sizei; index++)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2957 p->contents[index] = init;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2958
9968
943a61c764a5 (Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents: 9953
diff changeset
2959 XSETVECTOR (vector, p);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2960 return vector;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2961 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2962
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2963
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2964 DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
40977
6ec709b442c8 (Flist): Reindent.
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
2965 doc: /* Return a newly created vector with specified arguments as elements.
40113
66132b83e52a (Fmake_byte_code, Fvector, Flist): Add usage: string to doc string.
Miles Bader <miles@gnu.org>
parents: 40107
diff changeset
2966 Any number of arguments, even zero arguments, are allowed.
66132b83e52a (Fmake_byte_code, Fvector, Flist): Add usage: string to doc string.
Miles Bader <miles@gnu.org>
parents: 40107
diff changeset
2967 usage: (vector &rest OBJECTS) */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2968 (register int nargs, Lisp_Object *args)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2969 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2970 register Lisp_Object len, val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2971 register int index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2972 register struct Lisp_Vector *p;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2973
9295
17d393a8eed6 (free_float, make_float, free_cons, Flist, Fvector, Fmake_byte_code,
Karl Heuer <kwzh@gnu.org>
parents: 9261
diff changeset
2974 XSETFASTINT (len, nargs);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2975 val = Fmake_vector (len, Qnil);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2976 p = XVECTOR (val);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2977 for (index = 0; index < nargs; index++)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2978 p->contents[index] = args[index];
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2979 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2980 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2981
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
2982
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2983 DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
2984 doc: /* Create a byte-code object with specified arguments as elements.
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
2985 The arguments should be the arglist, bytecode-string, constant vector,
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
2986 stack size, (optional) doc string, and (optional) interactive spec.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
2987 The first four arguments are required; at most six have any
40113
66132b83e52a (Fmake_byte_code, Fvector, Flist): Add usage: string to doc string.
Miles Bader <miles@gnu.org>
parents: 40107
diff changeset
2988 significance.
50626
a5a77c7717cb (Fmake_byte_code): Improve the `usage' string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50468
diff changeset
2989 usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
2990 (register int nargs, Lisp_Object *args)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2991 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2992 register Lisp_Object len, val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2993 register int index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2994 register struct Lisp_Vector *p;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2995
9295
17d393a8eed6 (free_float, make_float, free_cons, Flist, Fvector, Fmake_byte_code,
Karl Heuer <kwzh@gnu.org>
parents: 9261
diff changeset
2996 XSETFASTINT (len, nargs);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 434
diff changeset
2997 if (!NILP (Vpurify_flag))
16101
039e96495054 (Fmake_byte_code): Call make_pure_vector using nargs.
Richard M. Stallman <rms@gnu.org>
parents: 16100
diff changeset
2998 val = make_pure_vector ((EMACS_INT) nargs);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2999 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3000 val = Fmake_vector (len, Qnil);
28997
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3001
109278
d14945d39811 * alloc.c (Fmake_byte_code): Don't access undefined argument (Bug#6517).
Andreas Schwab <schwab@linux-m68k.org>
parents: 106950
diff changeset
3002 if (nargs > 1 && STRINGP (args[1]) && STRING_MULTIBYTE (args[1]))
28997
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3003 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3004 earlier because they produced a raw 8-bit string for byte-code
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3005 and now such a byte-code string is loaded as multibyte while
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3006 raw 8-bit characters converted to multibyte form. Thus, now we
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3007 must convert them back to the original unibyte form. */
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3008 args[1] = Fstring_as_unibyte (args[1]);
fc8d42f77d4f (Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents: 28469
diff changeset
3009
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3010 p = XVECTOR (val);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3011 for (index = 0; index < nargs; index++)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3012 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 434
diff changeset
3013 if (!NILP (Vpurify_flag))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3014 args[index] = Fpurecopy (args[index]);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3015 p->contents[index] = args[index];
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3016 }
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
3017 XSETPVECTYPE (p, PVEC_COMPILED);
18104
b2a669ef69b1 (Fmake_byte_code): Set val from p, not from val.
Richard M. Stallman <rms@gnu.org>
parents: 18010
diff changeset
3018 XSETCOMPILED (val, p);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3019 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3020 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3021
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3022
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3023
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3024 /***********************************************************************
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3025 Symbol Allocation
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3026 ***********************************************************************/
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3027
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3028 /* Each symbol_block is just under 1020 bytes long, since malloc
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3029 really allocates in units of powers of two and uses 4 bytes for its
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3030 own overhead. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3031
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3032 #define SYMBOL_BLOCK_SIZE \
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3033 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3034
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3035 struct symbol_block
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3036 {
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3037 /* Place `symbols' first, to preserve alignment. */
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3038 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3039 struct symbol_block *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3040 };
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3041
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3042 /* Current symbol block and index of first unused Lisp_Symbol
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3043 structure in it. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3044
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3045 static struct symbol_block *symbol_block;
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3046 static int symbol_block_index;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3047
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3048 /* List of free symbols. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3049
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3050 static struct Lisp_Symbol *symbol_free_list;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3051
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
3052 /* Total number of symbol blocks now in use. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3053
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3054 static int n_symbol_blocks;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
3055
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3056
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3057 /* Initialize symbol allocation. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3058
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3059 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3060 init_symbol (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3061 {
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
3062 symbol_block = NULL;
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
3063 symbol_block_index = SYMBOL_BLOCK_SIZE;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3064 symbol_free_list = 0;
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
3065 n_symbol_blocks = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3066 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3067
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3068
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3069 DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
3070 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
3071 Its value and function definition are void, and its property list is nil. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
3072 (Lisp_Object name)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3073 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3074 register Lisp_Object val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3075 register struct Lisp_Symbol *p;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3076
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 40113
diff changeset
3077 CHECK_STRING (name);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3078
68974
977852fb2e3b (Fmake_symbol): Comment-out left-over assert from before we added BLOCK_INPUTs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68741
diff changeset
3079 /* eassert (!handling_signal); */
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
3080
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
3081 MALLOC_BLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
3082
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3083 if (symbol_free_list)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3084 {
9261
e5ba7993d378 (VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents: 9144
diff changeset
3085 XSETSYMBOL (val, symbol_free_list);
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
3086 symbol_free_list = symbol_free_list->next;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3087 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3088 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3089 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3090 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3091 {
12529
c7d32f5da2b3 (Flist): Rewritten.
Karl Heuer <kwzh@gnu.org>
parents: 12273
diff changeset
3092 struct symbol_block *new;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3093 new = (struct symbol_block *) lisp_malloc (sizeof *new,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3094 MEM_TYPE_SYMBOL);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3095 new->next = symbol_block;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3096 symbol_block = new;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3097 symbol_block_index = 0;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
3098 n_symbol_blocks++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3099 }
53093
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
3100 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index]);
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
3101 symbol_block_index++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3102 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3103
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
3104 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
3105
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3106 p = XSYMBOL (val);
45392
f3d7ab65641f * alloc.c (Fmake_symbol): Set symbol xname field instead of name.
Ken Raeburn <raeburn@raeburn.org>
parents: 44890
diff changeset
3107 p->xname = name;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3108 p->plist = Qnil;
107984
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
3109 p->redirect = SYMBOL_PLAINVAL;
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
3110 SET_SYMBOL_VAL (p, Qunbound);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3111 p->function = Qunbound;
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
3112 p->next = NULL;
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
3113 p->gcmarkbit = 0;
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
3114 p->interned = SYMBOL_UNINTERNED;
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
3115 p->constant = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3116 consing_since_gc += sizeof (struct Lisp_Symbol);
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
3117 symbols_consed++;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3118 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3119 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3120
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3121
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3122
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3123 /***********************************************************************
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3124 Marker (Misc) Allocation
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3125 ***********************************************************************/
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3126
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3127 /* Allocation of markers and other objects that share that structure.
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3128 Works like allocation of conses. */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3129
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3130 #define MARKER_BLOCK_SIZE \
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3131 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3132
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3133 struct marker_block
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
3134 {
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3135 /* Place `markers' first, to preserve alignment. */
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3136 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3137 struct marker_block *next;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3138 };
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3139
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3140 static struct marker_block *marker_block;
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3141 static int marker_block_index;
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3142
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3143 static union Lisp_Misc *marker_free_list;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3144
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
3145 /* Total number of marker blocks now in use. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3146
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3147 static int n_marker_blocks;
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3148
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
3149 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3150 init_marker (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3151 {
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
3152 marker_block = NULL;
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
3153 marker_block_index = MARKER_BLOCK_SIZE;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3154 marker_free_list = 0;
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
3155 n_marker_blocks = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3156 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3157
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3158 /* Return a newly allocated Lisp_Misc object, with no substructure. */
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3159
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3160 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3161 allocate_misc (void)
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3162 {
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3163 Lisp_Object val;
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3164
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
3165 /* eassert (!handling_signal); */
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
3166
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
3167 MALLOC_BLOCK_INPUT;
68350
263a4edafafa (lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67494
diff changeset
3168
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3169 if (marker_free_list)
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3170 {
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3171 XSETMISC (val, marker_free_list);
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3172 marker_free_list = marker_free_list->u_free.chain;
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3173 }
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3174 else
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3175 {
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3176 if (marker_block_index == MARKER_BLOCK_SIZE)
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3177 {
12529
c7d32f5da2b3 (Flist): Rewritten.
Karl Heuer <kwzh@gnu.org>
parents: 12273
diff changeset
3178 struct marker_block *new;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3179 new = (struct marker_block *) lisp_malloc (sizeof *new,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3180 MEM_TYPE_MISC);
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3181 new->next = marker_block;
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3182 marker_block = new;
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3183 marker_block_index = 0;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
3184 n_marker_blocks++;
56239
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3185 total_free_markers += MARKER_BLOCK_SIZE;
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3186 }
53093
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
3187 XSETMISC (val, &marker_block->markers[marker_block_index]);
e8f5463f3d5b (make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52837
diff changeset
3188 marker_block_index++;
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3189 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3190
84977
3747382d60e9 (MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84954
diff changeset
3191 MALLOC_UNBLOCK_INPUT;
68430
47782d80f30b * alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents: 68398
diff changeset
3192
56239
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3193 --total_free_markers;
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3194 consing_since_gc += sizeof (union Lisp_Misc);
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
3195 misc_objects_consed++;
85328
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
3196 XMISCANY (val)->gcmarkbit = 0;
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3197 return val;
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3198 }
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3199
56239
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3200 /* Free a Lisp_Misc object */
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3201
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3202 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3203 free_misc (Lisp_Object misc)
56239
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3204 {
85344
99492f857499 (free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85329
diff changeset
3205 XMISCTYPE (misc) = Lisp_Misc_Free;
56239
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3206 XMISC (misc)->u_free.chain = marker_free_list;
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3207 marker_free_list = XMISC (misc);
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3208
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3209 total_free_markers++;
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3210 }
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3211
49055
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3212 /* Return a Lisp_Misc_Save_Value object containing POINTER and
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3213 INTEGER. This is used to package C values to call record_unwind_protect.
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3214 The unwind function can get the C values back using XSAVE_VALUE. */
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3215
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3216 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3217 make_save_value (void *pointer, int integer)
49055
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3218 {
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3219 register Lisp_Object val;
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3220 register struct Lisp_Save_Value *p;
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3221
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3222 val = allocate_misc ();
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3223 XMISCTYPE (val) = Lisp_Misc_Save_Value;
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3224 p = XSAVE_VALUE (val);
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3225 p->pointer = pointer;
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3226 p->integer = integer;
56202
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
3227 p->dogc = 0;
49055
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3228 return val;
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3229 }
cea2e52c7ca5 (make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents: 48907
diff changeset
3230
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3231 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
3232 doc: /* Return a newly allocated marker which does not point at any place. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
3233 (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3234 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3235 register Lisp_Object val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3236 register struct Lisp_Marker *p;
638
40b255f55df3 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 624
diff changeset
3237
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
3238 val = allocate_misc ();
11243
054ecfce1820 (Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents: 11048
diff changeset
3239 XMISCTYPE (val) = Lisp_Misc_Marker;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3240 p = XMARKER (val);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3241 p->buffer = 0;
20565
aa9b7c5f0f62 (Fmake_marker): Initialize marker's bytepos and charpos.
Richard M. Stallman <rms@gnu.org>
parents: 20495
diff changeset
3242 p->bytepos = 0;
aa9b7c5f0f62 (Fmake_marker): Initialize marker's bytepos and charpos.
Richard M. Stallman <rms@gnu.org>
parents: 20495
diff changeset
3243 p->charpos = 0;
51668
0f333fd92a1d (survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51658
diff changeset
3244 p->next = NULL;
13008
f042ef632b22 (Fmake_marker): Initialize insertion_type to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12748
diff changeset
3245 p->insertion_type = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3246 return val;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3247 }
19332
58f14958f5d5 (free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18621
diff changeset
3248
58f14958f5d5 (free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18621
diff changeset
3249 /* Put MARKER back on the free list after using it temporarily. */
58f14958f5d5 (free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18621
diff changeset
3250
20375
1dd0bd0749b5 (malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents: 20057
diff changeset
3251 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3252 free_marker (Lisp_Object marker)
19332
58f14958f5d5 (free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18621
diff changeset
3253 {
51668
0f333fd92a1d (survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51658
diff changeset
3254 unchain_marker (XMARKER (marker));
56239
a446552d2240 (allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents: 56202
diff changeset
3255 free_misc (marker);
19332
58f14958f5d5 (free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18621
diff changeset
3256 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3257
21258
693573ac0944 (make_specified_string): New function.
Richard M. Stallman <rms@gnu.org>
parents: 21244
diff changeset
3258
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3259 /* Return a newly created vector or string with specified arguments as
2013
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3260 elements. If all the arguments are characters that can fit
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3261 in a string of events, make a string; otherwise, make a vector.
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3262
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3263 Any number of arguments, even zero arguments, are allowed. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3264
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3265 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3266 make_event_array (register int nargs, Lisp_Object *args)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3267 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3268 int i;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3269
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3270 for (i = 0; i < nargs; i++)
2013
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3271 /* The things that fit in a string
3536
58d5ee6ec253 (make_event_array): Ignore bits above CHAR_META.
Richard M. Stallman <rms@gnu.org>
parents: 3181
diff changeset
3272 are characters that are in 0...127,
58d5ee6ec253 (make_event_array): Ignore bits above CHAR_META.
Richard M. Stallman <rms@gnu.org>
parents: 3181
diff changeset
3273 after discarding the meta bit and all the bits above it. */
9144
0e29f6a4fe7c (Fmake_list, Fmake_vector, Fmake_string, make_event_array): Use type test
Karl Heuer <kwzh@gnu.org>
parents: 8940
diff changeset
3274 if (!INTEGERP (args[i])
3536
58d5ee6ec253 (make_event_array): Ignore bits above CHAR_META.
Richard M. Stallman <rms@gnu.org>
parents: 3181
diff changeset
3275 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3276 return Fvector (nargs, args);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3277
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3278 /* Since the loop exited, we know that all the things in it are
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3279 characters, so we can make a string. */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3280 {
6492
8372dce85f8a (make_event_array): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents: 6227
diff changeset
3281 Lisp_Object result;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3282
18104
b2a669ef69b1 (Fmake_byte_code): Set val from p, not from val.
Richard M. Stallman <rms@gnu.org>
parents: 18010
diff changeset
3283 result = Fmake_string (make_number (nargs), make_number (0));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3284 for (i = 0; i < nargs; i++)
2013
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3285 {
46418
b12a32662433 * alloc.c (make_event_array): Use SSET for storing into a string.
Ken Raeburn <raeburn@raeburn.org>
parents: 46370
diff changeset
3286 SSET (result, i, XINT (args[i]));
2013
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3287 /* Move the meta bit to the right place for a string char. */
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3288 if (XINT (args[i]) & CHAR_META)
46418
b12a32662433 * alloc.c (make_event_array): Use SSET for storing into a string.
Ken Raeburn <raeburn@raeburn.org>
parents: 46370
diff changeset
3289 SSET (result, i, SREF (result, i) | 0x80);
2013
e2a164ac4088 (Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
3290 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3291
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3292 return result;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3293 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3294 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3295
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
3296
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3297
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3298 /************************************************************************
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3299 Memory Full Handling
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3300 ************************************************************************/
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3301
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3302
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3303 /* Called if malloc returns zero. */
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3304
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3305 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3306 memory_full (void)
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3307 {
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3308 int i;
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3309
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3310 Vmemory_full = Qt;
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3311
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3312 memory_full_cons_threshold = sizeof (struct cons_block);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3313
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3314 /* The first time we get here, free the spare memory. */
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3315 for (i = 0; i < sizeof (spare_memory) / sizeof (char *); i++)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3316 if (spare_memory[i])
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3317 {
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3318 if (i == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3319 free (spare_memory[i]);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3320 else if (i >= 1 && i <= 4)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3321 lisp_align_free (spare_memory[i]);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3322 else
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3323 lisp_free (spare_memory[i]);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3324 spare_memory[i] = 0;
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3325 }
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3326
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3327 /* Record the space now used. When it decreases substantially,
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3328 we can refill the memory reserve. */
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3329 #ifndef SYSTEM_MALLOC
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3330 bytes_used_when_full = BYTES_USED;
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3331 #endif
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3332
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3333 /* This used to call error, but if we've run out of memory, we could
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3334 get infinite recursion trying to build the string. */
71967
3254b987edcb (buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents: 69876
diff changeset
3335 xsignal (Qnil, Vmemory_signal_data);
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3336 }
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3337
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3338 /* If we released our reserve (due to running out of memory),
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3339 and we have a fair amount free once again,
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3340 try to set aside another reserve in case we run out once more.
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3341
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3342 This is called when a relocatable block is freed in ralloc.c,
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3343 and also directly from this file, in case we're not using ralloc.c. */
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3344
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3345 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3346 refill_memory_reserve (void)
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3347 {
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3348 #ifndef SYSTEM_MALLOC
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3349 if (spare_memory[0] == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3350 spare_memory[0] = (char *) malloc ((size_t) SPARE_MEMORY);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3351 if (spare_memory[1] == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3352 spare_memory[1] = (char *) lisp_align_malloc (sizeof (struct cons_block),
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3353 MEM_TYPE_CONS);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3354 if (spare_memory[2] == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3355 spare_memory[2] = (char *) lisp_align_malloc (sizeof (struct cons_block),
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3356 MEM_TYPE_CONS);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3357 if (spare_memory[3] == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3358 spare_memory[3] = (char *) lisp_align_malloc (sizeof (struct cons_block),
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3359 MEM_TYPE_CONS);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3360 if (spare_memory[4] == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3361 spare_memory[4] = (char *) lisp_align_malloc (sizeof (struct cons_block),
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3362 MEM_TYPE_CONS);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3363 if (spare_memory[5] == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3364 spare_memory[5] = (char *) lisp_malloc (sizeof (struct string_block),
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3365 MEM_TYPE_STRING);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3366 if (spare_memory[6] == 0)
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3367 spare_memory[6] = (char *) lisp_malloc (sizeof (struct string_block),
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3368 MEM_TYPE_STRING);
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3369 if (spare_memory[0] && spare_memory[1] && spare_memory[5])
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3370 Vmemory_full = Qnil;
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3371 #endif
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3372 }
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3373
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
3374 /************************************************************************
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3375 C Stack Marking
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3376 ************************************************************************/
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3377
32700
25c6c2562e31 (toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents: 32699
diff changeset
3378 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
25c6c2562e31 (toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents: 32699
diff changeset
3379
42403
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3380 /* Conservative C stack marking requires a method to identify possibly
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3381 live Lisp objects given a pointer value. We do this by keeping
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3382 track of blocks of Lisp data that are allocated in a red-black tree
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3383 (see also the comment of mem_node which is the type of nodes in
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3384 that tree). Function lisp_malloc adds information for an allocated
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3385 block to the red-black tree with calls to mem_insert, and function
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3386 lisp_free removes it with mem_delete. Functions live_string_p etc
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3387 call mem_find to lookup information about a given pointer in the
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3388 tree, and use that to determine if the pointer points to a Lisp
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3389 object or not. */
6643f205d5db Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents: 42096
diff changeset
3390
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3391 /* Initialize this part of alloc.c. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3392
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3393 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3394 mem_init (void)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3395 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3396 mem_z.left = mem_z.right = MEM_NIL;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3397 mem_z.parent = NULL;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3398 mem_z.color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3399 mem_z.start = mem_z.end = NULL;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3400 mem_root = MEM_NIL;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3401 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3402
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3403
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3404 /* Value is a pointer to the mem_node containing START. Value is
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3405 MEM_NIL if there is no node in the tree containing START. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3406
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3407 static INLINE struct mem_node *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3408 mem_find (void *start)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3409 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3410 struct mem_node *p;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3411
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
3412 if (start < min_heap_address || start > max_heap_address)
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
3413 return MEM_NIL;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
3414
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3415 /* Make the search always successful to speed up the loop below. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3416 mem_z.start = start;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3417 mem_z.end = (char *) start + 1;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3418
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3419 p = mem_root;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3420 while (start < p->start || start >= p->end)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3421 p = start < p->start ? p->left : p->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3422 return p;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3423 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3424
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3425
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3426 /* Insert a new node into the tree for a block of memory with start
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3427 address START, end address END, and type TYPE. Value is a
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3428 pointer to the node that was inserted. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3429
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3430 static struct mem_node *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3431 mem_insert (void *start, void *end, enum mem_type type)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3432 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3433 struct mem_node *c, *parent, *x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3434
77260
a6fbfb6a0580 (mem_insert): Set min_heap_address and max_heap_address
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 75406
diff changeset
3435 if (min_heap_address == NULL || start < min_heap_address)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
3436 min_heap_address = start;
77260
a6fbfb6a0580 (mem_insert): Set min_heap_address and max_heap_address
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 75406
diff changeset
3437 if (max_heap_address == NULL || end > max_heap_address)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
3438 max_heap_address = end;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
3439
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3440 /* See where in the tree a node for START belongs. In this
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3441 particular application, it shouldn't happen that a node is already
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3442 present. For debugging purposes, let's check that. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3443 c = mem_root;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3444 parent = NULL;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3445
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3446 #if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3447
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3448 while (c != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3449 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3450 if (start >= c->start && start < c->end)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3451 abort ();
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3452 parent = c;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3453 c = start < c->start ? c->left : c->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3454 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3455
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3456 #else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3457
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3458 while (c != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3459 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3460 parent = c;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3461 c = start < c->start ? c->left : c->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3462 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3463
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3464 #endif /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3465
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3466 /* Create a new node. */
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3467 #ifdef GC_MALLOC_CHECK
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3468 x = (struct mem_node *) _malloc_internal (sizeof *x);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3469 if (x == NULL)
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3470 abort ();
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3471 #else
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3472 x = (struct mem_node *) xmalloc (sizeof *x);
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3473 #endif
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3474 x->start = start;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3475 x->end = end;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3476 x->type = type;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3477 x->parent = parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3478 x->left = x->right = MEM_NIL;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3479 x->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3480
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3481 /* Insert it as child of PARENT or install it as root. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3482 if (parent)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3483 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3484 if (start < parent->start)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3485 parent->left = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3486 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3487 parent->right = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3488 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3489 else
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3490 mem_root = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3491
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3492 /* Re-establish red-black tree properties. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3493 mem_insert_fixup (x);
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3494
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3495 return x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3496 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3497
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3498
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3499 /* Re-establish the red-black properties of the tree, and thereby
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3500 balance the tree, after node X has been inserted; X is always red. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3501
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3502 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3503 mem_insert_fixup (struct mem_node *x)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3504 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3505 while (x != mem_root && x->parent->color == MEM_RED)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3506 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3507 /* X is red and its parent is red. This is a violation of
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3508 red-black tree property #3. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3509
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3510 if (x->parent == x->parent->parent->left)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3511 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3512 /* We're on the left side of our grandparent, and Y is our
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3513 "uncle". */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3514 struct mem_node *y = x->parent->parent->right;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3515
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3516 if (y->color == MEM_RED)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3517 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3518 /* Uncle and parent are red but should be black because
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3519 X is red. Change the colors accordingly and proceed
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3520 with the grandparent. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3521 x->parent->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3522 y->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3523 x->parent->parent->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3524 x = x->parent->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3525 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3526 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3527 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3528 /* Parent and uncle have different colors; parent is
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3529 red, uncle is black. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3530 if (x == x->parent->right)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3531 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3532 x = x->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3533 mem_rotate_left (x);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3534 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3535
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3536 x->parent->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3537 x->parent->parent->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3538 mem_rotate_right (x->parent->parent);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3539 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3540 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3541 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3542 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3543 /* This is the symmetrical case of above. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3544 struct mem_node *y = x->parent->parent->left;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3545
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3546 if (y->color == MEM_RED)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3547 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3548 x->parent->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3549 y->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3550 x->parent->parent->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3551 x = x->parent->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3552 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3553 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3554 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3555 if (x == x->parent->left)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3556 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3557 x = x->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3558 mem_rotate_right (x);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3559 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3560
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3561 x->parent->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3562 x->parent->parent->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3563 mem_rotate_left (x->parent->parent);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3564 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3565 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3566 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3567
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3568 /* The root may have been changed to red due to the algorithm. Set
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3569 it to black so that property #5 is satisfied. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3570 mem_root->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3571 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3572
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3573
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3574 /* (x) (y)
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3575 / \ / \
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3576 a (y) ===> (x) c
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3577 / \ / \
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3578 b c a b */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3579
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3580 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3581 mem_rotate_left (struct mem_node *x)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3582 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3583 struct mem_node *y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3584
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3585 /* Turn y's left sub-tree into x's right sub-tree. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3586 y = x->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3587 x->right = y->left;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3588 if (y->left != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3589 y->left->parent = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3590
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3591 /* Y's parent was x's parent. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3592 if (y != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3593 y->parent = x->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3594
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3595 /* Get the parent to point to y instead of x. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3596 if (x->parent)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3597 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3598 if (x == x->parent->left)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3599 x->parent->left = y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3600 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3601 x->parent->right = y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3602 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3603 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3604 mem_root = y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3605
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3606 /* Put x on y's left. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3607 y->left = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3608 if (x != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3609 x->parent = y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3610 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3611
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3612
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3613 /* (x) (Y)
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3614 / \ / \
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3615 (y) c ===> a (x)
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3616 / \ / \
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3617 a b b c */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3618
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3619 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3620 mem_rotate_right (struct mem_node *x)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3621 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3622 struct mem_node *y = x->left;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3623
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3624 x->left = y->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3625 if (y->right != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3626 y->right->parent = x;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3627
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3628 if (y != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3629 y->parent = x->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3630 if (x->parent)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3631 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3632 if (x == x->parent->right)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3633 x->parent->right = y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3634 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3635 x->parent->left = y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3636 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3637 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3638 mem_root = y;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3639
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3640 y->right = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3641 if (x != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3642 x->parent = y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3643 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3644
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3645
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3646 /* Delete node Z from the tree. If Z is null or MEM_NIL, do nothing. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3647
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3648 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3649 mem_delete (struct mem_node *z)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3650 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3651 struct mem_node *x, *y;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3652
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3653 if (!z || z == MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3654 return;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3655
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3656 if (z->left == MEM_NIL || z->right == MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3657 y = z;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3658 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3659 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3660 y = z->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3661 while (y->left != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3662 y = y->left;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3663 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3664
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3665 if (y->left != MEM_NIL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3666 x = y->left;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3667 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3668 x = y->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3669
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3670 x->parent = y->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3671 if (y->parent)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3672 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3673 if (y == y->parent->left)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3674 y->parent->left = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3675 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3676 y->parent->right = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3677 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3678 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3679 mem_root = x;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3680
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3681 if (y != z)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3682 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3683 z->start = y->start;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3684 z->end = y->end;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3685 z->type = y->type;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3686 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3687
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3688 if (y->color == MEM_BLACK)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3689 mem_delete_fixup (x);
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3690
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3691 #ifdef GC_MALLOC_CHECK
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3692 _free_internal (y);
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3693 #else
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3694 xfree (y);
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
3695 #endif
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3696 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3697
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3698
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3699 /* Re-establish the red-black properties of the tree, after a
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3700 deletion. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3701
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3702 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3703 mem_delete_fixup (struct mem_node *x)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3704 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3705 while (x != mem_root && x->color == MEM_BLACK)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3706 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3707 if (x == x->parent->left)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3708 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3709 struct mem_node *w = x->parent->right;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3710
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3711 if (w->color == MEM_RED)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3712 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3713 w->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3714 x->parent->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3715 mem_rotate_left (x->parent);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3716 w = x->parent->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3717 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3718
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3719 if (w->left->color == MEM_BLACK && w->right->color == MEM_BLACK)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3720 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3721 w->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3722 x = x->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3723 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3724 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3725 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3726 if (w->right->color == MEM_BLACK)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3727 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3728 w->left->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3729 w->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3730 mem_rotate_right (w);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3731 w = x->parent->right;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3732 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3733 w->color = x->parent->color;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3734 x->parent->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3735 w->right->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3736 mem_rotate_left (x->parent);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3737 x = mem_root;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3738 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3739 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3740 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3741 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3742 struct mem_node *w = x->parent->left;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3743
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3744 if (w->color == MEM_RED)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3745 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3746 w->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3747 x->parent->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3748 mem_rotate_right (x->parent);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3749 w = x->parent->left;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3750 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3751
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3752 if (w->right->color == MEM_BLACK && w->left->color == MEM_BLACK)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3753 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3754 w->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3755 x = x->parent;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3756 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3757 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3758 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3759 if (w->left->color == MEM_BLACK)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3760 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3761 w->right->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3762 w->color = MEM_RED;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3763 mem_rotate_left (w);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3764 w = x->parent->left;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3765 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3766
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3767 w->color = x->parent->color;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3768 x->parent->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3769 w->left->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3770 mem_rotate_right (x->parent);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3771 x = mem_root;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3772 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3773 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3774 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3775
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3776 x->color = MEM_BLACK;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3777 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3778
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3779
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3780 /* Value is non-zero if P is a pointer to a live Lisp string on
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3781 the heap. M is a pointer to the mem_block for P. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3782
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3783 static INLINE int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3784 live_string_p (struct mem_node *m, void *p)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3785 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3786 if (m->type == MEM_TYPE_STRING)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3787 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3788 struct string_block *b = (struct string_block *) m->start;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
3789 ptrdiff_t offset = (char *) p - (char *) &b->strings[0];
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3790
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3791 /* P must point to the start of a Lisp_String structure, and it
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3792 must not be on the free-list. */
37049
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3793 return (offset >= 0
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3794 && offset % sizeof b->strings[0] == 0
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3795 && offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3796 && ((struct Lisp_String *) p)->data != NULL);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3797 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3798 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3799 return 0;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3800 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3801
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3802
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3803 /* Value is non-zero if P is a pointer to a live Lisp cons on
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3804 the heap. M is a pointer to the mem_block for P. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3805
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3806 static INLINE int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3807 live_cons_p (struct mem_node *m, void *p)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3808 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3809 if (m->type == MEM_TYPE_CONS)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3810 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3811 struct cons_block *b = (struct cons_block *) m->start;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
3812 ptrdiff_t offset = (char *) p - (char *) &b->conses[0];
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3813
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3814 /* P must point to the start of a Lisp_Cons, not be
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3815 one of the unused cells in the current cons block,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3816 and not be on the free-list. */
37049
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3817 return (offset >= 0
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3818 && offset % sizeof b->conses[0] == 0
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
3819 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3820 && (b != cons_block
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3821 || offset / sizeof b->conses[0] < cons_block_index)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3822 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3823 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3824 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3825 return 0;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3826 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3827
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3828
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3829 /* Value is non-zero if P is a pointer to a live Lisp symbol on
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3830 the heap. M is a pointer to the mem_block for P. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3831
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3832 static INLINE int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3833 live_symbol_p (struct mem_node *m, void *p)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3834 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3835 if (m->type == MEM_TYPE_SYMBOL)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3836 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3837 struct symbol_block *b = (struct symbol_block *) m->start;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
3838 ptrdiff_t offset = (char *) p - (char *) &b->symbols[0];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3839
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3840 /* P must point to the start of a Lisp_Symbol, not be
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3841 one of the unused cells in the current symbol block,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3842 and not be on the free-list. */
37049
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3843 return (offset >= 0
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3844 && offset % sizeof b->symbols[0] == 0
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3845 && offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3846 && (b != symbol_block
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3847 || offset / sizeof b->symbols[0] < symbol_block_index)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3848 && !EQ (((struct Lisp_Symbol *) p)->function, Vdead));
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3849 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3850 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3851 return 0;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3852 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3853
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3854
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3855 /* Value is non-zero if P is a pointer to a live Lisp float on
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3856 the heap. M is a pointer to the mem_block for P. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3857
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3858 static INLINE int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3859 live_float_p (struct mem_node *m, void *p)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3860 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3861 if (m->type == MEM_TYPE_FLOAT)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3862 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3863 struct float_block *b = (struct float_block *) m->start;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
3864 ptrdiff_t offset = (char *) p - (char *) &b->floats[0];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3865
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
3866 /* P must point to the start of a Lisp_Float and not be
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
3867 one of the unused cells in the current float block. */
37049
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3868 return (offset >= 0
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3869 && offset % sizeof b->floats[0] == 0
51779
f01acdb936f9 (live_float_p): Check that p is not past the `floats' array,
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51770
diff changeset
3870 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3871 && (b != float_block
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
3872 || offset / sizeof b->floats[0] < float_block_index));
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3873 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3874 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3875 return 0;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3876 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3877
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3878
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3879 /* Value is non-zero if P is a pointer to a live Lisp Misc on
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3880 the heap. M is a pointer to the mem_block for P. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3881
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3882 static INLINE int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3883 live_misc_p (struct mem_node *m, void *p)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3884 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3885 if (m->type == MEM_TYPE_MISC)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3886 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3887 struct marker_block *b = (struct marker_block *) m->start;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
3888 ptrdiff_t offset = (char *) p - (char *) &b->markers[0];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3889
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3890 /* P must point to the start of a Lisp_Misc, not be
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3891 one of the unused cells in the current misc block,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3892 and not be on the free-list. */
37049
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3893 return (offset >= 0
184d1fb71cc1 (live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents: 36487
diff changeset
3894 && offset % sizeof b->markers[0] == 0
53582
b4eef5adebbf (struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53555
diff changeset
3895 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3896 && (b != marker_block
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3897 || offset / sizeof b->markers[0] < marker_block_index)
85344
99492f857499 (free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85329
diff changeset
3898 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3899 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3900 else
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3901 return 0;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3902 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3903
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3904
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3905 /* Value is non-zero if P is a pointer to a live vector-like object.
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3906 M is a pointer to the mem_block for P. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3907
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3908 static INLINE int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3909 live_vector_p (struct mem_node *m, void *p)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3910 {
84978
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
3911 return (p == m->start && m->type == MEM_TYPE_VECTORLIKE);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3912 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3913
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3914
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
3915 /* Value is non-zero if P is a pointer to a live buffer. M is a
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3916 pointer to the mem_block for P. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3917
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3918 static INLINE int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3919 live_buffer_p (struct mem_node *m, void *p)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3920 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3921 /* P must point to the start of the block, and the buffer
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3922 must not have been killed. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3923 return (m->type == MEM_TYPE_BUFFER
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3924 && p == m->start
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3925 && !NILP (((struct buffer *) p)->name));
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3926 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3927
32700
25c6c2562e31 (toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents: 32699
diff changeset
3928 #endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
25c6c2562e31 (toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents: 32699
diff changeset
3929
25c6c2562e31 (toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents: 32699
diff changeset
3930 #if GC_MARK_STACK
25c6c2562e31 (toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents: 32699
diff changeset
3931
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3932 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3933
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3934 /* Array of objects that are kept alive because the C stack contains
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3935 a pattern that looks like a reference to them . */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3936
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3937 #define MAX_ZOMBIES 10
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3938 static Lisp_Object zombies[MAX_ZOMBIES];
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3939
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3940 /* Number of zombie objects. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3941
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3942 static int nzombies;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3943
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3944 /* Number of garbage collections. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3945
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3946 static int ngcs;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3947
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3948 /* Average percentage of zombies per collection. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3949
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3950 static double avg_zombies;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3951
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3952 /* Max. number of live and zombie objects. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3953
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3954 static int max_live, max_zombies;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3955
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3956 /* Average number of live objects per GC. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3957
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3958 static double avg_live;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3959
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3960 DEFUN ("gc-status", Fgc_status, Sgc_status, 0, 0, "",
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
3961 doc: /* Show information about live and zombie objects. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
3962 (void)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3963 {
49357
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
3964 Lisp_Object args[8], zombie_list = Qnil;
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
3965 int i;
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
3966 for (i = 0; i < nzombies; i++)
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
3967 zombie_list = Fcons (zombies[i], zombie_list);
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
3968 args[0] = build_string ("%d GCs, avg live/zombies = %.2f/%.2f (%f%%), max %d/%d\nzombies: %S");
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3969 args[1] = make_number (ngcs);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3970 args[2] = make_float (avg_live);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3971 args[3] = make_float (avg_zombies);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3972 args[4] = make_float (avg_zombies / avg_live / 100);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3973 args[5] = make_number (max_live);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3974 args[6] = make_number (max_zombies);
49357
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
3975 args[7] = zombie_list;
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
3976 return Fmessage (8, args);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3977 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3978
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3979 #endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3980
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
3981
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3982 /* Mark OBJ if we can prove it's a Lisp_Object. */
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3983
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3984 static INLINE void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
3985 mark_maybe_object (Lisp_Object obj)
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3986 {
111670
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3987 void *po;
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3988 struct mem_node *m;
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3989
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3990 if (INTEGERP (obj))
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3991 return;
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3992
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3993 po = (void *) XPNTR (obj);
f736e5e4fef4 * alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 111632
diff changeset
3994 m = mem_find (po);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
3995
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3996 if (m != MEM_NIL)
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3997 {
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3998 int mark_p = 0;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
3999
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
4000 switch (XTYPE (obj))
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4001 {
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4002 case Lisp_String:
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4003 mark_p = (live_string_p (m, po)
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4004 && !STRING_MARKED_P ((struct Lisp_String *) po));
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4005 break;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4006
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4007 case Lisp_Cons:
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
4008 mark_p = (live_cons_p (m, po) && !CONS_MARKED_P (XCONS (obj)));
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4009 break;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4010
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4011 case Lisp_Symbol:
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
4012 mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4013 break;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4014
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4015 case Lisp_Float:
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
4016 mark_p = (live_float_p (m, po) && !FLOAT_MARKED_P (XFLOAT (obj)));
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4017 break;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4018
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4019 case Lisp_Vectorlike:
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
4020 /* Note: can't check BUFFERP before we know it's a
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4021 buffer because checking that dereferences the pointer
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4022 PO which might point anywhere. */
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4023 if (live_vector_p (m, po))
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
4024 mark_p = !SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj));
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4025 else if (live_buffer_p (m, po))
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
4026 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4027 break;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4028
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4029 case Lisp_Misc:
85328
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
4030 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit);
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4031 break;
31829
43566b0aec59 Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents: 31576
diff changeset
4032
105885
8103235103a7 Let integers use up 2 tags to give them one extra bit and double their range.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105881
diff changeset
4033 default:
31829
43566b0aec59 Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents: 31576
diff changeset
4034 break;
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4035 }
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4036
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4037 if (mark_p)
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4038 {
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4039 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4040 if (nzombies < MAX_ZOMBIES)
49357
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
4041 zombies[nzombies] = obj;
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4042 ++nzombies;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4043 #endif
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
4044 mark_object (obj);
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4045 }
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4046 }
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4047 }
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4048
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4049
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4050 /* If P points to Lisp data, mark that as live if it isn't already
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4051 marked. */
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4052
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4053 static INLINE void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4054 mark_maybe_pointer (void *p)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4055 {
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4056 struct mem_node *m;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4057
81798
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4058 /* Quickly rule out some values which can't point to Lisp data. */
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4059 if ((EMACS_INT) p %
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4060 #ifdef USE_LSB_TAG
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4061 8 /* USE_LSB_TAG needs Lisp data to be aligned on multiples of 8. */
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4062 #else
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4063 2 /* We assume that Lisp data is aligned on even addresses. */
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4064 #endif
3b39669cb653 (mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81272
diff changeset
4065 )
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4066 return;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4067
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4068 m = mem_find (p);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4069 if (m != MEM_NIL)
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4070 {
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4071 Lisp_Object obj = Qnil;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4072
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4073 switch (m->type)
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4074 {
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4075 case MEM_TYPE_NON_LISP:
36487
4df2ac60690e (mark_maybe_pointer): Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 36435
diff changeset
4076 /* Nothing to do; not a pointer to Lisp memory. */
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4077 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4078
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4079 case MEM_TYPE_BUFFER:
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
4080 if (live_buffer_p (m, p) && !VECTOR_MARKED_P((struct buffer *)p))
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4081 XSETVECTOR (obj, p);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4082 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4083
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4084 case MEM_TYPE_CONS:
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
4085 if (live_cons_p (m, p) && !CONS_MARKED_P ((struct Lisp_Cons *) p))
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4086 XSETCONS (obj, p);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4087 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4088
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4089 case MEM_TYPE_STRING:
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4090 if (live_string_p (m, p)
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4091 && !STRING_MARKED_P ((struct Lisp_String *) p))
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4092 XSETSTRING (obj, p);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4093 break;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4094
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4095 case MEM_TYPE_MISC:
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
4096 if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
4097 XSETMISC (obj, p);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4098 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4099
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4100 case MEM_TYPE_SYMBOL:
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
4101 if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4102 XSETSYMBOL (obj, p);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4103 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4104
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4105 case MEM_TYPE_FLOAT:
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
4106 if (live_float_p (m, p) && !FLOAT_MARKED_P (p))
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4107 XSETFLOAT (obj, p);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4108 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4109
84978
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
4110 case MEM_TYPE_VECTORLIKE:
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4111 if (live_vector_p (m, p))
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4112 {
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4113 Lisp_Object tem;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4114 XSETVECTOR (tem, p);
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
4115 if (!SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem)))
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4116 obj = tem;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4117 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4118 break;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4119
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4120 default:
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4121 abort ();
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4122 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4123
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
4124 if (!NILP (obj))
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
4125 mark_object (obj);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4126 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4127 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4128
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4129
73964
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4130 /* Mark Lisp objects referenced from the address range START+OFFSET..END
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4131 or END+OFFSET..START. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4132
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4133 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4134 mark_memory (void *start, void *end, int offset)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4135 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4136 Lisp_Object *p;
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4137 void **pp;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4138
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4139 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4140 nzombies = 0;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4141 #endif
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4142
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4143 /* Make START the pointer to the start of the memory region,
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4144 if it isn't already. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4145 if (end < start)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4146 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4147 void *tem = start;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4148 start = end;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4149 end = tem;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4150 }
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4151
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4152 /* Mark Lisp_Objects. */
73964
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4153 for (p = (Lisp_Object *) ((char *) start + offset); (void *) p < end; ++p)
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4154 mark_maybe_object (*p);
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4155
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4156 /* Mark Lisp data pointed to. This is necessary because, in some
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4157 situations, the C compiler optimizes Lisp objects away, so that
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4158 only a pointer to them remains. Example:
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4159
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4160 DEFUN ("testme", Ftestme, Stestme, 0, 0, 0, "")
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
4161 ()
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4162 {
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4163 Lisp_Object obj = build_string ("test");
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4164 struct Lisp_String *s = XSTRING (obj);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4165 Fgarbage_collect ();
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4166 fprintf (stderr, "test `%s'\n", s->data);
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4167 return Qnil;
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4168 }
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4169
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4170 Here, `obj' isn't really used, and the compiler optimizes it
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4171 away. The only reference to the life string is through the
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4172 pointer `s'. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4173
73964
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4174 for (pp = (void **) ((char *) start + offset); (void *) pp < end; ++pp)
36435
5a989d353a68 (toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents: 35762
diff changeset
4175 mark_maybe_pointer (*pp);
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4176 }
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4177
48316
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4178 /* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4179 the GCC system configuration. In gcc 3.2, the only systems for
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4180 which this is so are i386-sco5 non-ELF, i386-sysv3 (maybe included
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4181 by others?) and ns32k-pc532-min. */
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4182
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4183 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4184
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4185 static int setjmp_tested_p, longjmps_done;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4186
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4187 #define SETJMP_WILL_LIKELY_WORK "\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4188 \n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4189 Emacs garbage collector has been changed to use conservative stack\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4190 marking. Emacs has determined that the method it uses to do the\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4191 marking will likely work on your system, but this isn't sure.\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4192 \n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4193 If you are a system-programmer, or can get the help of a local wizard\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4194 who is, please take a look at the function mark_stack in alloc.c, and\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4195 verify that the methods used are appropriate for your system.\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4196 \n\
43200
4082674ce69b (SETJMP_WILL_LIKELY_WORK, SETJMP_WILL_NOT_WORK):
Kim F. Storm <storm@cua.dk>
parents: 43161
diff changeset
4197 Please mail the result to <emacs-devel@gnu.org>.\n\
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4198 "
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4199
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4200 #define SETJMP_WILL_NOT_WORK "\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4201 \n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4202 Emacs garbage collector has been changed to use conservative stack\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4203 marking. Emacs has determined that the default method it uses to do the\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4204 marking will not work on your system. We will need a system-dependent\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4205 solution for your system.\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4206 \n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4207 Please take a look at the function mark_stack in alloc.c, and\n\
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4208 try to find a way to make it work on your system.\n\
48316
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4209 \n\
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4210 Note that you may get false negatives, depending on the compiler.\n\
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4211 In particular, you need to use -O with GCC for this test.\n\
043dddbc037a (SETJMP_WILL_NOT_WORK): Add note.
Dave Love <fx@gnu.org>
parents: 47391
diff changeset
4212 \n\
43200
4082674ce69b (SETJMP_WILL_LIKELY_WORK, SETJMP_WILL_NOT_WORK):
Kim F. Storm <storm@cua.dk>
parents: 43161
diff changeset
4213 Please mail the result to <emacs-devel@gnu.org>.\n\
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4214 "
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4215
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4216
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4217 /* Perform a quick check if it looks like setjmp saves registers in a
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4218 jmp_buf. Print a message to stderr saying so. When this test
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4219 succeeds, this is _not_ a proof that setjmp is sufficient for
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4220 conservative stack marking. Only the sources or a disassembly
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4221 can prove that. */
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4222
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4223 static void
112125
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4224 test_setjmp (void)
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4225 {
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4226 char buf[10];
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4227 register int x;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4228 jmp_buf jbuf;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4229 int result = 0;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4230
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4231 /* Arrange for X to be put in a register. */
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4232 sprintf (buf, "1");
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4233 x = strlen (buf);
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4234 x = 2 * x - 1;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4235
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4236 setjmp (jbuf);
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4237 if (longjmps_done == 1)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4238 {
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4239 /* Came here after the longjmp at the end of the function.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4240
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4241 If x == 1, the longjmp has restored the register to its
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4242 value before the setjmp, and we can hope that setjmp
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4243 saves all such registers in the jmp_buf, although that
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4244 isn't sure.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4245
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4246 For other values of X, either something really strange is
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4247 taking place, or the setjmp just didn't save the register. */
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4248
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4249 if (x == 1)
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4250 fprintf (stderr, SETJMP_WILL_LIKELY_WORK);
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4251 else
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4252 {
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4253 fprintf (stderr, SETJMP_WILL_NOT_WORK);
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4254 exit (1);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4255 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4256 }
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4257
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4258 ++longjmps_done;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4259 x = 2;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4260 if (longjmps_done == 1)
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4261 longjmp (jbuf, 1);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4262 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4263
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4264 #endif /* not GC_SAVE_REGISTERS_ON_STACK && not GC_SETJMP_WORKS */
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4265
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4266
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4267 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4268
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4269 /* Abort if anything GCPRO'd doesn't survive the GC. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4270
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4271 static void
112125
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4272 check_gcpros (void)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4273 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4274 struct gcpro *p;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4275 int i;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4276
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4277 for (p = gcprolist; p; p = p->next)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4278 for (i = 0; i < p->nvars; ++i)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4279 if (!survives_gc_p (p->var[i]))
50626
a5a77c7717cb (Fmake_byte_code): Improve the `usage' string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50468
diff changeset
4280 /* FIXME: It's not necessarily a bug. It might just be that the
a5a77c7717cb (Fmake_byte_code): Improve the `usage' string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50468
diff changeset
4281 GCPRO is unnecessary or should release the object sooner. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4282 abort ();
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4283 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4284
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4285 #elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4286
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4287 static void
112125
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4288 dump_zombies (void)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4289 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4290 int i;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4291
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4292 fprintf (stderr, "\nZombies kept alive = %d:\n", nzombies);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4293 for (i = 0; i < min (MAX_ZOMBIES, nzombies); ++i)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4294 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4295 fprintf (stderr, " %d = ", i);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4296 debug_print (zombies[i]);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4297 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4298 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4299
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4300 #endif /* GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4301
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4302
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4303 /* Mark live Lisp objects on the C stack.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4304
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4305 There are several system-dependent problems to consider when
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4306 porting this to new architectures:
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4307
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4308 Processor Registers
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4309
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4310 We have to mark Lisp objects in CPU registers that can hold local
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4311 variables or are used to pass parameters.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4312
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4313 If GC_SAVE_REGISTERS_ON_STACK is defined, it should expand to
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4314 something that either saves relevant registers on the stack, or
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4315 calls mark_maybe_object passing it each register's contents.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4316
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4317 If GC_SAVE_REGISTERS_ON_STACK is not defined, the current
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4318 implementation assumes that calling setjmp saves registers we need
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4319 to see in a jmp_buf which itself lies on the stack. This doesn't
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4320 have to be true! It must be verified for each system, possibly
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4321 by taking a look at the source code of setjmp.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4322
112125
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4323 If __builtin_unwind_init is available (defined by GCC >= 2.8) we
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4324 can use it as a machine independent method to store all registers
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4325 to the stack. In this case the macros described in the previous
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4326 two paragraphs are not used.
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4327
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4328 Stack Layout
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4329
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4330 Architectures differ in the way their processor stack is organized.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4331 For example, the stack might look like this
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4332
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4333 +----------------+
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4334 | Lisp_Object | size = 4
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4335 +----------------+
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4336 | something else | size = 2
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4337 +----------------+
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4338 | Lisp_Object | size = 4
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4339 +----------------+
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4340 | ... |
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4341
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4342 In such a case, not every Lisp_Object will be aligned equally. To
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4343 find all Lisp_Object on the stack it won't be sufficient to walk
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4344 the stack in steps of 4 bytes. Instead, two passes will be
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4345 necessary, one starting at the start of the stack, and a second
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4346 pass starting at the start of the stack + 2. Likewise, if the
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4347 minimal alignment of Lisp_Objects on the stack is 1, four passes
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4348 would be necessary, each one starting with one byte more offset
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4349 from the stack start.
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4350
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4351 The current code assumes by default that Lisp_Objects are aligned
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4352 equally on the stack. */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4353
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4354 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4355 mark_stack (void)
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4356 {
43160
630c8b6deafd (mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents: 43005
diff changeset
4357 int i;
73964
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4358 /* jmp_buf may not be aligned enough on darwin-ppc64 */
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4359 union aligned_jmpbuf {
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4360 Lisp_Object o;
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4361 jmp_buf j;
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4362 } j;
31829
43566b0aec59 Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents: 31576
diff changeset
4363 volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4364 void *end;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4365
112125
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4366 #ifdef HAVE___BUILTIN_UNWIND_INIT
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4367 /* Force callee-saved registers and register windows onto the stack.
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4368 This is the preferred method if available, obviating the need for
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4369 machine dependent methods. */
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4370 __builtin_unwind_init ();
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4371 end = &end;
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4372 #else /* not HAVE___BUILTIN_UNWIND_INIT */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4373 /* This trick flushes the register windows so that all the state of
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4374 the process is contained in the stack. */
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
4375 /* Fixme: Code in the Boehm GC suggests flushing (with `flushrs') is
49414
668c96afa702 (mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents: 49357
diff changeset
4376 needed on ia64 too. See mach_dep.c, where it also says inline
668c96afa702 (mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents: 49357
diff changeset
4377 assembler doesn't work with relevant proprietary compilers. */
96545
4cb0e945175d Use __sparc__ rather than sparc. (Bug#507.)
Glenn Morris <rgm@gnu.org>
parents: 95481
diff changeset
4378 #ifdef __sparc__
101689
697627d7beda (mark_stack): Properly conditionalize previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101387
diff changeset
4379 #if defined (__sparc64__) && defined (__FreeBSD__)
697627d7beda (mark_stack): Properly conditionalize previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101387
diff changeset
4380 /* FreeBSD does not have a ta 3 handler. */
101387
b19b16732fb0 (mark_stack): Use "flushw" instead of "ta 3" assembly call for
Chong Yidong <cyd@stupidchicken.com>
parents: 100951
diff changeset
4381 asm ("flushw");
b19b16732fb0 (mark_stack): Use "flushw" instead of "ta 3" assembly call for
Chong Yidong <cyd@stupidchicken.com>
parents: 100951
diff changeset
4382 #else
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4383 asm ("ta 3");
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4384 #endif
101387
b19b16732fb0 (mark_stack): Use "flushw" instead of "ta 3" assembly call for
Chong Yidong <cyd@stupidchicken.com>
parents: 100951
diff changeset
4385 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4386
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4387 /* Save registers that we need to see on the stack. We need to see
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4388 registers used to hold register variables and registers used to
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4389 pass parameters. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4390 #ifdef GC_SAVE_REGISTERS_ON_STACK
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4391 GC_SAVE_REGISTERS_ON_STACK (end);
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4392 #else /* not GC_SAVE_REGISTERS_ON_STACK */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4393
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4394 #ifndef GC_SETJMP_WORKS /* If it hasn't been checked yet that
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4395 setjmp will definitely work, test it
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4396 and print a message with the result
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4397 of the test. */
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4398 if (!setjmp_tested_p)
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4399 {
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4400 setjmp_tested_p = 1;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4401 test_setjmp ();
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4402 }
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4403 #endif /* GC_SETJMP_WORKS */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
4404
73964
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4405 setjmp (j.j);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4406 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4407 #endif /* not GC_SAVE_REGISTERS_ON_STACK */
112125
4dbda0e7c8bf Use __builtin_unwind_init if available
Andreas Schwab <schwab@linux-m68k.org>
parents: 111997
diff changeset
4408 #endif /* not HAVE___BUILTIN_UNWIND_INIT */
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4409
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4410 /* This assumes that the stack is a contiguous region in memory. If
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4411 that's not the case, something has to be done here to iterate
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4412 over the stack segments. */
43160
630c8b6deafd (mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents: 43005
diff changeset
4413 #ifndef GC_LISP_OBJECT_ALIGNMENT
49414
668c96afa702 (mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents: 49357
diff changeset
4414 #ifdef __GNUC__
668c96afa702 (mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents: 49357
diff changeset
4415 #define GC_LISP_OBJECT_ALIGNMENT __alignof__ (Lisp_Object)
668c96afa702 (mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents: 49357
diff changeset
4416 #else
43160
630c8b6deafd (mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents: 43005
diff changeset
4417 #define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object)
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
4418 #endif
49414
668c96afa702 (mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents: 49357
diff changeset
4419 #endif
43161
8a549ab185a2 Fix thinko in last change.
Andreas Schwab <schwab@suse.de>
parents: 43160
diff changeset
4420 for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT)
73964
b684c6771753 (mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72537
diff changeset
4421 mark_memory (stack_base, end, i);
58593
ff0c144203a1 (mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents: 57137
diff changeset
4422 /* Allow for marking a secondary stack, like the register stack on the
ff0c144203a1 (mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents: 57137
diff changeset
4423 ia64. */
ff0c144203a1 (mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents: 57137
diff changeset
4424 #ifdef GC_MARK_SECONDARY_STACK
ff0c144203a1 (mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents: 57137
diff changeset
4425 GC_MARK_SECONDARY_STACK ();
ff0c144203a1 (mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents: 57137
diff changeset
4426 #endif
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4427
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4428 #if GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4429 check_gcpros ();
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4430 #endif
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4431 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4432
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4433 #endif /* GC_MARK_STACK != 0 */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4434
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4435
72156
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4436 /* Determine whether it is safe to access memory at address P. */
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
4437 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4438 valid_pointer_p (void *p)
72156
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4439 {
72288
94e8cc9b752d Include w32.h.
Eli Zaretskii <eliz@gnu.org>
parents: 72177
diff changeset
4440 #ifdef WINDOWSNT
94e8cc9b752d Include w32.h.
Eli Zaretskii <eliz@gnu.org>
parents: 72177
diff changeset
4441 return w32_valid_pointer_p (p, 16);
94e8cc9b752d Include w32.h.
Eli Zaretskii <eliz@gnu.org>
parents: 72177
diff changeset
4442 #else
72156
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4443 int fd;
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4444
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4445 /* Obviously, we cannot just access it (we would SEGV trying), so we
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4446 trick the o/s to tell us whether p is a valid pointer.
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4447 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4448 not validate p in that case. */
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4449
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4450 if ((fd = emacs_open ("__Valid__Lisp__Object__", O_CREAT | O_WRONLY | O_TRUNC, 0666)) >= 0)
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4451 {
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4452 int valid = (emacs_write (fd, (char *)p, 16) == 16);
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4453 emacs_close (fd);
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4454 unlink ("__Valid__Lisp__Object__");
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4455 return valid;
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4456 }
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4457
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4458 return -1;
72288
94e8cc9b752d Include w32.h.
Eli Zaretskii <eliz@gnu.org>
parents: 72177
diff changeset
4459 #endif
72156
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4460 }
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4461
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4462 /* Return 1 if OBJ is a valid lisp object.
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4463 Return 0 if OBJ is NOT a valid lisp object.
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4464 Return -1 if we cannot validate OBJ.
67494
28fd92314a04 Comment and whitespace changes.
Richard M. Stallman <rms@gnu.org>
parents: 67216
diff changeset
4465 This function can be quite slow,
28fd92314a04 Comment and whitespace changes.
Richard M. Stallman <rms@gnu.org>
parents: 67216
diff changeset
4466 so it should only be used in code for manual debugging. */
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4467
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4468 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4469 valid_lisp_object_p (Lisp_Object obj)
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4470 {
67216
fc58516afccd Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents: 66889
diff changeset
4471 void *p;
72156
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4472 #if GC_MARK_STACK
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4473 struct mem_node *m;
67216
fc58516afccd Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents: 66889
diff changeset
4474 #endif
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4475
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4476 if (INTEGERP (obj))
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4477 return 1;
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4478
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4479 p = (void *) XPNTR (obj);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4480 if (PURE_POINTER_P (p))
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4481 return 1;
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4482
67216
fc58516afccd Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents: 66889
diff changeset
4483 #if !GC_MARK_STACK
72156
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4484 return valid_pointer_p (p);
67216
fc58516afccd Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents: 66889
diff changeset
4485 #else
fc58516afccd Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents: 66889
diff changeset
4486
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4487 m = mem_find (p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4488
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4489 if (m == MEM_NIL)
72156
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4490 {
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4491 int valid = valid_pointer_p (p);
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4492 if (valid <= 0)
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4493 return valid;
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4494
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4495 if (SUBRP (obj))
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4496 return 1;
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4497
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4498 return 0;
b4ec5a95c687 (valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents: 72114
diff changeset
4499 }
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4500
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4501 switch (m->type)
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4502 {
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4503 case MEM_TYPE_NON_LISP:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4504 return 0;
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4505
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4506 case MEM_TYPE_BUFFER:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4507 return live_buffer_p (m, p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4508
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4509 case MEM_TYPE_CONS:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4510 return live_cons_p (m, p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4511
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4512 case MEM_TYPE_STRING:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4513 return live_string_p (m, p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4514
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4515 case MEM_TYPE_MISC:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4516 return live_misc_p (m, p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4517
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4518 case MEM_TYPE_SYMBOL:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4519 return live_symbol_p (m, p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4520
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4521 case MEM_TYPE_FLOAT:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4522 return live_float_p (m, p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4523
84978
33b7fe948502 (enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84977
diff changeset
4524 case MEM_TYPE_VECTORLIKE:
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4525 return live_vector_p (m, p);
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4526
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4527 default:
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4528 break;
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4529 }
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4530
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4531 return 0;
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4532 #endif
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4533 }
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4534
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4535
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
4536
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4537
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4538 /***********************************************************************
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4539 Pure Storage Management
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4540 ***********************************************************************/
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4541
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4542 /* Allocate room for SIZE bytes from pure Lisp storage and return a
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4543 pointer to it. TYPE is the Lisp type for which the memory is
72027
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4544 allocated. TYPE < 0 means it's not used for a Lisp object. */
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4545
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4546 static POINTER_TYPE *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4547 pure_alloc (size_t size, int type)
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4548 {
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4549 POINTER_TYPE *result;
53650
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
4550 #ifdef USE_LSB_TAG
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
4551 size_t alignment = (1 << GCTYPEBITS);
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
4552 #else
49159
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4553 size_t alignment = sizeof (EMACS_INT);
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4554
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4555 /* Give Lisp_Floats an extra alignment. */
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4556 if (type == Lisp_Float)
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4557 {
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4558 #if defined __GNUC__ && __GNUC__ >= 2
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4559 alignment = __alignof (struct Lisp_Float);
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4560 #else
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4561 alignment = sizeof (struct Lisp_Float);
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4562 #endif
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4563 }
53650
5558449888ec (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53582
diff changeset
4564 #endif
49159
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4565
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4566 again:
72027
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4567 if (type >= 0)
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4568 {
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4569 /* Allocate space for a Lisp object from the beginning of the free
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4570 space with taking account of alignment. */
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4571 result = ALIGN (purebeg + pure_bytes_used_lisp, alignment);
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4572 pure_bytes_used_lisp = ((char *)result - (char *)purebeg) + size;
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4573 }
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4574 else
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4575 {
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4576 /* Allocate space for a non-Lisp object from the end of the free
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4577 space. */
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4578 pure_bytes_used_non_lisp += size;
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4579 result = purebeg + pure_size - pure_bytes_used_non_lisp;
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4580 }
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4581 pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp;
49159
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4582
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4583 if (pure_bytes_used <= pure_size)
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4584 return result;
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4585
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4586 /* Don't allocate a large amount here,
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4587 because it might get mmap'd and then its address
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4588 might not be usable. */
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4589 purebeg = (char *) xmalloc (10000);
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4590 pure_size = 10000;
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4591 pure_bytes_used_before_overflow += pure_bytes_used - size;
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4592 pure_bytes_used = 0;
72027
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
4593 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
49159
bc82a79251b5 (pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents: 49158
diff changeset
4594 goto again;
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4595 }
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4596
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4597
44149
a3e6cfa20afd (check_pure_size): Update the comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 44100
diff changeset
4598 /* Print a warning if PURESIZE is too small. */
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4599
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4600 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4601 check_pure_size (void)
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4602 {
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4603 if (pure_bytes_used_before_overflow)
68398
cec05baae14f (check_pure_size): Make overflow message an "error message".
Richard M. Stallman <rms@gnu.org>
parents: 68369
diff changeset
4604 message ("emacs:0:Pure Lisp storage overflow (approx. %d bytes needed)",
44100
57e965380c39 (check_pure_size): Only output a warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43751
diff changeset
4605 (int) (pure_bytes_used + pure_bytes_used_before_overflow));
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4606 }
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4607
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4608
72114
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4609 /* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4610 the non-Lisp data pool of the pure storage, and return its start
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4611 address. Return NULL if not found. */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4612
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4613 static char *
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
4614 find_string_data_in_pure (const char *data, EMACS_INT nbytes)
72114
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4615 {
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
4616 int i;
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
4617 EMACS_INT skip, bm_skip[256], last_char_skip, infinity, start, start_max;
106950
ddd257e3f816 Make string pointer args point to const as in other string allocation functions.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 106815
diff changeset
4618 const unsigned char *p;
72114
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4619 char *non_lisp_beg;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4620
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4621 if (pure_bytes_used_non_lisp < nbytes + 1)
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4622 return NULL;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4623
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4624 /* Set up the Boyer-Moore table. */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4625 skip = nbytes + 1;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4626 for (i = 0; i < 256; i++)
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4627 bm_skip[i] = skip;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4628
106950
ddd257e3f816 Make string pointer args point to const as in other string allocation functions.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 106815
diff changeset
4629 p = (const unsigned char *) data;
72114
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4630 while (--skip > 0)
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4631 bm_skip[*p++] = skip;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4632
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4633 last_char_skip = bm_skip['\0'];
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4634
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4635 non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4636 start_max = pure_bytes_used_non_lisp - (nbytes + 1);
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4637
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4638 /* See the comments in the function `boyer_moore' (search.c) for the
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4639 use of `infinity'. */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4640 infinity = pure_bytes_used_non_lisp + 1;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4641 bm_skip['\0'] = infinity;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4642
106950
ddd257e3f816 Make string pointer args point to const as in other string allocation functions.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 106815
diff changeset
4643 p = (const unsigned char *) non_lisp_beg + nbytes;
72114
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4644 start = 0;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4645 do
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4646 {
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4647 /* Check the last character (== '\0'). */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4648 do
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4649 {
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4650 start += bm_skip[*(p + start)];
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4651 }
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4652 while (start <= start_max);
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4653
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4654 if (start < infinity)
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4655 /* Couldn't find the last character. */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4656 return NULL;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4657
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4658 /* No less than `infinity' means we could find the last
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4659 character at `p[start - infinity]'. */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4660 start -= infinity;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4661
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4662 /* Check the remaining characters. */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4663 if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4664 /* Found. */
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4665 return non_lisp_beg + start;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4666
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4667 start += last_char_skip;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4668 }
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4669 while (start <= start_max);
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4670
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4671 return NULL;
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4672 }
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4673
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4674
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4675 /* Return a string allocated in pure space. DATA is a buffer holding
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4676 NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4677 non-zero means make the result string multibyte.
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4678
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4679 Must get an error if pure storage is full, since if it cannot hold
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4680 a large string it may be able to hold conses that point to that
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4681 string; then the string is not protected from gc. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4682
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4683 Lisp_Object
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
4684 make_pure_string (const char *data,
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
4685 EMACS_INT nchars, EMACS_INT nbytes, int multibyte)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4686 {
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4687 Lisp_Object string;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4688 struct Lisp_String *s;
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4689
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4690 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
72114
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4691 s->data = find_string_data_in_pure (data, nbytes);
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4692 if (s->data == NULL)
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4693 {
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4694 s->data = (unsigned char *) pure_alloc (nbytes + 1, -1);
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
4695 memcpy (s->data, data, nbytes);
72114
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4696 s->data[nbytes] = '\0';
fe7f8d2385f8 (find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 72027
diff changeset
4697 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4698 s->size = nchars;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4699 s->size_byte = multibyte ? nbytes : -1;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4700 s->intervals = NULL_INTERVAL;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4701 XSETSTRING (string, s);
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4702 return string;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4703 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4704
105871
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4705 /* Return a string a string allocated in pure space. Do not allocate
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4706 the string data, just point to DATA. */
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4707
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4708 Lisp_Object
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4709 make_pure_c_string (const char *data)
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4710 {
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4711 Lisp_Object string;
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4712 struct Lisp_String *s;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
4713 EMACS_INT nchars = strlen (data);
105871
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4714
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4715 s = (struct Lisp_String *) pure_alloc (sizeof *s, Lisp_String);
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4716 s->size = nchars;
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4717 s->size_byte = -1;
105881
7d244791c020 (make_pure_c_string): Fix last change to avoid compiler warning.
Eli Zaretskii <eliz@gnu.org>
parents: 105877
diff changeset
4718 s->data = (unsigned char *) data;
105871
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4719 s->intervals = NULL_INTERVAL;
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4720 XSETSTRING (string, s);
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4721 return string;
1fa408e42f53 * alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
4722 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4723
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4724 /* Return a cons allocated from pure space. Give it pure copies
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4725 of CAR as car and CDR as cdr. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4726
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4727 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4728 pure_cons (Lisp_Object car, Lisp_Object cdr)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4729 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4730 register Lisp_Object new;
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4731 struct Lisp_Cons *p;
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4732
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4733 p = (struct Lisp_Cons *) pure_alloc (sizeof *p, Lisp_Cons);
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4734 XSETCONS (new, p);
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39914
diff changeset
4735 XSETCAR (new, Fpurecopy (car));
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39914
diff changeset
4736 XSETCDR (new, Fpurecopy (cdr));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4737 return new;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4738 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4739
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4740
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4741 /* Value is a float object with value NUM allocated from pure space. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4742
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
4743 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4744 make_pure_float (double num)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4745 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4746 register Lisp_Object new;
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4747 struct Lisp_Float *p;
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4748
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4749 p = (struct Lisp_Float *) pure_alloc (sizeof *p, Lisp_Float);
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4750 XSETFLOAT (new, p);
104313
73f76307d49b * lisp.h (XFLOAT_DATA): Produce an rvalue by adding 0 to the value.
Ken Raeburn <raeburn@raeburn.org>
parents: 101689
diff changeset
4751 XFLOAT_INIT (new, num);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4752 return new;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4753 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4754
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4755
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4756 /* Return a vector with room for LEN Lisp_Objects allocated from
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4757 pure space. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4758
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4759 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4760 make_pure_vector (EMACS_INT len)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4761 {
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4762 Lisp_Object new;
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4763 struct Lisp_Vector *p;
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4764 size_t size = sizeof *p + (len - 1) * sizeof (Lisp_Object);
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4765
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4766 p = (struct Lisp_Vector *) pure_alloc (size, Lisp_Vectorlike);
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4767 XSETVECTOR (new, p);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4768 XVECTOR (new)->size = len;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4769 return new;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4770 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4771
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4772
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4773 DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
68741
2892a36e596e (Fmake_bool_vector, Fpurecopy): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 68430
diff changeset
4774 doc: /* Make a copy of object OBJ in pure storage.
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
4775 Recursively copies contents of vectors and cons cells.
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
4776 Does not copy symbols. Copies strings without text properties. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
4777 (register Lisp_Object obj)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4778 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 434
diff changeset
4779 if (NILP (Vpurify_flag))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4780 return obj;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4781
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
4782 if (PURE_POINTER_P (XPNTR (obj)))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4783 return obj;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4784
107895
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4785 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4786 {
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4787 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4788 if (!NILP (tmp))
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4789 return tmp;
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4790 }
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4791
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4792 if (CONSP (obj))
107895
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4793 obj = pure_cons (XCAR (obj), XCDR (obj));
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4794 else if (FLOATP (obj))
107895
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4795 obj = make_pure_float (XFLOAT_DATA (obj));
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4796 else if (STRINGP (obj))
107895
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4797 obj = make_pure_string (SDATA (obj), SCHARS (obj),
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4798 SBYTES (obj),
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4799 STRING_MULTIBYTE (obj));
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4800 else if (COMPILEDP (obj) || VECTORP (obj))
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4801 {
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4802 register struct Lisp_Vector *vec;
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
4803 register EMACS_INT i;
53705
db8cbe59ee5c (Fpurecopy): Declare size as EMACS_INT to not lose bits.
Andreas Schwab <schwab@suse.de>
parents: 53650
diff changeset
4804 EMACS_INT size;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4805
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4806 size = XVECTOR (obj)->size;
10427
5faba1b094d5 (Fpurecopy): Mask size field when copying pseudovector.
Karl Heuer <kwzh@gnu.org>
parents: 10414
diff changeset
4807 if (size & PSEUDOVECTOR_FLAG)
5faba1b094d5 (Fpurecopy): Mask size field when copying pseudovector.
Karl Heuer <kwzh@gnu.org>
parents: 10414
diff changeset
4808 size &= PSEUDOVECTOR_SIZE_MASK;
53705
db8cbe59ee5c (Fpurecopy): Declare size as EMACS_INT to not lose bits.
Andreas Schwab <schwab@suse.de>
parents: 53650
diff changeset
4809 vec = XVECTOR (make_pure_vector (size));
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4810 for (i = 0; i < size; i++)
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4811 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]);
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4812 if (COMPILEDP (obj))
85329
ad9922c079e4 (Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85328
diff changeset
4813 {
ad9922c079e4 (Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85328
diff changeset
4814 XSETPVECTYPE (vec, PVEC_COMPILED);
ad9922c079e4 (Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85328
diff changeset
4815 XSETCOMPILED (obj, vec);
ad9922c079e4 (Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85328
diff changeset
4816 }
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4817 else
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4818 XSETVECTOR (obj, vec);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4819 }
10004
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4820 else if (MARKERP (obj))
2c57cb7eba5f (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9968
diff changeset
4821 error ("Attempt to copy a marker to pure storage");
107895
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4822 else
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4823 /* Not purified, don't hash-cons. */
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4824 return obj;
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4825
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4826 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
4827 Fputhash (obj, obj, Vpurify_flag);
31829
43566b0aec59 Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents: 31576
diff changeset
4828
43566b0aec59 Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents: 31576
diff changeset
4829 return obj;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4830 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4831
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4832
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4833
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4834 /***********************************************************************
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4835 Protection from GC
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4836 ***********************************************************************/
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4837
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4838 /* Put an entry in staticvec, pointing at the variable with address
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
4839 VARADDRESS. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4840
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4841 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4842 staticpro (Lisp_Object *varaddress)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4843 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4844 staticvec[staticidx++] = varaddress;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4845 if (staticidx >= NSTATICS)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4846 abort ();
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4847 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4848
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4849
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4850 /***********************************************************************
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4851 Protection from GC
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4852 ***********************************************************************/
1908
d649f2179d67 * alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents: 1893
diff changeset
4853
11374
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
4854 /* Temporarily prevent garbage collection. */
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
4855
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
4856 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
4857 inhibit_garbage_collection (void)
11374
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
4858 {
46293
1fb8f75062c6 Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents: 46285
diff changeset
4859 int count = SPECPDL_INDEX ();
41867
a555c6419185 (inhibit_garbage_collection): Don't exceed value an int can hold.
Andreas Schwab <schwab@suse.de>
parents: 41831
diff changeset
4860 int nbits = min (VALBITS, BITS_PER_INT);
a555c6419185 (inhibit_garbage_collection): Don't exceed value an int can hold.
Andreas Schwab <schwab@suse.de>
parents: 41831
diff changeset
4861
a555c6419185 (inhibit_garbage_collection): Don't exceed value an int can hold.
Andreas Schwab <schwab@suse.de>
parents: 41831
diff changeset
4862 specbind (Qgc_cons_threshold, make_number (((EMACS_INT) 1 << (nbits - 1)) - 1));
11374
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
4863 return count;
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
4864 }
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
4865
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4866
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4867 DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
4868 doc: /* Reclaim storage for Lisp objects no longer needed.
51788
43d663a05e2d (Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 51779
diff changeset
4869 Garbage collection happens automatically if you cons more than
43d663a05e2d (Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 51779
diff changeset
4870 `gc-cons-threshold' bytes of Lisp data since previous garbage collection.
43d663a05e2d (Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 51779
diff changeset
4871 `garbage-collect' normally returns a list with info on amount of space in use:
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
4872 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
4873 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
4874 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS)
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
4875 (USED-STRINGS . FREE-STRINGS))
51788
43d663a05e2d (Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 51779
diff changeset
4876 However, if there was overflow in pure space, `garbage-collect'
43d663a05e2d (Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 51779
diff changeset
4877 returns nil, because real GC can't be done. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
4878 (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4879 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4880 register struct specbinding *bind;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4881 struct catchtag *catch;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4882 struct handler *handler;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4883 char stack_top_variable;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4884 register int i;
25343
fe92158a9e83 (Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents: 25133
diff changeset
4885 int message_p;
34270
773e6aa2ec38 (Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents: 33800
diff changeset
4886 Lisp_Object total[8];
46285
3f111801efb4 Rename BINDING_STACK_SIZE to SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents: 45392
diff changeset
4887 int count = SPECPDL_INDEX ();
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
4888 EMACS_TIME t1, t2, t3;
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
4889
50745
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
4890 if (abort_on_gc)
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
4891 abort ();
fedd03de0f46 (abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 50626
diff changeset
4892
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4893 /* Can't GC if pure storage overflowed because we can't determine
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4894 if something is a pure object or not. */
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4895 if (pure_bytes_used_before_overflow)
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4896 return Qnil;
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
4897
61252
d24c6e8f9add (Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents: 61225
diff changeset
4898 CHECK_CONS_LIST ();
d24c6e8f9add (Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents: 61225
diff changeset
4899
59047
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4900 /* Don't keep undo information around forever.
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4901 Do this early on, so it is no problem if the user quits. */
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4902 {
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4903 register struct buffer *nextb = all_buffers;
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4904
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4905 while (nextb)
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4906 {
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4907 /* If a buffer's undo list is Qt, that means that undo is
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4908 turned off in that buffer. Calling truncate_undo_list on
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4909 Qt tends to return NULL, which effectively turns undo back on.
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4910 So don't call truncate_undo_list if undo_list is Qt. */
59314
9c620c1aa7fa (Fgarbage_collect): Don't truncate_undo_list on dead buffers.
Richard M. Stallman <rms@gnu.org>
parents: 59083
diff changeset
4911 if (! NILP (nextb->name) && ! EQ (nextb->undo_list, Qt))
59047
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4912 truncate_undo_list (nextb);
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4913
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4914 /* Shrink buffer gaps, but skip indirect and dead buffers. */
90774
81fa456eb1dc (Fgarbage_collect): If nextb->text->inhibit_shrinking is
Kenichi Handa <handa@m17n.org>
parents: 90743
diff changeset
4915 if (nextb->base_buffer == 0 && !NILP (nextb->name)
81fa456eb1dc (Fgarbage_collect): If nextb->text->inhibit_shrinking is
Kenichi Handa <handa@m17n.org>
parents: 90743
diff changeset
4916 && ! nextb->text->inhibit_shrinking)
59047
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4917 {
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4918 /* If a buffer's gap size is more than 10% of the buffer
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4919 size, or larger than 2000 bytes, then shrink it
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4920 accordingly. Keep a minimum size of 20 bytes. */
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4921 int size = min (2000, max (20, (nextb->text->z_byte / 10)));
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4922
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4923 if (nextb->text->gap_size > size)
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4924 {
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4925 struct buffer *save_current = current_buffer;
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4926 current_buffer = nextb;
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4927 make_gap (-(nextb->text->gap_size - size));
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4928 current_buffer = save_current;
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4929 }
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4930 }
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4931
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4932 nextb = nextb->next;
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4933 }
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4934 }
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4935
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4936 EMACS_GET_TIME (t1);
0d2678a6add0 (Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents: 58986
diff changeset
4937
11892
6be0b7a0ac44 (Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents: 11727
diff changeset
4938 /* In case user calls debug_print during GC,
6be0b7a0ac44 (Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents: 11727
diff changeset
4939 don't let that cause a recursive GC. */
6be0b7a0ac44 (Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents: 11727
diff changeset
4940 consing_since_gc = 0;
6be0b7a0ac44 (Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents: 11727
diff changeset
4941
25343
fe92158a9e83 (Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents: 25133
diff changeset
4942 /* Save what's currently displayed in the echo area. */
fe92158a9e83 (Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents: 25133
diff changeset
4943 message_p = push_message ();
47391
1afd007f814f (Fgarbage_collect): Use pop_message_unwind.
Richard M. Stallman <rms@gnu.org>
parents: 47185
diff changeset
4944 record_unwind_protect (pop_message_unwind, Qnil);
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
4945
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4946 /* Save a copy of the contents of the stack, for debugging. */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4947 #if MAX_SAVE_STACK > 0
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 434
diff changeset
4948 if (NILP (Vpurify_flag))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4949 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4950 i = &stack_top_variable - stack_bottom;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4951 if (i < 0) i = -i;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4952 if (i < MAX_SAVE_STACK)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4953 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4954 if (stack_copy == 0)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
4955 stack_copy = (char *) xmalloc (stack_copy_size = i);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4956 else if (stack_copy_size < i)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2370
diff changeset
4957 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4958 if (stack_copy)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4959 {
8817
48ff00bebef6 (pure, pure_size): Use EMACS_INT.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
4960 if ((EMACS_INT) (&stack_top_variable - stack_bottom) > 0)
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
4961 memcpy (stack_copy, stack_bottom, i);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4962 else
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109139
diff changeset
4963 memcpy (stack_copy, &stack_top_variable, i);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4964 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4965 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4966 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4967 #endif /* MAX_SAVE_STACK > 0 */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4968
14959
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
4969 if (garbage_collection_messages)
10395
c121703d35c7 (Fgarbage_collect): Don't log the GC message.
Karl Heuer <kwzh@gnu.org>
parents: 10389
diff changeset
4970 message1_nolog ("Garbage collecting...");
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4971
23534
6f9c70db3a58 (Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents: 22382
diff changeset
4972 BLOCK_INPUT;
6f9c70db3a58 (Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents: 22382
diff changeset
4973
22220
a0cd311af6e3 (Fgarbage_collect): Call shrink_regexp_cache.
Richard M. Stallman <rms@gnu.org>
parents: 21948
diff changeset
4974 shrink_regexp_cache ();
a0cd311af6e3 (Fgarbage_collect): Call shrink_regexp_cache.
Richard M. Stallman <rms@gnu.org>
parents: 21948
diff changeset
4975
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4976 gc_in_progress = 1;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4977
16231
5ce3b59f093b Comment changes.
Erik Naggum <erik@naggum.no>
parents: 16223
diff changeset
4978 /* clear_marks (); */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4979
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
4980 /* Mark all the special slots that serve as the roots of accessibility. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4981
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4982 for (i = 0; i < staticidx; i++)
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
4983 mark_object (*staticvec[i]);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
4984
57098
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4985 for (bind = specpdl; bind != specpdl_ptr; bind++)
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4986 {
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4987 mark_object (bind->symbol);
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4988 mark_object (bind->old_value);
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4989 }
83431
76396de7f50a Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents: 83420
diff changeset
4990 mark_terminals ();
57098
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4991 mark_kboards ();
83206
b5dee7c1d483 Merged in changes from CVS trunk.
Karoly Lorentey <lorentey@elte.hu>
parents: 83182 57098
diff changeset
4992 mark_ttys ();
57098
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4993
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4994 #ifdef USE_GTK
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4995 {
109139
c25c24812fb1 Convert declarations or definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109126
diff changeset
4996 extern void xg_mark_data (void);
57098
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4997 xg_mark_data ();
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4998 }
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
4999 #endif
0487c26b96ee (Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 56539
diff changeset
5000
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5001 #if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5002 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5003 mark_stack ();
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5004 #else
51228
42d9bef83464 (Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51029
diff changeset
5005 {
42d9bef83464 (Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51029
diff changeset
5006 register struct gcpro *tail;
42d9bef83464 (Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51029
diff changeset
5007 for (tail = gcprolist; tail; tail = tail->next)
42d9bef83464 (Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51029
diff changeset
5008 for (i = 0; i < tail->nvars; i++)
52473
a3fd06a8c844 (init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52453
diff changeset
5009 mark_object (tail->var[i]);
51228
42d9bef83464 (Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51029
diff changeset
5010 }
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5011 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5012
26364
7b0217d9259c (Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents: 26164
diff changeset
5013 mark_byte_stack ();
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5014 for (catch = catchlist; catch; catch = catch->next)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5015 {
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5016 mark_object (catch->tag);
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5017 mark_object (catch->val);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5018 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5019 for (handler = handlerlist; handler; handler = handler->next)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5020 {
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5021 mark_object (handler->handler);
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5022 mark_object (handler->var);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5023 }
55798
a1bb695e9a0c (struct backtrace): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55767
diff changeset
5024 mark_backtrace ();
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5025
59400
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
5026 #ifdef HAVE_WINDOW_SYSTEM
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
5027 mark_fringe_data ();
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
5028 #endif
eeb8b96d077d (mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents: 59359
diff changeset
5029
55667
57f4a242e8f4 (Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55635
diff changeset
5030 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
57f4a242e8f4 (Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55635
diff changeset
5031 mark_stack ();
57f4a242e8f4 (Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55635
diff changeset
5032 #endif
57f4a242e8f4 (Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55635
diff changeset
5033
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5034 /* Everything is now marked, except for the things that require special
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5035 finalization, i.e. the undo_list.
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5036 Look thru every buffer's undo list
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5037 for elements that update markers that were not marked,
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5038 and delete them. */
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5039 {
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5040 register struct buffer *nextb = all_buffers;
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5041
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5042 while (nextb)
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5043 {
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5044 /* If a buffer's undo list is Qt, that means that undo is
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5045 turned off in that buffer. Calling truncate_undo_list on
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5046 Qt tends to return NULL, which effectively turns undo back on.
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5047 So don't call truncate_undo_list if undo_list is Qt. */
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5048 if (! EQ (nextb->undo_list, Qt))
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5049 {
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5050 Lisp_Object tail, prev;
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5051 tail = nextb->undo_list;
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5052 prev = Qnil;
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5053 while (CONSP (tail))
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5054 {
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5055 if (CONSP (XCAR (tail))
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5056 && MARKERP (XCAR (XCAR (tail)))
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5057 && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5058 {
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5059 if (NILP (prev))
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5060 nextb->undo_list = tail = XCDR (tail);
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5061 else
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39914
diff changeset
5062 {
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5063 tail = XCDR (tail);
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39914
diff changeset
5064 XSETCDR (prev, tail);
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39914
diff changeset
5065 }
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5066 }
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5067 else
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5068 {
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5069 prev = tail;
25645
a14111a2a100 Use XCAR, XCDR, XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25544
diff changeset
5070 tail = XCDR (tail);
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5071 }
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5072 }
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5073 }
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5074 /* Now that we have stripped the elements that need not be in the
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5075 undo_list any more, we can finally mark the list. */
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5076 mark_object (nextb->undo_list);
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5077
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5078 nextb = nextb->next;
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5079 }
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5080 }
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5081
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5082 gc_sweep ();
55767
ee3a30045908 (marker_blocks_pending_free): New var.
Kim F. Storm <storm@cua.dk>
parents: 55745
diff changeset
5083
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5084 /* Clear the mark bits that we set in certain root slots. */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5085
26378
cbf297593a79 (Fgarbage_collect): Call unmark_byte_stack.
Gerd Moellmann <gerd@gnu.org>
parents: 26372
diff changeset
5086 unmark_byte_stack ();
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
5087 VECTOR_UNMARK (&buffer_defaults);
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
5088 VECTOR_UNMARK (&buffer_local_symbols);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5089
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5090 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5091 dump_zombies ();
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5092 #endif
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5093
23534
6f9c70db3a58 (Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents: 22382
diff changeset
5094 UNBLOCK_INPUT;
6f9c70db3a58 (Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents: 22382
diff changeset
5095
61252
d24c6e8f9add (Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents: 61225
diff changeset
5096 CHECK_CONS_LIST ();
d24c6e8f9add (Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents: 61225
diff changeset
5097
16231
5ce3b59f093b Comment changes.
Erik Naggum <erik@naggum.no>
parents: 16223
diff changeset
5098 /* clear_marks (); */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5099 gc_in_progress = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5100
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5101 consing_since_gc = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5102 if (gc_cons_threshold < 10000)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5103 gc_cons_threshold = 10000;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5104
64267
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5105 if (FLOATP (Vgc_cons_percentage))
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5106 { /* Set gc_cons_combined_threshold. */
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5107 EMACS_INT total = 0;
64611
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
5108
64267
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5109 total += total_conses * sizeof (struct Lisp_Cons);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5110 total += total_symbols * sizeof (struct Lisp_Symbol);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5111 total += total_markers * sizeof (union Lisp_Misc);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5112 total += total_string_size;
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5113 total += total_vector_size * sizeof (Lisp_Object);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5114 total += total_floats * sizeof (struct Lisp_Float);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5115 total += total_intervals * sizeof (struct interval);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5116 total += total_strings * sizeof (struct Lisp_String);
66777
25bf8ea82843 (valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents: 66662
diff changeset
5117
64611
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
5118 gc_relative_threshold = total * XFLOAT_DATA (Vgc_cons_percentage);
64267
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5119 }
64611
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
5120 else
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
5121 gc_relative_threshold = 0;
64267
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
5122
14959
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
5123 if (garbage_collection_messages)
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
5124 {
25343
fe92158a9e83 (Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents: 25133
diff changeset
5125 if (message_p || minibuf_level > 0)
fe92158a9e83 (Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents: 25133
diff changeset
5126 restore_message ();
14959
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
5127 else
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
5128 message1_nolog ("Garbage collecting...done");
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
5129 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5130
35170
a9b677239421 (Fgarbage_collect): Use a record_unwind_protect to
Gerd Moellmann <gerd@gnu.org>
parents: 34325
diff changeset
5131 unbind_to (count, Qnil);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5132
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5133 total[0] = Fcons (make_number (total_conses),
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5134 make_number (total_free_conses));
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5135 total[1] = Fcons (make_number (total_symbols),
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5136 make_number (total_free_symbols));
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5137 total[2] = Fcons (make_number (total_markers),
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5138 make_number (total_free_markers));
34270
773e6aa2ec38 (Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents: 33800
diff changeset
5139 total[3] = make_number (total_string_size);
773e6aa2ec38 (Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents: 33800
diff changeset
5140 total[4] = make_number (total_vector_size);
773e6aa2ec38 (Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents: 33800
diff changeset
5141 total[5] = Fcons (make_number (total_floats),
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5142 make_number (total_free_floats));
34270
773e6aa2ec38 (Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents: 33800
diff changeset
5143 total[6] = Fcons (make_number (total_intervals),
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5144 make_number (total_free_intervals));
34270
773e6aa2ec38 (Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents: 33800
diff changeset
5145 total[7] = Fcons (make_number (total_strings),
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5146 make_number (total_free_strings));
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5147
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5148 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5149 {
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5150 /* Compute average percentage of zombies. */
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5151 double nlive = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5152
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5153 for (i = 0; i < 7; ++i)
49357
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
5154 if (CONSP (total[i]))
90e4c5eeb9a0 (Fgc_status): Print zombie list.
Dave Love <fx@gnu.org>
parents: 49322
diff changeset
5155 nlive += XFASTINT (XCAR (total[i]));
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5156
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5157 avg_live = (avg_live * ngcs + nlive) / (ngcs + 1);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5158 max_live = max (nlive, max_live);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5159 avg_zombies = (avg_zombies * ngcs + nzombies) / (ngcs + 1);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5160 max_zombies = max (nzombies, max_zombies);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5161 ++ngcs;
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5162 }
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5163 #endif
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5164
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
5165 if (!NILP (Vpost_gc_hook))
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
5166 {
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
5167 int count = inhibit_garbage_collection ();
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
5168 safe_run_hooks (Qpost_gc_hook);
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
5169 unbind_to (count, Qnil);
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
5170 }
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
5171
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
5172 /* Accumulate statistics. */
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
5173 EMACS_GET_TIME (t2);
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
5174 EMACS_SUB_TIME (t3, t2, t1);
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
5175 if (FLOATP (Vgc_elapsed))
49911
d9ade23e09df (Fgarbage_collect): Don't use XSETFLOAT.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49600
diff changeset
5176 Vgc_elapsed = make_float (XFLOAT_DATA (Vgc_elapsed) +
d9ade23e09df (Fgarbage_collect): Don't use XSETFLOAT.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49600
diff changeset
5177 EMACS_SECS (t3) +
d9ade23e09df (Fgarbage_collect): Don't use XSETFLOAT.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49600
diff changeset
5178 EMACS_USECS (t3) * 1.0e-6);
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
5179 gcs_done++;
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
5180
34270
773e6aa2ec38 (Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents: 33800
diff changeset
5181 return Flist (sizeof total / sizeof *total, total);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5182 }
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5183
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5184
25367
823e14641544 (mark_glyph_matrix): Mark strings only.
Gerd Moellmann <gerd@gnu.org>
parents: 25343
diff changeset
5185 /* Mark Lisp objects in glyph matrix MATRIX. Currently the
823e14641544 (mark_glyph_matrix): Mark strings only.
Gerd Moellmann <gerd@gnu.org>
parents: 25343
diff changeset
5186 only interesting objects referenced from glyphs are strings. */
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5187
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5188 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5189 mark_glyph_matrix (struct glyph_matrix *matrix)
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5190 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5191 struct glyph_row *row = matrix->rows;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5192 struct glyph_row *end = row + matrix->nrows;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5193
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5194 for (; row < end; ++row)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5195 if (row->enabled_p)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5196 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5197 int area;
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5198 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5199 {
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5200 struct glyph *glyph = row->glyphs[area];
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5201 struct glyph *end_glyph = glyph + row->used[area];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5202
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5203 for (; glyph < end_glyph; ++glyph)
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5204 if (STRINGP (glyph->object)
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5205 && !STRING_MARKED_P (XSTRING (glyph->object)))
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5206 mark_object (glyph->object);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5207 }
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5208 }
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5209 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5210
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5211
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5212 /* Mark Lisp faces in the face cache C. */
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5213
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5214 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5215 mark_face_cache (struct face_cache *c)
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5216 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5217 if (c)
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5218 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5219 int i, j;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5220 for (i = 0; i < c->used; ++i)
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5221 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5222 struct face *face = FACE_FROM_ID (c->f, i);
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5223
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5224 if (face)
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5225 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5226 for (j = 0; j < LFACE_VECTOR_SIZE; ++j)
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5227 mark_object (face->lface[j]);
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5228 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5229 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5230 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5231 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5232
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5233
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5234
1908
d649f2179d67 * alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents: 1893
diff changeset
5235 /* Mark reference to a Lisp_Object.
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5236 If the object referred to has not been seen yet, recursively mark
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5237 all the references contained in it. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5238
1168
2b07af77d7ec (mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents: 1114
diff changeset
5239 #define LAST_MARKED_SIZE 500
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
5240 static Lisp_Object last_marked[LAST_MARKED_SIZE];
1168
2b07af77d7ec (mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents: 1114
diff changeset
5241 int last_marked_index;
2b07af77d7ec (mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents: 1114
diff changeset
5242
46833
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5243 /* For debugging--call abort when we cdr down this many
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5244 links of a list, in mark_object. In debugging,
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5245 the call to abort will hit a breakpoint.
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5246 Normally this is zero and the check never goes off. */
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
5247 static int mark_object_loop_halt;
46833
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5248
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5249 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5250 mark_vectorlike (struct Lisp_Vector *ptr)
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5251 {
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
5252 register EMACS_UINT size = ptr->size;
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
5253 register EMACS_UINT i;
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5254
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5255 eassert (!VECTOR_MARKED_P (ptr));
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5256 VECTOR_MARK (ptr); /* Else mark it */
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5257 if (size & PSEUDOVECTOR_FLAG)
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5258 size &= PSEUDOVECTOR_SIZE_MASK;
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
5259
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5260 /* Note that this size is not the memory-footprint size, but only
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5261 the number of Lisp_Object fields that we should trace.
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5262 The distinction is used e.g. by Lisp_Process which places extra
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5263 non-Lisp_Object fields at the end of the structure. */
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5264 for (i = 0; i < size; i++) /* and then mark its elements */
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5265 mark_object (ptr->contents[i]);
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5266 }
46833
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5267
104582
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5268 /* Like mark_vectorlike but optimized for char-tables (and
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5269 sub-char-tables) assuming that the contents are mostly integers or
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5270 symbols. */
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5271
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5272 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5273 mark_char_table (struct Lisp_Vector *ptr)
104582
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5274 {
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
5275 register EMACS_UINT size = ptr->size & PSEUDOVECTOR_SIZE_MASK;
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
5276 register EMACS_UINT i;
104582
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5277
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5278 eassert (!VECTOR_MARKED_P (ptr));
104582
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5279 VECTOR_MARK (ptr);
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5280 for (i = 0; i < size; i++)
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5281 {
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5282 Lisp_Object val = ptr->contents[i];
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5283
111997
a5a188ddc758 Minor clean up to silence some gcc warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 111779
diff changeset
5284 if (INTEGERP (val) || (SYMBOLP (val) && XSYMBOL (val)->gcmarkbit))
104582
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5285 continue;
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5286 if (SUB_CHAR_TABLE_P (val))
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5287 {
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5288 if (! VECTOR_MARKED_P (XVECTOR (val)))
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5289 mark_char_table (XVECTOR (val));
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5290 }
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5291 else
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5292 mark_object (val);
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5293 }
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5294 }
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5295
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5296 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5297 mark_object (Lisp_Object arg)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5298 {
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5299 register Lisp_Object obj = arg;
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5300 #ifdef GC_CHECK_MARKED_OBJECTS
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5301 void *po;
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5302 struct mem_node *m;
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5303 #endif
46833
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5304 int cdr_count = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5305
5868
a7bd57a60cb8 (mark_object): Fetch obj from *objptr at loop, not at the gotos.
Karl Heuer <kwzh@gnu.org>
parents: 5353
diff changeset
5306 loop:
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5307
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
5308 if (PURE_POINTER_P (XPNTR (obj)))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5309 return;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5310
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5311 last_marked[last_marked_index++] = obj;
1168
2b07af77d7ec (mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents: 1114
diff changeset
5312 if (last_marked_index == LAST_MARKED_SIZE)
2b07af77d7ec (mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents: 1114
diff changeset
5313 last_marked_index = 0;
2b07af77d7ec (mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents: 1114
diff changeset
5314
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5315 /* Perform some sanity checks on the objects marked here. Abort if
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5316 we encounter an object we know is bogus. This increases GC time
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5317 by ~80%, and requires compilation with GC_MARK_STACK != 0. */
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5318 #ifdef GC_CHECK_MARKED_OBJECTS
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5319
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5320 po = (void *) XPNTR (obj);
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5321
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5322 /* Check that the object pointed to by PO is known to be a Lisp
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5323 structure allocated from the heap. */
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5324 #define CHECK_ALLOCATED() \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5325 do { \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5326 m = mem_find (po); \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5327 if (m == MEM_NIL) \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5328 abort (); \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5329 } while (0)
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5330
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5331 /* Check that the object pointed to by PO is live, using predicate
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5332 function LIVEP. */
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5333 #define CHECK_LIVE(LIVEP) \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5334 do { \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5335 if (!LIVEP (m, po)) \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5336 abort (); \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5337 } while (0)
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5338
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5339 /* Check both of the above conditions. */
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5340 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5341 do { \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5342 CHECK_ALLOCATED (); \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5343 CHECK_LIVE (LIVEP); \
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5344 } while (0) \
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5345
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5346 #else /* not GC_CHECK_MARKED_OBJECTS */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5347
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5348 #define CHECK_ALLOCATED() (void) 0
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5349 #define CHECK_LIVE(LIVEP) (void) 0
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5350 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5351
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5352 #endif /* not GC_CHECK_MARKED_OBJECTS */
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5353
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5354 switch (SWITCH_ENUM_CAST (XTYPE (obj)))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5355 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5356 case Lisp_String:
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5357 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5358 register struct Lisp_String *ptr = XSTRING (obj);
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5359 if (STRING_MARKED_P (ptr))
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5360 break;
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5361 CHECK_ALLOCATED_AND_LIVE (live_string_p);
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5362 MARK_INTERVAL_TREE (ptr->intervals);
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5363 MARK_STRING (ptr);
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
5364 #ifdef GC_CHECK_STRING_BYTES
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
5365 /* Check that the string size recorded in the string is the
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
5366 same as the one recorded in the sdata structure. */
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
5367 CHECK_STRING_BYTES (ptr);
32587
b3918817f15f (mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents: 32360
diff changeset
5368 #endif /* GC_CHECK_STRING_BYTES */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5369 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5370 break;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5371
10009
82f3daf76995 (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 10004
diff changeset
5372 case Lisp_Vectorlike:
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5373 if (VECTOR_MARKED_P (XVECTOR (obj)))
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5374 break;
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5375 #ifdef GC_CHECK_MARKED_OBJECTS
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5376 m = mem_find (po);
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5377 if (m == MEM_NIL && !SUBRP (obj)
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5378 && po != &buffer_defaults
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5379 && po != &buffer_local_symbols)
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5380 abort ();
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5381 #endif /* GC_CHECK_MARKED_OBJECTS */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5382
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5383 if (BUFFERP (obj))
10340
ef58c7a5a4d6 (mark_object, mark_buffer): Don't mark buffer twice.
Karl Heuer <kwzh@gnu.org>
parents: 10320
diff changeset
5384 {
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5385 #ifdef GC_CHECK_MARKED_OBJECTS
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5386 if (po != &buffer_defaults && po != &buffer_local_symbols)
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5387 {
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5388 struct buffer *b;
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5389 for (b = all_buffers; b && b != po; b = b->next)
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5390 ;
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5391 if (b == NULL)
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5392 abort ();
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5393 }
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5394 #endif /* GC_CHECK_MARKED_OBJECTS */
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5395 mark_buffer (obj);
10340
ef58c7a5a4d6 (mark_object, mark_buffer): Don't mark buffer twice.
Karl Heuer <kwzh@gnu.org>
parents: 10320
diff changeset
5396 }
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5397 else if (SUBRP (obj))
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5398 break;
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5399 else if (COMPILEDP (obj))
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5400 /* We could treat this just like a vector, but it is better to
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5401 save the COMPILED_CONSTANTS element for last and avoid
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
5402 recursion there. */
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5403 {
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5404 register struct Lisp_Vector *ptr = XVECTOR (obj);
110503
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
5405 register EMACS_UINT size = ptr->size;
fda36a325177 Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110480
diff changeset
5406 register EMACS_UINT i;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5407
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5408 CHECK_LIVE (live_vector_p);
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
5409 VECTOR_MARK (ptr); /* Else mark it */
10009
82f3daf76995 (Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 10004
diff changeset
5410 size &= PSEUDOVECTOR_SIZE_MASK;
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5411 for (i = 0; i < size; i++) /* and then mark its elements */
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5412 {
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5413 if (i != COMPILED_CONSTANTS)
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5414 mark_object (ptr->contents[i]);
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5415 }
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5416 obj = ptr->contents[COMPILED_CONSTANTS];
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5417 goto loop;
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5418 }
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5419 else if (FRAMEP (obj))
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5420 {
32360
d8b668a486d7 (mark_object): Remove all workarounds installed on
Andreas Schwab <schwab@suse.de>
parents: 32099
diff changeset
5421 register struct frame *ptr = XFRAME (obj);
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5422 mark_vectorlike (XVECTOR (obj));
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5423 mark_face_cache (ptr->face_cache);
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5424 }
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5425 else if (WINDOWP (obj))
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5426 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5427 register struct Lisp_Vector *ptr = XVECTOR (obj);
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5428 struct window *w = XWINDOW (obj);
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5429 mark_vectorlike (ptr);
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5430 /* Mark glyphs for leaf windows. Marking window matrices is
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5431 sufficient because frame matrices use the same glyph
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5432 memory. */
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5433 if (NILP (w->hchild)
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5434 && NILP (w->vchild)
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5435 && w->current_matrix)
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5436 {
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5437 mark_glyph_matrix (w->current_matrix);
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5438 mark_glyph_matrix (w->desired_matrix);
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5439 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5440 }
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5441 else if (HASH_TABLE_P (obj))
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5442 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5443 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5444 mark_vectorlike ((struct Lisp_Vector *)h);
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5445 /* If hash table is not weak, mark all keys and values.
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5446 For weak tables, mark only the vector. */
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5447 if (NILP (h->weak))
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5448 mark_object (h->key_and_value);
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5449 else
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5450 VECTOR_MARK (XVECTOR (h->key_and_value));
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5451 }
104582
7d47cb148b29 (mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents: 104313
diff changeset
5452 else if (CHAR_TABLE_P (obj))
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5453 mark_char_table (XVECTOR (obj));
10291
96273a6ec492 (mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents: 10206
diff changeset
5454 else
85019
21a145f18ed2 (allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84978
diff changeset
5455 mark_vectorlike (XVECTOR (obj));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5456 break;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5457
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5458 case Lisp_Symbol:
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5459 {
32360
d8b668a486d7 (mark_object): Remove all workarounds installed on
Andreas Schwab <schwab@suse.de>
parents: 32099
diff changeset
5460 register struct Lisp_Symbol *ptr = XSYMBOL (obj);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5461 struct Lisp_Symbol *ptrx;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5462
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5463 if (ptr->gcmarkbit)
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5464 break;
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5465 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5466 ptr->gcmarkbit = 1;
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5467 mark_object (ptr->function);
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5468 mark_object (ptr->plist);
107984
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5469 switch (ptr->redirect)
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5470 {
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5471 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5472 case SYMBOL_VARALIAS:
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5473 {
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5474 Lisp_Object tem;
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5475 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5476 mark_object (tem);
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5477 break;
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5478 }
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5479 case SYMBOL_LOCALIZED:
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5480 {
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5481 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5482 /* If the value is forwarded to a buffer or keyboard field,
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5483 these are marked when we see the corresponding object.
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5484 And if it's forwarded to a C variable, either it's not
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5485 a Lisp_Object var, or it's staticpro'd already. */
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5486 mark_object (blv->where);
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5487 mark_object (blv->valcell);
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5488 mark_object (blv->defcell);
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5489 break;
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5490 }
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5491 case SYMBOL_FORWARDED:
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5492 /* If the value is forwarded to a buffer or keyboard field,
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5493 these are marked when we see the corresponding object.
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5494 And if it's forwarded to a C variable, either it's not
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5495 a Lisp_Object var, or it's staticpro'd already. */
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5496 break;
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5497 default: abort ();
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5498 }
45392
f3d7ab65641f * alloc.c (Fmake_symbol): Set symbol xname field instead of name.
Ken Raeburn <raeburn@raeburn.org>
parents: 44890
diff changeset
5499 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
f3d7ab65641f * alloc.c (Fmake_symbol): Set symbol xname field instead of name.
Ken Raeburn <raeburn@raeburn.org>
parents: 44890
diff changeset
5500 MARK_STRING (XSTRING (ptr->xname));
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46305
diff changeset
5501 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5502
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5503 ptr = ptr->next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5504 if (ptr)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5505 {
2507
7ba4316ae840 * alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
5506 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5507 XSETSYMBOL (obj, ptrx);
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5508 goto loop;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5509 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5510 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5511 break;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5512
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
5513 case Lisp_Misc:
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5514 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
85328
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
5515 if (XMISCANY (obj)->gcmarkbit)
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5516 break;
85328
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
5517 XMISCANY (obj)->gcmarkbit = 1;
56202
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5518
11243
054ecfce1820 (Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents: 11048
diff changeset
5519 switch (XMISCTYPE (obj))
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
5520 {
9893
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
5521
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5522 case Lisp_Misc_Marker:
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5523 /* DO NOT mark thru the marker's chain.
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5524 The buffer's markers chain does not preserve markers from gc;
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5525 instead, markers are removed from the chain when freed by gc. */
56202
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5526 break;
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5527
52166
25f780eb3fd8 (mark_object): Handle Lisp_Misc_Save_Value.
Andreas Schwab <schwab@suse.de>
parents: 51985
diff changeset
5528 case Lisp_Misc_Save_Value:
56401
1529ab7bab88 (mark_object): Only look at Lisp_Misc_Save_Value if GC_MARK_STACK.
Kim F. Storm <storm@cua.dk>
parents: 56239
diff changeset
5529 #if GC_MARK_STACK
56202
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5530 {
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5531 register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5532 /* If DOGC is set, POINTER is the address of a memory
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5533 area containing INTEGER potential Lisp_Objects. */
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5534 if (ptr->dogc)
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5535 {
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5536 Lisp_Object *p = (Lisp_Object *) ptr->pointer;
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5537 int nelt;
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5538 for (nelt = ptr->integer; nelt > 0; nelt--, p++)
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5539 mark_maybe_object (*p);
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5540 }
db1817b88294 (safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents: 56187
diff changeset
5541 }
56401
1529ab7bab88 (mark_object): Only look at Lisp_Misc_Save_Value if GC_MARK_STACK.
Kim F. Storm <storm@cua.dk>
parents: 56239
diff changeset
5542 #endif
9463
a40af805e036 (mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9437
diff changeset
5543 break;
a40af805e036 (mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9437
diff changeset
5544
9926
2a9f99682f82 (mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9893
diff changeset
5545 case Lisp_Misc_Overlay:
2a9f99682f82 (mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9893
diff changeset
5546 {
2a9f99682f82 (mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9893
diff changeset
5547 struct Lisp_Overlay *ptr = XOVERLAY (obj);
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5548 mark_object (ptr->start);
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5549 mark_object (ptr->end);
51843
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5550 mark_object (ptr->plist);
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5551 if (ptr->next)
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5552 {
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5553 XSETMISC (obj, ptr->next);
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5554 goto loop;
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5555 }
9926
2a9f99682f82 (mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9893
diff changeset
5556 }
2a9f99682f82 (mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9893
diff changeset
5557 break;
2a9f99682f82 (mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9893
diff changeset
5558
9437
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
5559 default:
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
5560 abort ();
c7d7fb56b42d (MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents: 9367
diff changeset
5561 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5562 break;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5563
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5564 case Lisp_Cons:
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5565 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5566 register struct Lisp_Cons *ptr = XCONS (obj);
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5567 if (CONS_MARKED_P (ptr))
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5568 break;
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5569 CHECK_ALLOCATED_AND_LIVE (live_cons_p);
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
5570 CONS_MARK (ptr);
1295
a9241dc503ab (mark_object): Avoid car recursion on cons with nil in cdr.
Richard M. Stallman <rms@gnu.org>
parents: 1168
diff changeset
5571 /* If the cdr is nil, avoid recursion for the car. */
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
5572 if (EQ (ptr->u.cdr, Qnil))
1295
a9241dc503ab (mark_object): Avoid car recursion on cons with nil in cdr.
Richard M. Stallman <rms@gnu.org>
parents: 1168
diff changeset
5573 {
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5574 obj = ptr->car;
46833
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5575 cdr_count = 0;
1295
a9241dc503ab (mark_object): Avoid car recursion on cons with nil in cdr.
Richard M. Stallman <rms@gnu.org>
parents: 1168
diff changeset
5576 goto loop;
a9241dc503ab (mark_object): Avoid car recursion on cons with nil in cdr.
Richard M. Stallman <rms@gnu.org>
parents: 1168
diff changeset
5577 }
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5578 mark_object (ptr->car);
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
5579 obj = ptr->u.cdr;
46833
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5580 cdr_count++;
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5581 if (cdr_count == mark_object_loop_halt)
b80760a75295 (mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents: 46459
diff changeset
5582 abort ();
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5583 goto loop;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5584 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5585
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5586 case Lisp_Float:
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5587 CHECK_ALLOCATED_AND_LIVE (live_float_p);
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
5588 FLOAT_MARK (XFLOAT (obj));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5589 break;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5590
105885
8103235103a7 Let integers use up 2 tags to give them one extra bit and double their range.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105881
diff changeset
5591 case_Lisp_Int:
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5592 break;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5593
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5594 default:
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5595 abort ();
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5596 }
29743
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5597
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5598 #undef CHECK_LIVE
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5599 #undef CHECK_ALLOCATED
1d802b332e0d (mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents: 28997
diff changeset
5600 #undef CHECK_ALLOCATED_AND_LIVE
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5601 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5602
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5603 /* Mark the pointers in a buffer structure. */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5604
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5605 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5606 mark_buffer (Lisp_Object buf)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5607 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5608 register struct buffer *buffer = XBUFFER (buf);
51843
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5609 register Lisp_Object *ptr, tmp;
10307
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
5610 Lisp_Object base_buffer;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5611
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5612 eassert (!VECTOR_MARKED_P (buffer));
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
5613 VECTOR_MARK (buffer);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5614
10307
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
5615 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5616
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5617 /* For now, we just don't mark the undo_list. It's done later in
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5618 a special way just before the sweep phase, and after stripping
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5619 some of its elements that are not needed any more. */
21306
dc2cbd40703c (mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents: 21258
diff changeset
5620
51843
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5621 if (buffer->overlays_before)
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5622 {
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5623 XSETMISC (tmp, buffer->overlays_before);
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5624 mark_object (tmp);
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5625 }
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5626 if (buffer->overlays_after)
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5627 {
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5628 XSETMISC (tmp, buffer->overlays_after);
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5629 mark_object (tmp);
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5630 }
65772ad7d4e1 (mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51788
diff changeset
5631
91780
d097bc79fdfb (mark_buffer): Comment fix to clarify the status of Lisp fields.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
5632 /* buffer-local Lisp variables start at `undo_list',
d097bc79fdfb (mark_buffer): Comment fix to clarify the status of Lisp fields.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 91367
diff changeset
5633 tho only the ones from `name' on are GC'd normally. */
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
5634 for (ptr = &buffer->name;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5635 (char *)ptr < (char *)buffer + sizeof (struct buffer);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5636 ptr++)
51770
ad47aa3ee2d7 (mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51758
diff changeset
5637 mark_object (*ptr);
10307
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
5638
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
5639 /* If this is an indirect buffer, mark its base buffer. */
51686
17c015f1f795 (mark_buffer): Fix missed buffer->name in last patch.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51683
diff changeset
5640 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
10307
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
5641 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5642 XSETBUFFER (base_buffer, buffer->base_buffer);
10307
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
5643 mark_buffer (base_buffer);
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
5644 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5645 }
10649
52cdd8cc8d3e (mark_perdisplays): New function.
Karl Heuer <kwzh@gnu.org>
parents: 10581
diff changeset
5646
84693
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5647 /* Mark the Lisp pointers in the terminal objects.
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5648 Called by the Fgarbage_collector. */
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5649
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5650 static void
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5651 mark_terminals (void)
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5652 {
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5653 struct terminal *t;
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5654 for (t = terminal_list; t; t = t->next_terminal)
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5655 {
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5656 eassert (t->name != NULL);
111758
0813efd37bf9 Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 109278
diff changeset
5657 #ifdef HAVE_WINDOW_SYSTEM
0813efd37bf9 Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 109278
diff changeset
5658 /* If a terminal object is reachable from a stacpro'ed object,
0813efd37bf9 Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 109278
diff changeset
5659 it might have been marked already. Make sure the image cache
0813efd37bf9 Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 109278
diff changeset
5660 gets marked. */
0813efd37bf9 Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 109278
diff changeset
5661 mark_image_cache (t->image_cache);
0813efd37bf9 Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 109278
diff changeset
5662 #endif /* HAVE_WINDOW_SYSTEM */
105986
850debe3a245 (mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105958
diff changeset
5663 if (!VECTOR_MARKED_P (t))
111758
0813efd37bf9 Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents: 109278
diff changeset
5664 mark_vectorlike ((struct Lisp_Vector *)t);
84693
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5665 }
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5666 }
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5667
7ee574475f20 (enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84602
diff changeset
5668
10649
52cdd8cc8d3e (mark_perdisplays): New function.
Karl Heuer <kwzh@gnu.org>
parents: 10581
diff changeset
5669
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5670 /* Value is non-zero if OBJ will survive the current GC because it's
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5671 either marked or does not need to be marked to survive. */
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5672
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5673 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5674 survives_gc_p (Lisp_Object obj)
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5675 {
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5676 int survives_p;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5677
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5678 switch (XTYPE (obj))
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5679 {
105885
8103235103a7 Let integers use up 2 tags to give them one extra bit and double their range.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105881
diff changeset
5680 case_Lisp_Int:
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5681 survives_p = 1;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5682 break;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5683
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5684 case Lisp_Symbol:
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5685 survives_p = XSYMBOL (obj)->gcmarkbit;
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5686 break;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5687
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5688 case Lisp_Misc:
85328
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
5689 survives_p = XMISCANY (obj)->gcmarkbit;
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5690 break;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5691
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5692 case Lisp_String:
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
5693 survives_p = STRING_MARKED_P (XSTRING (obj));
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5694 break;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5695
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5696 case Lisp_Vectorlike:
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90918
diff changeset
5697 survives_p = SUBRP (obj) || VECTOR_MARKED_P (XVECTOR (obj));
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5698 break;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5699
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5700 case Lisp_Cons:
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
5701 survives_p = CONS_MARKED_P (XCONS (obj));
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5702 break;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5703
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5704 case Lisp_Float:
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
5705 survives_p = FLOAT_MARKED_P (XFLOAT (obj));
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5706 break;
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5707
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5708 default:
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5709 abort ();
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5710 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5711
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5712 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj));
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5713 }
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5714
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
5715
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5716
1908
d649f2179d67 * alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents: 1893
diff changeset
5717 /* Sweep: find all structures not marked, and free them. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5718
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5719 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
5720 gc_sweep (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5721 {
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5722 /* Remove or mark entries in weak hash tables.
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5723 This must be done before any object is unmarked. */
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5724 sweep_weak_hash_tables ();
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5725
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5726 sweep_strings ();
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5727 #ifdef GC_CHECK_STRING_BYTES
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5728 if (!noninteractive)
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5729 check_string_bytes (1);
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5730 #endif
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
5731
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5732 /* Put all unmarked conses on free list */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5733 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5734 register struct cons_block *cblk;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5735 struct cons_block **cprev = &cons_block;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5736 register int lim = cons_block_index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5737 register int num_free = 0, num_used = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5738
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5739 cons_free_list = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5740
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5741 for (cblk = cons_block; cblk; cblk = *cprev)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5742 {
84816
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5743 register int i = 0;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5744 int this_free = 0;
84816
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5745 int ilim = (lim + BITS_PER_INT - 1) / BITS_PER_INT;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5746
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5747 /* Scan the mark bits an int at a time. */
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5748 for (i = 0; i <= ilim; i++)
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5749 {
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5750 if (cblk->gcmarkbits[i] == -1)
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5751 {
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5752 /* Fast path - all cons cells for this int are marked. */
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5753 cblk->gcmarkbits[i] = 0;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5754 num_used += BITS_PER_INT;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5755 }
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5756 else
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5757 {
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5758 /* Some cons cells for this int are not marked.
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5759 Find which ones, and free them. */
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5760 int start, pos, stop;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5761
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5762 start = i * BITS_PER_INT;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5763 stop = lim - start;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5764 if (stop > BITS_PER_INT)
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5765 stop = BITS_PER_INT;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5766 stop += start;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5767
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5768 for (pos = start; pos < stop; pos++)
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5769 {
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5770 if (!CONS_MARKED_P (&cblk->conses[pos]))
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5771 {
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5772 this_free++;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5773 cblk->conses[pos].u.chain = cons_free_list;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5774 cons_free_list = &cblk->conses[pos];
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5775 #if GC_MARK_STACK
84816
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5776 cons_free_list->car = Vdead;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5777 #endif
84816
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5778 }
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5779 else
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5780 {
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5781 num_used++;
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5782 CONS_UNMARK (&cblk->conses[pos]);
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5783 }
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5784 }
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5785 }
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5786 }
4d1c866492b0 (gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents: 84693
diff changeset
5787
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5788 lim = CONS_BLOCK_SIZE;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5789 /* If this block contains only free conses and we have already
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5790 seen more than two blocks worth of free conses then deallocate
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5791 this block. */
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5792 if (this_free == CONS_BLOCK_SIZE && num_free > CONS_BLOCK_SIZE)
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5793 {
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5794 *cprev = cblk->next;
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5795 /* Unhook from the free list. */
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
5796 cons_free_list = cblk->conses[0].u.chain;
51938
20d4eb1de9b0 Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51908
diff changeset
5797 lisp_align_free (cblk);
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
5798 n_cons_blocks--;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5799 }
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5800 else
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5801 {
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5802 num_free += this_free;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5803 cprev = &cblk->next;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5804 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5805 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5806 total_conses = num_used;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5807 total_free_conses = num_free;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5808 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5809
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5810 /* Put all unmarked floats on free list */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5811 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5812 register struct float_block *fblk;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5813 struct float_block **fprev = &float_block;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5814 register int lim = float_block_index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5815 register int num_free = 0, num_used = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5816
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5817 float_free_list = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5818
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5819 for (fblk = float_block; fblk; fblk = *fprev)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5820 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5821 register int i;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5822 int this_free = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5823 for (i = 0; i < lim; i++)
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
5824 if (!FLOAT_MARKED_P (&fblk->floats[i]))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5825 {
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5826 this_free++;
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
5827 fblk->floats[i].u.chain = float_free_list;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5828 float_free_list = &fblk->floats[i];
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5829 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5830 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5831 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5832 num_used++;
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
5833 FLOAT_UNMARK (&fblk->floats[i]);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5834 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5835 lim = FLOAT_BLOCK_SIZE;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5836 /* If this block contains only free floats and we have already
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5837 seen more than two blocks worth of free floats then deallocate
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5838 this block. */
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5839 if (this_free == FLOAT_BLOCK_SIZE && num_free > FLOAT_BLOCK_SIZE)
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5840 {
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5841 *fprev = fblk->next;
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5842 /* Unhook from the free list. */
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
5843 float_free_list = fblk->floats[0].u.chain;
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
5844 lisp_align_free (fblk);
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
5845 n_float_blocks--;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5846 }
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5847 else
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5848 {
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5849 num_free += this_free;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5850 fprev = &fblk->next;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5851 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5852 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5853 total_floats = num_used;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5854 total_free_floats = num_free;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5855 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5856
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5857 /* Put all unmarked intervals on free list */
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5858 {
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5859 register struct interval_block *iblk;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5860 struct interval_block **iprev = &interval_block;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5861 register int lim = interval_block_index;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5862 register int num_free = 0, num_used = 0;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5863
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5864 interval_free_list = 0;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5865
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5866 for (iblk = interval_block; iblk; iblk = *iprev)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5867 {
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5868 register int i;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5869 int this_free = 0;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5870
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5871 for (i = 0; i < lim; i++)
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5872 {
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5873 if (!iblk->intervals[i].gcmarkbit)
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5874 {
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 28220
diff changeset
5875 SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5876 interval_free_list = &iblk->intervals[i];
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5877 this_free++;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5878 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5879 else
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5880 {
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5881 num_used++;
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5882 iblk->intervals[i].gcmarkbit = 0;
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5883 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5884 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5885 lim = INTERVAL_BLOCK_SIZE;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5886 /* If this block contains only free intervals and we have already
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5887 seen more than two blocks worth of free intervals then
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5888 deallocate this block. */
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5889 if (this_free == INTERVAL_BLOCK_SIZE && num_free > INTERVAL_BLOCK_SIZE)
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5890 {
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5891 *iprev = iblk->next;
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5892 /* Unhook from the free list. */
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 28220
diff changeset
5893 interval_free_list = INTERVAL_PARENT (&iblk->intervals[0]);
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
5894 lisp_free (iblk);
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
5895 n_interval_blocks--;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5896 }
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5897 else
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5898 {
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5899 num_free += this_free;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5900 iprev = &iblk->next;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5901 }
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5902 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5903 total_intervals = num_used;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5904 total_free_intervals = num_free;
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5905 }
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
5906
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5907 /* Put all unmarked symbols on free list */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5908 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5909 register struct symbol_block *sblk;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5910 struct symbol_block **sprev = &symbol_block;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5911 register int lim = symbol_block_index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5912 register int num_free = 0, num_used = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5913
34308
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5914 symbol_free_list = NULL;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5915
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5916 for (sblk = symbol_block; sblk; sblk = *sprev)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5917 {
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5918 int this_free = 0;
34308
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5919 struct Lisp_Symbol *sym = sblk->symbols;
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5920 struct Lisp_Symbol *end = sym + lim;
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5921
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5922 for (; sym < end; ++sym)
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5923 {
34325
a65d8c29442a (gc_sweep): Add comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34308
diff changeset
5924 /* Check if the symbol was created during loadup. In such a case
a65d8c29442a (gc_sweep): Add comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34308
diff changeset
5925 it might be pointed to by pure bytecode which we don't trace,
a65d8c29442a (gc_sweep): Add comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34308
diff changeset
5926 so we conservatively assume that it is live. */
45392
f3d7ab65641f * alloc.c (Fmake_symbol): Set symbol xname field instead of name.
Ken Raeburn <raeburn@raeburn.org>
parents: 44890
diff changeset
5927 int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5928
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5929 if (!sym->gcmarkbit && !pure_p)
34308
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5930 {
107984
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5931 if (sym->redirect == SYMBOL_LOCALIZED)
bef5d1738c0b Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107895
diff changeset
5932 xfree (SYMBOL_BLV (sym));
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
5933 sym->next = symbol_free_list;
34308
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5934 symbol_free_list = sym;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5935 #if GC_MARK_STACK
34308
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5936 symbol_free_list->function = Vdead;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
5937 #endif
34308
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5938 ++this_free;
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5939 }
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5940 else
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5941 {
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5942 ++num_used;
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5943 if (!pure_p)
45392
f3d7ab65641f * alloc.c (Fmake_symbol): Set symbol xname field instead of name.
Ken Raeburn <raeburn@raeburn.org>
parents: 44890
diff changeset
5944 UNMARK_STRING (XSTRING (sym->xname));
51658
00b3e009b3f5 (make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51578
diff changeset
5945 sym->gcmarkbit = 0;
34308
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5946 }
6d490e8ef117 (gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents: 34270
diff changeset
5947 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5948
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5949 lim = SYMBOL_BLOCK_SIZE;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5950 /* If this block contains only free symbols and we have already
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5951 seen more than two blocks worth of free symbols then deallocate
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5952 this block. */
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5953 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5954 {
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5955 *sprev = sblk->next;
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5956 /* Unhook from the free list. */
66889
e485868e3caf (free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents: 66777
diff changeset
5957 symbol_free_list = sblk->symbols[0].next;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
5958 lisp_free (sblk);
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
5959 n_symbol_blocks--;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5960 }
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5961 else
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5962 {
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5963 num_free += this_free;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5964 sprev = &sblk->next;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
5965 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5966 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5967 total_symbols = num_used;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5968 total_free_symbols = num_free;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5969 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5970
21143
ce12eac1ee45 (gc_sweep, mark_object): Handle new data structure
Richard M. Stallman <rms@gnu.org>
parents: 21084
diff changeset
5971 /* Put all unmarked misc's on free list.
ce12eac1ee45 (gc_sweep, mark_object): Handle new data structure
Richard M. Stallman <rms@gnu.org>
parents: 21084
diff changeset
5972 For a marker, first unchain it from the buffer it points into. */
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5973 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5974 register struct marker_block *mblk;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5975 struct marker_block **mprev = &marker_block;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5976 register int lim = marker_block_index;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5977 register int num_free = 0, num_used = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5978
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5979 marker_free_list = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
5980
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5981 for (mblk = marker_block; mblk; mblk = *mprev)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5982 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5983 register int i;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5984 int this_free = 0;
11403
bd3241a14d0a (gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents: 11374
diff changeset
5985
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5986 for (i = 0; i < lim; i++)
9893
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
5987 {
85344
99492f857499 (free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85329
diff changeset
5988 if (!mblk->markers[i].u_any.gcmarkbit)
9893
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
5989 {
85344
99492f857499 (free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85329
diff changeset
5990 if (mblk->markers[i].u_any.type == Lisp_Misc_Marker)
51668
0f333fd92a1d (survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51658
diff changeset
5991 unchain_marker (&mblk->markers[i].u_marker);
11403
bd3241a14d0a (gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents: 11374
diff changeset
5992 /* Set the type of the freed object to Lisp_Misc_Free.
bd3241a14d0a (gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents: 11374
diff changeset
5993 We could leave the type alone, since nobody checks it,
9893
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
5994 but this might catch bugs faster. */
11243
054ecfce1820 (Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents: 11048
diff changeset
5995 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
9893
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
5996 mblk->markers[i].u_free.chain = marker_free_list;
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
5997 marker_free_list = &mblk->markers[i];
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
5998 this_free++;
9893
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
5999 }
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
6000 else
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
6001 {
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
6002 num_used++;
85344
99492f857499 (free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85329
diff changeset
6003 mblk->markers[i].u_any.gcmarkbit = 0;
9893
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
6004 }
8421d09f2afe (mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents: 9463
diff changeset
6005 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6006 lim = MARKER_BLOCK_SIZE;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6007 /* If this block contains only free markers and we have already
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6008 seen more than two blocks worth of free markers then deallocate
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6009 this block. */
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
6010 if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE)
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6011 {
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6012 *mprev = mblk->next;
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6013 /* Unhook from the free list. */
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6014 marker_free_list = mblk->markers[0].u_free.chain;
55816
a4fe04f4d9c2 Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55798
diff changeset
6015 lisp_free (mblk);
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
6016 n_marker_blocks--;
20057
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6017 }
612cd201aea5 (gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents: 19666
diff changeset
6018 else
21379
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
6019 {
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
6020 num_free += this_free;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
6021 mprev = &mblk->next;
1701bf5b9dec (gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents: 21306
diff changeset
6022 }
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6023 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6024
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6025 total_markers = num_used;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6026 total_free_markers = num_free;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6027 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6028
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6029 /* Free all unmarked buffers */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6030 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6031 register struct buffer *buffer = all_buffers, *prev = 0, *next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6032
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6033 while (buffer)
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
6034 if (!VECTOR_MARKED_P (buffer))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6035 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6036 if (prev)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6037 prev->next = buffer->next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6038 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6039 all_buffers = buffer->next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6040 next = buffer->next;
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6041 lisp_free (buffer);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6042 buffer = next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6043 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6044 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6045 {
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
6046 VECTOR_UNMARK (buffer);
10307
e6e75fd0916d (mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents: 10291
diff changeset
6047 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6048 prev = buffer, buffer = buffer->next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6049 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6050 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6051
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6052 /* Free all unmarked vectors */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6053 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6054 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6055 total_vector_size = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6056
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6057 while (vector)
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
6058 if (!VECTOR_MARKED_P (vector))
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6059 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6060 if (prev)
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6061 prev->next = vector->next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6062 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6063 all_vectors = vector->next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6064 next = vector->next;
23958
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
6065 lisp_free (vector);
7094b74ce0a6 (lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 23534
diff changeset
6066 n_vectors--;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6067 vector = next;
25024
3bb745067f0e (gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents: 23973
diff changeset
6068
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6069 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6070 else
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6071 {
51683
fb960854a12c (VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51668
diff changeset
6072 VECTOR_UNMARK (vector);
11403
bd3241a14d0a (gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents: 11374
diff changeset
6073 if (vector->size & PSEUDOVECTOR_FLAG)
bd3241a14d0a (gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents: 11374
diff changeset
6074 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
bd3241a14d0a (gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents: 11374
diff changeset
6075 else
bd3241a14d0a (gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents: 11374
diff changeset
6076 total_vector_size += vector->size;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6077 prev = vector, vector = vector->next;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6078 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6079 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49529
diff changeset
6080
35183
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
6081 #ifdef GC_CHECK_STRING_BYTES
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
6082 if (!noninteractive)
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
6083 check_string_bytes (1);
cc2a06489f0d (CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents: 35170
diff changeset
6084 #endif
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6085 }
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
6086
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
6087
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
6088
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6089
1327
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6090 /* Debugging aids. */
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6091
5353
6389ed5b45ac (Fmemory_limit): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents: 4956
diff changeset
6092 DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6093 doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6094 This may be helpful in debugging Emacs's memory usage.
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6095 We divide the value by 1024 to make sure it fits in a Lisp integer. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
6096 (void)
1327
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6097 {
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6098 Lisp_Object end;
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6099
9261
e5ba7993d378 (VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents: 9144
diff changeset
6100 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
1327
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6101
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6102 return end;
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6103 }
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6104
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
6105 DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6106 doc: /* Return a list of counters that measure how much consing there has been.
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6107 Each of these counters increments for a certain kind of object.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6108 The counters wrap around from the largest positive integer to zero.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6109 Garbage collection does not decrease them.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6110 The elements of the value are as follows:
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6111 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS STRINGS)
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6112 All are in units of 1 = one object consed
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6113 except for VECTOR-CELLS and STRING-CHARS, which count the total length of
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6114 objects consed.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6115 MISCS include overlays, markers, and some internal types.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6116 Frames, windows, buffers, and subprocesses count as vectors
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6117 (but the contents of a buffer's text do not count here). */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109165
diff changeset
6118 (void)
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
6119 {
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
6120 Lisp_Object consed[8];
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
6121
39633
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6122 consed[0] = make_number (min (MOST_POSITIVE_FIXNUM, cons_cells_consed));
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6123 consed[1] = make_number (min (MOST_POSITIVE_FIXNUM, floats_consed));
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6124 consed[2] = make_number (min (MOST_POSITIVE_FIXNUM, vector_cells_consed));
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6125 consed[3] = make_number (min (MOST_POSITIVE_FIXNUM, symbols_consed));
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6126 consed[4] = make_number (min (MOST_POSITIVE_FIXNUM, string_chars_consed));
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6127 consed[5] = make_number (min (MOST_POSITIVE_FIXNUM, misc_objects_consed));
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6128 consed[6] = make_number (min (MOST_POSITIVE_FIXNUM, intervals_consed));
a0bf0cb8ff3e (inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents: 39572
diff changeset
6129 consed[7] = make_number (min (MOST_POSITIVE_FIXNUM, strings_consed));
27142
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
6130
f742c86fcc15 (Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents: 27006
diff changeset
6131 return Flist (8, consed);
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
6132 }
28406
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28374
diff changeset
6133
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28374
diff changeset
6134 int suppress_checking;
85674
01258ecfc38e (spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents: 85344
diff changeset
6135
28406
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28374
diff changeset
6136 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
6137 die (const char *msg, const char *file, int line)
28406
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28374
diff changeset
6138 {
85328
d0d527210b0c * lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 85023
diff changeset
6139 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: %s\r\n",
28406
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28374
diff changeset
6140 file, line, msg);
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28374
diff changeset
6141 abort ();
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28374
diff changeset
6142 }
1327
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6143
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6144 /* Initialization */
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6145
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21379
diff changeset
6146 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
6147 init_alloc_once (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6148 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6149 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6150 purebeg = PUREBEG;
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6151 pure_size = PURESIZE;
32594
e0646c73bf81 (pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents: 32587
diff changeset
6152 pure_bytes_used = 0;
72027
107f9a044a0a (pure_bytes_used_lisp, pure_bytes_used_non_lisp): New vars.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 71967
diff changeset
6153 pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6154 pure_bytes_used_before_overflow = 0;
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6155
51723
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
6156 /* Initialize the list of free aligned blocks. */
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
6157 free_ablock = NULL;
635066222916 (ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51686
diff changeset
6158
32692
0343fe9ef3ac (toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents: 32609
diff changeset
6159 #if GC_MARK_STACK || defined GC_MALLOC_CHECK
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6160 mem_init ();
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6161 Vdead = make_pure_string ("DEAD", 4, 4, 0);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6162 #endif
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6163
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6164 all_vectors = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6165 ignore_warnings = 1;
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
6166 #ifdef DOUG_LEA_MALLOC
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
6167 mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
6168 mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
23973
2eb9e2f5aa33 (MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 23958
diff changeset
6169 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); /* max. number of mmap'ed areas */
17345
4e11e27ce1f1 For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents: 17328
diff changeset
6170 #endif
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6171 init_strings ();
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6172 init_cons ();
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6173 init_symbol ();
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6174 init_marker ();
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6175 init_float ();
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6176 init_intervals ();
94993
b0b4e9fbfb37 (init_alloc_once): Call init_weak_hash_tables.
Chong Yidong <cyd@stupidchicken.com>
parents: 94963
diff changeset
6177 init_weak_hash_tables ();
1300
b13b79e28eb5 * alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents: 1295
diff changeset
6178
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
6179 #ifdef REL_ALLOC
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
6180 malloc_hysteresis = 32;
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
6181 #else
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
6182 malloc_hysteresis = 0;
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
6183 #endif
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
6184
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
6185 refill_memory_reserve ();
10673
337c3a4d5fef (emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents: 10649
diff changeset
6186
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6187 ignore_warnings = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6188 gcprolist = 0;
26364
7b0217d9259c (Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents: 26164
diff changeset
6189 byte_stack_list = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6190 staticidx = 0;
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6191 consing_since_gc = 0;
12605
c5798bb57fdd (init_alloc_once): Set gc_cons_threshold from Lisp obj size.
Richard M. Stallman <rms@gnu.org>
parents: 12529
diff changeset
6192 gc_cons_threshold = 100000 * sizeof (Lisp_Object);
64611
47f158dcf216 (gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents: 64273
diff changeset
6193 gc_relative_threshold = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6194 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6195
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21379
diff changeset
6196 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
6197 init_alloc (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6198 {
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6199 gcprolist = 0;
26364
7b0217d9259c (Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents: 26164
diff changeset
6200 byte_stack_list = 0;
28365
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
6201 #if GC_MARK_STACK
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
6202 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
6203 setjmp_tested_p = longjmps_done = 0;
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
6204 #endif
a72abbd8dc16 (mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 28269
diff changeset
6205 #endif
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
6206 Vgc_elapsed = make_float (0.0);
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
6207 gcs_done = 0;
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6208 }
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6209
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6210 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
6211 syms_of_alloc (void)
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6212 {
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6213 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6214 doc: /* *Number of bytes of consing between garbage collections.
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6215 Garbage collection can happen automatically once this many bytes have been
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6216 allocated since the last garbage collection. All data types count.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6217
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6218 Garbage collection happens automatically only when `eval' is called.
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6219
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6220 By binding this temporarily to a large number, you can effectively
64267
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6221 prevent garbage collection during a part of the program.
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6222 See also `gc-cons-percentage'. */);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6223
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6224 DEFVAR_LISP ("gc-cons-percentage", &Vgc_cons_percentage,
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6225 doc: /* *Portion of the heap used for allocation.
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6226 Garbage collection can happen automatically once this portion of the heap
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6227 has been allocated since the last garbage collection.
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6228 If this portion is smaller than `gc-cons-threshold', this is ignored. */);
5c7cbbd6dbb4 (gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64084
diff changeset
6229 Vgc_cons_percentage = make_float (0.1);
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6230
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6231 DEFVAR_INT ("pure-bytes-used", &pure_bytes_used,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6232 doc: /* Number of bytes of sharable Lisp data allocated so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6233
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6234 DEFVAR_INT ("cons-cells-consed", &cons_cells_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6235 doc: /* Number of cons cells that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6236
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6237 DEFVAR_INT ("floats-consed", &floats_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6238 doc: /* Number of floats that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6239
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6240 DEFVAR_INT ("vector-cells-consed", &vector_cells_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6241 doc: /* Number of vector cells that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6242
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6243 DEFVAR_INT ("symbols-consed", &symbols_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6244 doc: /* Number of symbols that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6245
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6246 DEFVAR_INT ("string-chars-consed", &string_chars_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6247 doc: /* Number of string characters that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6248
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6249 DEFVAR_INT ("misc-objects-consed", &misc_objects_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6250 doc: /* Number of miscellaneous objects that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6251
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6252 DEFVAR_INT ("intervals-consed", &intervals_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6253 doc: /* Number of intervals that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6254
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6255 DEFVAR_INT ("strings-consed", &strings_consed,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6256 doc: /* Number of strings that have been consed so far. */);
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6257
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6258 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6259 doc: /* Non-nil means loading Lisp code in order to dump an executable.
107895
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
6260 This means that certain objects should be allocated in shared (pure) space.
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
6261 It can also be set to a hash-table, in which case this table is used to
265966b778f9 Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107435
diff changeset
6262 do hash-consing of the objects allocated to pure space. */);
39914
91951fb5b9e5 Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents: 39859
diff changeset
6263
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6264 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6265 doc: /* Non-nil means display messages at start and end of garbage collection. */);
14959
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
6266 garbage_collection_messages = 0;
f2b5d784fa88 (garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14764
diff changeset
6267
39988
eac4e9ae201c Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents: 39973
diff changeset
6268 DEFVAR_LISP ("post-gc-hook", &Vpost_gc_hook,
40107
d3cc7dd5d75a Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents: 39988
diff changeset
6269 doc: /* Hook run after garbage collection has finished. */);
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6270 Vpost_gc_hook = Qnil;
105877
21bdda3ded62 * xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105871
diff changeset
6271 Qpost_gc_hook = intern_c_string ("post-gc-hook");
39572
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6272 staticpro (&Qpost_gc_hook);
715a67381594 (purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents: 39297
diff changeset
6273
46305
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
6274 DEFVAR_LISP ("memory-signal-data", &Vmemory_signal_data,
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
6275 doc: /* Precomputed `signal' argument for memory-full error. */);
6116
64417bbbb128 (memory_full): Use new variable memory_signal_data with precomputed value
Karl Heuer <kwzh@gnu.org>
parents: 5874
diff changeset
6276 /* We build this in advance because if we wait until we need it, we might
64417bbbb128 (memory_full): Use new variable memory_signal_data with precomputed value
Karl Heuer <kwzh@gnu.org>
parents: 5874
diff changeset
6277 not be able to allocate the memory to hold it. */
46305
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
6278 Vmemory_signal_data
105958
341a779db1d0 * frame.c (make_initial_frame):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105885
diff changeset
6279 = pure_cons (Qerror,
341a779db1d0 * frame.c (make_initial_frame):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105885
diff changeset
6280 pure_cons (make_pure_c_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"), Qnil));
46305
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
6281
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
6282 DEFVAR_LISP ("memory-full", &Vmemory_full,
66530
88aab29bf2b2 (syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 66499
diff changeset
6283 doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);
46305
fed6b815dbeb (Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 46293
diff changeset
6284 Vmemory_full = Qnil;
6116
64417bbbb128 (memory_full): Use new variable memory_signal_data with precomputed value
Karl Heuer <kwzh@gnu.org>
parents: 5874
diff changeset
6285
11374
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
6286 staticpro (&Qgc_cons_threshold);
105877
21bdda3ded62 * xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105871
diff changeset
6287 Qgc_cons_threshold = intern_c_string ("gc-cons-threshold");
11374
1ebc81f84aa4 (inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents: 11341
diff changeset
6288
13219
99b5164a319d (Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 13150
diff changeset
6289 staticpro (&Qchar_table_extra_slots);
105877
21bdda3ded62 * xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105871
diff changeset
6290 Qchar_table_extra_slots = intern_c_string ("char-table-extra-slots");
13219
99b5164a319d (Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 13150
diff changeset
6291
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
6292 DEFVAR_LISP ("gc-elapsed", &Vgc_elapsed,
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
6293 doc: /* Accumulated time elapsed in garbage collections.
51974
111cc76606c6 (syms_of_alloc): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 51938
diff changeset
6294 The time is in seconds as a floating point value. */);
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
6295 DEFVAR_INT ("gcs-done", &gcs_done,
51974
111cc76606c6 (syms_of_alloc): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 51938
diff changeset
6296 doc: /* Accumulated number of garbage collections done. */);
49529
fd79b3081e01 (Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents: 49414
diff changeset
6297
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6298 defsubr (&Scons);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6299 defsubr (&Slist);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6300 defsubr (&Svector);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6301 defsubr (&Smake_byte_code);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6302 defsubr (&Smake_list);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6303 defsubr (&Smake_vector);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6304 defsubr (&Smake_string);
13141
4a4d1d8e89e5 (Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 13008
diff changeset
6305 defsubr (&Smake_bool_vector);
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6306 defsubr (&Smake_symbol);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6307 defsubr (&Smake_marker);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6308 defsubr (&Spurecopy);
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6309 defsubr (&Sgarbage_collect);
1327
ef16e7c0d402 * alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents: 1318
diff changeset
6310 defsubr (&Smemory_limit);
12748
3433bb446e06 (cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents: 12605
diff changeset
6311 defsubr (&Smemory_use_counts);
27738
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6312
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6313 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6314 defsubr (&Sgc_status);
581c76c41ca4 (mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents: 27727
diff changeset
6315 #endif
300
4ee2046fcb72 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6316 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52276
diff changeset
6317