Mercurial > emacs
annotate src/alloc.c @ 111824:88e55e239ecc
* lisp/replace.el: Add "collect" feature to occur.
(occur-collect-regexp-history): New var.
(occur-read-primary-args): Return a replace string for nlines, if needed.
(occur): Extend the meaning of nlines.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Fri, 03 Dec 2010 20:58:06 -0500 |
parents | 141d3f14d8c3 |
children | a5a188ddc758 |
rev | line source |
---|---|
300 | 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, |
106815 | 3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
79759 | 4 Free Software Foundation, Inc. |
300 | 5 |
6 This file is part of GNU Emacs. | |
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 | 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 | 12 |
13 GNU Emacs is distributed in the hope that it will be useful, | |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 GNU General Public License for more details. | |
17 | |
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 | 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 | 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 | 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 | 44 #include "puresize.h" |
300 | 45 #include "buffer.h" |
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 | 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 | 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 | 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 #ifdef HAVE_UNISTD_H |
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
63 #include <unistd.h> |
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
64 #else |
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
65 extern POINTER_TYPE *sbrk (); |
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
66 #endif |
12096 | 67 |
67216
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
68 #include <fcntl.h> |
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
69 |
72177
4eba80d54b43
[WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents:
72167
diff
changeset
|
70 #ifdef WINDOWSNT |
72288 | 71 #include "w32.h" |
72177
4eba80d54b43
[WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents:
72167
diff
changeset
|
72 #endif |
4eba80d54b43
[WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents:
72167
diff
changeset
|
73 |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
74 #ifdef DOUG_LEA_MALLOC |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
75 |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
76 #include <malloc.h> |
31892
2f3d88ac2b38
(__malloc_size_t) [DOUG_LEA_MALLOC]: Don't redefine it.
Dave Love <fx@gnu.org>
parents:
31889
diff
changeset
|
77 /* 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
|
78 #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
|
79 #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
|
80 #endif |
23973
2eb9e2f5aa33
(MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents:
23958
diff
changeset
|
81 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
82 /* 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
|
83 value that explicitly means "no limit". */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
84 |
23973
2eb9e2f5aa33
(MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents:
23958
diff
changeset
|
85 #define MMAP_MAX_AREAS 100000000 |
2eb9e2f5aa33
(MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents:
23958
diff
changeset
|
86 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
87 #else /* not DOUG_LEA_MALLOC */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
88 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
89 /* 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
|
90 |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
91 #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
|
92 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
|
93 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
|
94 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
95 #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
|
96 |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
97 #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
|
98 |
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
|
99 /* 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
|
100 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
|
101 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
|
102 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
|
103 |
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 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
|
105 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
|
106 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
|
107 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
|
108 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
|
109 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
|
110 |
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
111 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
|
112 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
|
113 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
|
114 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
|
115 |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
116 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
|
117 |
75192
a62f8b0494a2
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents:
73964
diff
changeset
|
118 #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
|
119 do \ |
a62f8b0494a2
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents:
73964
diff
changeset
|
120 { \ |
a62f8b0494a2
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents:
73964
diff
changeset
|
121 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
|
122 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
|
123 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
|
124 } \ |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
125 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
|
126 #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
|
127 do \ |
a62f8b0494a2
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents:
73964
diff
changeset
|
128 { \ |
a62f8b0494a2
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Use pthread_equal,
Jan Djärv <jan.h.d@swipnet.se>
parents:
73964
diff
changeset
|
129 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
|
130 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
|
131 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
|
132 } \ |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
133 while (0) |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
134 |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
135 #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
|
136 |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
137 #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
|
138 #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
|
139 |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
140 #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
|
141 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
142 /* 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
|
143 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
144 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
|
145 |
66547
9373f926904a
(BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents:
66541
diff
changeset
|
146 static __malloc_size_t bytes_used_when_reconsidered; |
9373f926904a
(BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents:
66541
diff
changeset
|
147 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
148 /* 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
|
149 to a struct Lisp_String. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
150 |
51985
b52e88c3d6d0
(MARK_STRING, UNMARK_STRING, STRING_MARKED_P)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51974
diff
changeset
|
151 #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
|
152 #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
|
153 #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
|
154 |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
155 #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
|
156 #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
|
157 #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
|
158 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
159 /* 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
|
160 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
|
161 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
|
162 strings. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
163 |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
164 #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
|
165 #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
|
166 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
167 /* 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
|
168 |
300 | 169 int consing_since_gc; |
170 | |
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
171 /* 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
|
172 |
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
|
173 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
|
174 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
|
175 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
|
176 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
|
177 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
|
178 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
|
179 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
|
180 EMACS_INT strings_consed; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
181 |
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
182 /* 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
|
183 |
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
184 EMACS_INT gc_cons_threshold; |
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
185 |
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
186 /* Similar minimum, computed from Vgc_cons_percentage. */ |
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
187 |
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
188 EMACS_INT gc_relative_threshold; |
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
189 |
64267
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
190 static Lisp_Object Vgc_cons_percentage; |
300 | 191 |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
192 /* 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
|
193 when memory is full. */ |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
194 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
195 EMACS_INT memory_full_cons_threshold; |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
196 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
197 /* Nonzero during GC. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
198 |
300 | 199 int gc_in_progress; |
200 | |
50745
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
201 /* Nonzero means abort if try to GC. |
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
202 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
|
203 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
|
204 |
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
205 int abort_on_gc; |
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
206 |
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
207 /* 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
|
208 |
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
209 int garbage_collection_messages; |
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
210 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
211 /* 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
|
212 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
213 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
|
214 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
|
215 static int total_free_floats, total_floats; |
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
216 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
217 /* 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
|
218 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
|
219 two string blocks. */ |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
220 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
221 static char *spare_memory[7]; |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
222 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
223 /* 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
|
224 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
225 #define SPARE_MEMORY (1 << 14) |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
226 |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
227 /* 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
|
228 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
229 static int malloc_hysteresis; |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
230 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
231 /* 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
|
232 |
300 | 233 Lisp_Object Vpurify_flag; |
234 | |
46305
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
235 /* 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
|
236 |
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
237 Lisp_Object Vmemory_full; |
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
238 |
57137 | 239 /* Initialize it to a nonzero value to force it into data space |
240 (rather than bss space). That way unexec will remap it into text | |
241 space (pure), on some systems. We have not implemented the | |
242 remapping on more recent systems because this is less important | |
243 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
|
244 |
78593
5d078cae9374
(pure): Round PURESIZE up.
Andreas Schwab <schwab@suse.de>
parents:
78260
diff
changeset
|
245 EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,}; |
300 | 246 #define PUREBEG (char *) pure |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
247 |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
248 /* 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
|
249 |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
250 static char *purebeg; |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
251 static size_t pure_size; |
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 /* 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
|
254 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
|
255 |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
256 static size_t pure_bytes_used_before_overflow; |
300 | 257 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
258 /* 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
|
259 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
260 #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
|
261 (((PNTR_COMPARISON_TYPE) (P) \ |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
262 < (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
|
263 && ((PNTR_COMPARISON_TYPE) (P) \ |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
264 >= (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
|
265 |
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
|
266 /* 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
|
267 |
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
|
268 EMACS_INT pure_bytes_used; |
300 | 269 |
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
|
270 /* 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
|
271 |
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 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
|
273 |
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 /* 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
|
275 |
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
|
276 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
|
277 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
278 /* 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
|
279 displayed. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
280 |
109313
e856a274549b
Constify functions taking char *
Andreas Schwab <schwab@linux-m68k.org>
parents:
109302
diff
changeset
|
281 const char *pending_malloc_warning; |
300 | 282 |
6116
64417bbbb128
(memory_full): Use new variable memory_signal_data with precomputed value
Karl Heuer <kwzh@gnu.org>
parents:
5874
diff
changeset
|
283 /* 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
|
284 |
46305
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
285 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
|
286 |
300 | 287 /* Maximum amount of C stack to save when a GC happens. */ |
288 | |
289 #ifndef MAX_SAVE_STACK | |
290 #define MAX_SAVE_STACK 16000 | |
291 #endif | |
292 | |
293 /* Buffer in which we save a copy of the C stack at each GC. */ | |
294 | |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
295 static char *stack_copy; |
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
296 static int stack_copy_size; |
300 | 297 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
298 /* 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
|
299 Currently not used. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
300 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
301 static int ignore_warnings; |
1318 | 302 |
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
303 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
|
304 |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
305 /* Hook run after GC has finished. */ |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
306 |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
307 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
|
308 |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
309 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
|
310 EMACS_INT gcs_done; /* accumulated GCs */ |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
311 |
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
|
312 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 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
|
318 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
|
319 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
|
320 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
321 #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
|
322 extern void mark_fringe_data (void); |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
323 #endif /* HAVE_WINDOW_SYSTEM */ |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
324 |
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
|
325 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
|
326 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
|
327 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
|
328 static void sweep_strings (void); |
20495 | 329 |
330 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
|
331 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
332 /* 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
|
333 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
|
334 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
|
335 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
336 enum mem_type |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
337 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
338 MEM_TYPE_NON_LISP, |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
339 MEM_TYPE_BUFFER, |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
340 MEM_TYPE_CONS, |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
341 MEM_TYPE_STRING, |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
342 MEM_TYPE_MISC, |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
343 MEM_TYPE_SYMBOL, |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
344 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
|
345 /* 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
|
346 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
|
347 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
|
348 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
|
349 MEM_TYPE_VECTORLIKE |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
350 }; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
351 |
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
|
352 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
|
353 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
|
354 |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
355 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
356 #if GC_MARK_STACK || defined GC_MALLOC_CHECK |
27746
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
357 |
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
358 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES |
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
359 #include <stdio.h> /* For fprintf. */ |
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
360 #endif |
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
361 |
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
362 /* 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
|
363 on free lists recognizable in O(1). */ |
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
364 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
365 static Lisp_Object Vdead; |
27746
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
366 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
367 #ifdef GC_MALLOC_CHECK |
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 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
|
370 static int dont_register_blocks; |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
371 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
372 #endif /* GC_MALLOC_CHECK */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
373 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
374 /* 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
|
375 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
|
376 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
|
377 is freed. |
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 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
|
380 properties: |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
381 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
382 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
|
383 2. Every leaf is black. |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
384 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
|
385 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
|
386 the same number of black nodes. |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
387 5. The root is always black. |
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 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
|
390 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
|
391 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
392 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
|
393 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
|
394 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
|
395 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
|
396 describe them. */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
397 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
398 struct mem_node |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
399 { |
48907 | 400 /* Children of this node. These pointers are never NULL. When there |
401 is no child, the value is MEM_NIL, which points to a dummy node. */ | |
402 struct mem_node *left, *right; | |
403 | |
404 /* The parent of this node. In the root node, this is NULL. */ | |
405 struct mem_node *parent; | |
32692
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 /* Start and end of allocated region. */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
408 void *start, *end; |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
409 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
410 /* Node color. */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
411 enum {MEM_BLACK, MEM_RED} color; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
412 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
413 /* Memory type. */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
414 enum mem_type type; |
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 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
417 /* Base address of stack. Set in main. */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
418 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
419 Lisp_Object *stack_base; |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
420 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
421 /* 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
|
422 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
423 static struct mem_node *mem_root; |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
424 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
425 /* Lowest and highest known address in the heap. */ |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
426 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
427 static void *min_heap_address, *max_heap_address; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
428 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
429 /* Sentinel node of the tree. */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
430 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
431 static struct mem_node mem_z; |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
432 #define MEM_NIL &mem_z |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
433 |
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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 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
|
439 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
|
440 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
|
441 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
|
442 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
|
443 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
|
444 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
|
445 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
|
446 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
|
447 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
|
448 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
|
449 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
|
450 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
|
451 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
|
452 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
|
453 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
|
454 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
455 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
456 #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
|
457 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
|
458 #endif |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
459 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
460 #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
|
461 |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
462 /* Recording what needs to be marked for gc. */ |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
463 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
464 struct gcpro *gcprolist; |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
465 |
51908
cb3976b5e59f
(pure, staticvec): Initialize these arrays to nonzero, so that they're
Paul Eggert <eggert@twinsun.com>
parents:
51907
diff
changeset
|
466 /* 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
|
467 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
|
468 |
97230 | 469 #define NSTATICS 0x640 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
470 static Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag}; |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
471 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
472 /* Index of next unused slot in staticvec. */ |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
473 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
474 static int staticidx = 0; |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
475 |
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
|
476 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
|
477 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
478 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
479 /* 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
|
480 ALIGNMENT must be a power of 2. */ |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
481 |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
482 #define ALIGN(ptr, ALIGNMENT) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
483 ((POINTER_TYPE *) ((((EMACS_UINT)(ptr)) + (ALIGNMENT) - 1) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
484 & ~((ALIGNMENT) - 1))) |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
485 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
486 |
300 | 487 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
488 /************************************************************************ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
489 Malloc |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
490 ************************************************************************/ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
491 |
47185
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
492 /* 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
|
493 |
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
494 void |
109313
e856a274549b
Constify functions taking char *
Andreas Schwab <schwab@linux-m68k.org>
parents:
109302
diff
changeset
|
495 malloc_warning (const char *str) |
300 | 496 { |
497 pending_malloc_warning = str; | |
498 } | |
499 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
500 |
47185
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
501 /* 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
|
502 |
20375
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
503 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
504 display_malloc_warning (void) |
300 | 505 { |
47185
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
506 call3 (intern ("display-warning"), |
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
507 intern ("alloc"), |
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
508 build_string (pending_malloc_warning), |
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
509 intern ("emergency")); |
300 | 510 pending_malloc_warning = 0; |
511 } | |
512 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
513 |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
514 #ifdef DOUG_LEA_MALLOC |
66547
9373f926904a
(BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents:
66541
diff
changeset
|
515 # 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
|
516 #else |
17831
9238a2254a23
(BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents:
17348
diff
changeset
|
517 # 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
|
518 #endif |
65832
5159ee08b219
(refill_memory_reserve): Conditionalize the body, not the function's existence.
Richard M. Stallman <rms@gnu.org>
parents:
65764
diff
changeset
|
519 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
520 /* 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
|
521 |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
522 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
523 buffer_memory_full (void) |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
524 { |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
525 /* 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
|
526 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
|
527 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
|
528 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
|
529 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
|
530 malloc. */ |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
531 |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
532 #ifndef REL_ALLOC |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
533 memory_full (); |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
534 #endif |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
535 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
536 /* 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
|
537 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
|
538 xsignal (Qnil, Vmemory_signal_data); |
300 | 539 } |
540 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
541 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
542 #ifdef XMALLOC_OVERRUN_CHECK |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
543 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
544 /* 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
|
545 and a 16 byte trailer around each block. |
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 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
|
548 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
|
549 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
550 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
|
551 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
|
552 functions may bypass the malloc hooks. |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
553 */ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
554 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
555 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
556 #define XMALLOC_OVERRUN_CHECK_SIZE 16 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
557 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
558 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
|
559 { 0x9a, 0x9b, 0xae, 0xaf, |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
560 0xbf, 0xbe, 0xce, 0xcf, |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
561 0xea, 0xeb, 0xec, 0xed }; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
562 |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
563 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
|
564 { 0xaa, 0xab, 0xac, 0xad, |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
565 0xba, 0xbb, 0xbc, 0xbd, |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
566 0xca, 0xcb, 0xcc, 0xcd, |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
567 0xda, 0xdb, 0xdc, 0xdd }; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
568 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
569 /* 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
|
570 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
571 #define XMALLOC_PUT_SIZE(ptr, size) \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
572 (ptr[-1] = (size & 0xff), \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
573 ptr[-2] = ((size >> 8) & 0xff), \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
574 ptr[-3] = ((size >> 16) & 0xff), \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
575 ptr[-4] = ((size >> 24) & 0xff)) |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
576 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
577 #define XMALLOC_GET_SIZE(ptr) \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
578 (size_t)((unsigned)(ptr[-1]) | \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
579 ((unsigned)(ptr[-2]) << 8) | \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
580 ((unsigned)(ptr[-3]) << 16) | \ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
581 ((unsigned)(ptr[-4]) << 24)) |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
582 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
583 |
59083
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
584 /* 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
|
585 xmalloc() |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
586 overrun_check_malloc() |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
587 -> malloc -> (via hook)_-> emacs_blocked_malloc |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
588 -> overrun_check_malloc |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
589 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
|
590 malloc returns 10000. |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
591 add overhead, return 10016. |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
592 <- (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
|
593 add overhead again, return 10032 |
59083
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
594 xmalloc returns 10032. |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
595 |
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
596 (time passes). |
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
597 |
59083
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
598 xfree(10032) |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
599 overrun_check_free(10032) |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
600 decrease overhed |
4295cf593352
Update comment for check_depth.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
601 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
|
602 |
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
603 static int check_depth; |
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
604 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
605 /* 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
|
606 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
607 POINTER_TYPE * |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
608 overrun_check_malloc (size) |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
609 size_t size; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
610 { |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
611 register unsigned char *val; |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
612 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
|
613 |
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
614 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
|
615 if (val && check_depth == 1) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
616 { |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
617 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
|
618 XMALLOC_OVERRUN_CHECK_SIZE - 4); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
619 val += XMALLOC_OVERRUN_CHECK_SIZE; |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
620 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
|
621 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
|
622 XMALLOC_OVERRUN_CHECK_SIZE); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
623 } |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
624 --check_depth; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
625 return (POINTER_TYPE *)val; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
626 } |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
627 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
628 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
629 /* 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
|
630 with header and trailer. */ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
631 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
632 POINTER_TYPE * |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
633 overrun_check_realloc (block, size) |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
634 POINTER_TYPE *block; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
635 size_t size; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
636 { |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
637 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
|
638 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
|
639 |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
640 if (val |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
641 && check_depth == 1 |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
642 && 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
|
643 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
|
644 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
645 { |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
646 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
|
647 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
|
648 XMALLOC_OVERRUN_CHECK_SIZE)) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
649 abort (); |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
650 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
|
651 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
|
652 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
|
653 } |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
654 |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
655 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
|
656 |
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
657 if (val && check_depth == 1) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
658 { |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
659 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
|
660 XMALLOC_OVERRUN_CHECK_SIZE - 4); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
661 val += XMALLOC_OVERRUN_CHECK_SIZE; |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
662 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
|
663 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
|
664 XMALLOC_OVERRUN_CHECK_SIZE); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
665 } |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
666 --check_depth; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
667 return (POINTER_TYPE *)val; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
668 } |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
669 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
670 /* Like free, but checks block for overrun. */ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
671 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
672 void |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
673 overrun_check_free (block) |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
674 POINTER_TYPE *block; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
675 { |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
676 unsigned char *val = (unsigned char *)block; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
677 |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
678 ++check_depth; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
679 if (val |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
680 && check_depth == 1 |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
681 && 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
|
682 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
|
683 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
684 { |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
685 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
|
686 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
|
687 XMALLOC_OVERRUN_CHECK_SIZE)) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
688 abort (); |
59400
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
689 #ifdef XMALLOC_CLEAR_FREE_MEMORY |
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
690 val -= XMALLOC_OVERRUN_CHECK_SIZE; |
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
691 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
|
692 #else |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
693 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
|
694 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
|
695 memset (val, 0, XMALLOC_OVERRUN_CHECK_SIZE); |
59400
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
696 #endif |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
697 } |
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 free (val); |
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Djärv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
700 --check_depth; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
701 } |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
702 |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
703 #undef malloc |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
704 #undef realloc |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
705 #undef free |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
706 #define malloc overrun_check_malloc |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
707 #define realloc overrun_check_realloc |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
708 #define free overrun_check_free |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
709 #endif |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
710 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
711 #ifdef SYNC_INPUT |
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
712 /* 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
|
713 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
|
714 #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
|
715 #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
|
716 #else |
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
717 #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
|
718 #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
|
719 #endif |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
720 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
721 /* 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
|
722 |
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
723 POINTER_TYPE * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
724 xmalloc (size_t size) |
300 | 725 { |
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
726 register POINTER_TYPE *val; |
300 | 727 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
728 MALLOC_BLOCK_INPUT; |
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
729 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
|
730 MALLOC_UNBLOCK_INPUT; |
300 | 731 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
732 if (!val && size) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
733 memory_full (); |
300 | 734 return val; |
735 } | |
736 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
737 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
738 /* 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
|
739 |
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
740 POINTER_TYPE * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
741 xrealloc (POINTER_TYPE *block, size_t size) |
300 | 742 { |
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
743 register POINTER_TYPE *val; |
300 | 744 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
745 MALLOC_BLOCK_INPUT; |
590 | 746 /* We must call malloc explicitly when BLOCK is 0, since some |
747 reallocs don't do this. */ | |
748 if (! block) | |
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
749 val = (POINTER_TYPE *) malloc (size); |
600
a8d78999e46d
*** empty log message ***
Noah Friedman <friedman@splode.com>
parents:
590
diff
changeset
|
750 else |
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
751 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
|
752 MALLOC_UNBLOCK_INPUT; |
300 | 753 |
754 if (!val && size) memory_full (); | |
755 return val; | |
756 } | |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
757 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
758 |
52276
5623f26dff58
(lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents:
52256
diff
changeset
|
759 /* 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
|
760 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
761 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
762 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
|
763 { |
95481
4390d64d3328
Make "xfree (NULL)" a no-op; remove useless if-before-xfree.
Jim Meyering <jim@meyering.net>
parents:
94993
diff
changeset
|
764 if (!block) |
4390d64d3328
Make "xfree (NULL)" a no-op; remove useless if-before-xfree.
Jim Meyering <jim@meyering.net>
parents:
94993
diff
changeset
|
765 return; |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
766 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
|
767 free (block); |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
768 MALLOC_UNBLOCK_INPUT; |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
769 /* 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
|
770 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
|
771 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
|
772 } |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
773 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
774 |
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
775 /* Like strdup, but uses xmalloc. */ |
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
776 |
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
777 char * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
778 xstrdup (const char *s) |
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
779 { |
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
780 size_t len = strlen (s) + 1; |
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
781 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
|
782 memcpy (p, s, len); |
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
783 return p; |
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
784 } |
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
785 |
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
786 |
56187
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
787 /* Unwind for SAFE_ALLOCA */ |
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
788 |
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
789 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
790 safe_alloca_unwind (Lisp_Object arg) |
56187
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
791 { |
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
792 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
|
793 |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
794 p->dogc = 0; |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
795 xfree (p->pointer); |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
796 p->pointer = 0; |
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
797 free_misc (arg); |
56187
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
798 return Qnil; |
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
799 } |
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
800 |
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
801 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
802 /* 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
|
803 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
|
804 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
|
805 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
806 #ifndef USE_LSB_TAG |
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
807 static void *lisp_malloc_loser; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
808 #endif |
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
809 |
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
810 static POINTER_TYPE * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
811 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
|
812 { |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
813 register void *val; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
814 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
815 MALLOC_BLOCK_INPUT; |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
816 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
817 #ifdef GC_MALLOC_CHECK |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
818 allocated_mem_type = type; |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
819 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
820 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
821 val = (void *) malloc (nbytes); |
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
822 |
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
823 #ifndef USE_LSB_TAG |
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
824 /* 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
|
825 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
|
826 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
|
827 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
|
828 { |
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
829 Lisp_Object tem; |
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
830 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
|
831 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
|
832 { |
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
833 lisp_malloc_loser = val; |
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
834 free (val); |
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
835 val = 0; |
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
836 } |
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
837 } |
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
838 #endif |
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
839 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
840 #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
|
841 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
|
842 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
|
843 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
844 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
845 MALLOC_UNBLOCK_INPUT; |
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
846 if (!val && nbytes) |
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
847 memory_full (); |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
848 return val; |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
849 } |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
850 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
851 /* 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
|
852 call to lisp_malloc. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
853 |
30784
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
854 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
855 lisp_free (POINTER_TYPE *block) |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
856 { |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
857 MALLOC_BLOCK_INPUT; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
858 free (block); |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
859 #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
|
860 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
|
861 #endif |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
862 MALLOC_UNBLOCK_INPUT; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
863 } |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
864 |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
865 /* 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
|
866 /* 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
|
867 /* 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
|
868 |
69348
2c8e608f28e7
(USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
68974
diff
changeset
|
869 /* 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
|
870 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
|
871 its memalloc could be used). */ |
69355
a685fca1ccb6
(USE_POSIX_MEMALIGN): Fix last change.
Kim F. Storm <storm@cua.dk>
parents:
69348
diff
changeset
|
872 #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
|
873 #define USE_POSIX_MEMALIGN 1 |
a685fca1ccb6
(USE_POSIX_MEMALIGN): Fix last change.
Kim F. Storm <storm@cua.dk>
parents:
69348
diff
changeset
|
874 #endif |
51723
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 /* 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
|
877 #define BLOCK_ALIGN (1 << 10) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
878 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
879 /* 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
|
880 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
|
881 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
|
882 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
|
883 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
|
884 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
|
885 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
|
886 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
|
887 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
|
888 nothing else. */ |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
889 #define BLOCK_PADDING 0 |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
890 #define BLOCK_BYTES \ |
60143
84ff5b7a4139
(BLOCK_BYTES): Harmless typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59657
diff
changeset
|
891 (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
|
892 |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
893 /* Internal data structures and constants. */ |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
894 |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
895 #define ABLOCKS_SIZE 16 |
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 /* An aligned block of memory. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
898 struct ablock |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
899 { |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
900 union |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
901 { |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
902 char payload[BLOCK_BYTES]; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
903 struct ablock *next_free; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
904 } x; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
905 /* `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
|
906 /* 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
|
907 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
|
908 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
|
909 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
|
910 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
|
911 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
|
912 (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
|
913 real base). */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
914 struct ablocks *abase; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
915 /* 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
|
916 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
|
917 #if BLOCK_PADDING |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
918 char padding[BLOCK_PADDING]; |
51758
ff38ea4b40ed
(struct ablock): Only include padding when there is some.
Jason Rumney <jasonr@gnu.org>
parents:
51723
diff
changeset
|
919 #endif |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
920 }; |
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 /* A bunch of consecutive aligned blocks. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
923 struct ablocks |
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 struct ablock blocks[ABLOCKS_SIZE]; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
926 }; |
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 /* 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
|
929 #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
|
930 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
931 #define ABLOCK_ABASE(block) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
932 (((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
|
933 ? (struct ablocks *)(block) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
934 : (block)->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 /* Virtual `busy' field. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
937 #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
|
938 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
939 /* 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
|
940 #ifdef USE_POSIX_MEMALIGN |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
941 #define ABLOCKS_BASE(abase) (abase) |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
942 #else |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
943 #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
|
944 (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
|
945 #endif |
51723
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 /* The list of free ablock. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
948 static struct ablock *free_ablock; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
949 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
950 /* Allocate an aligned block of nbytes. |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
951 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
|
952 smaller or equal to BLOCK_BYTES. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
953 static POINTER_TYPE * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
954 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
|
955 { |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
956 void *base, *val; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
957 struct ablocks *abase; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
958 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
959 eassert (nbytes <= BLOCK_BYTES); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
960 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
961 MALLOC_BLOCK_INPUT; |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
962 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
963 #ifdef GC_MALLOC_CHECK |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
964 allocated_mem_type = type; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
965 #endif |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
966 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
967 if (!free_ablock) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
968 { |
52276
5623f26dff58
(lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents:
52256
diff
changeset
|
969 int i; |
5623f26dff58
(lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents:
52256
diff
changeset
|
970 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
|
971 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
972 #ifdef DOUG_LEA_MALLOC |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
973 /* 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
|
974 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
|
975 a dumped Emacs. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
976 mallopt (M_MMAP_MAX, 0); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
977 #endif |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
978 |
69348
2c8e608f28e7
(USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
68974
diff
changeset
|
979 #ifdef USE_POSIX_MEMALIGN |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
980 { |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
981 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
|
982 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
|
983 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
|
984 abase = base; |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
985 } |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
986 #else |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
987 base = malloc (ABLOCKS_BYTES); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
988 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
|
989 #endif |
a05a653f63af
(lisp_align_malloc): Check for base == 0 regardless of HAVE_POSIX_MEMALIGN.
Richard M. Stallman <rms@gnu.org>
parents:
55816
diff
changeset
|
990 |
52837
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
991 if (base == 0) |
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
992 { |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
993 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
|
994 memory_full (); |
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
995 } |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
996 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
997 aligned = (base == abase); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
998 if (!aligned) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
999 ((void**)abase)[-1] = base; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1000 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1001 #ifdef DOUG_LEA_MALLOC |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1002 /* 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
|
1003 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1004 #endif |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1005 |
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
1006 #ifndef USE_LSB_TAG |
52256
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1007 /* 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
|
1008 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
|
1009 running out of memory. */ |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1010 if (type != MEM_TYPE_NON_LISP) |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1011 { |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1012 Lisp_Object tem; |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1013 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
|
1014 XSETCONS (tem, end); |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1015 if ((char *) XCONS (tem) != end) |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1016 { |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1017 lisp_malloc_loser = base; |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1018 free (base); |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1019 MALLOC_UNBLOCK_INPUT; |
52256
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1020 memory_full (); |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1021 } |
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1022 } |
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
1023 #endif |
52256
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1024 |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1025 /* 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
|
1026 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
|
1027 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
|
1028 { |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1029 abase->blocks[i].abase = abase; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1030 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
|
1031 free_ablock = &abase->blocks[i]; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1032 } |
52453
62fcd311bb98
Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1033 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
|
1034 |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1035 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
|
1036 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
|
1037 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1038 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
|
1039 eassert (aligned == (long) ABLOCKS_BUSY (abase)); |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1040 } |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1041 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1042 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
|
1043 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
|
1044 val = free_ablock; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1045 free_ablock = free_ablock->x.next_free; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1046 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1047 #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
|
1048 if (val && type != MEM_TYPE_NON_LISP) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1049 mem_insert (val, (char *) val + nbytes, type); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1050 #endif |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1051 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1052 MALLOC_UNBLOCK_INPUT; |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1053 if (!val && nbytes) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1054 memory_full (); |
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 eassert (0 == ((EMACS_UINT)val) % BLOCK_ALIGN); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1057 return val; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1058 } |
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 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1061 lisp_align_free (POINTER_TYPE *block) |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1062 { |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1063 struct ablock *ablock = block; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1064 struct ablocks *abase = ABLOCK_ABASE (ablock); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1065 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1066 MALLOC_BLOCK_INPUT; |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1067 #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
|
1068 mem_delete (mem_find (block)); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1069 #endif |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1070 /* Put on free list. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1071 ablock->x.next_free = free_ablock; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1072 free_ablock = ablock; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1073 /* Update busy count. */ |
52453
62fcd311bb98
Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1074 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
|
1075 |
52453
62fcd311bb98
Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1076 if (2 > (long) ABLOCKS_BUSY (abase)) |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1077 { /* 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
|
1078 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
|
1079 struct ablock **tem = &free_ablock; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1080 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
|
1081 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1082 while (*tem) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1083 { |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1084 if (*tem >= (struct ablock *) abase && *tem < atop) |
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 i++; |
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 else |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1090 tem = &(*tem)->x.next_free; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1091 } |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1092 eassert ((aligned & 1) == aligned); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1093 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
|
1094 #ifdef USE_POSIX_MEMALIGN |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
1095 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
|
1096 #endif |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1097 free (ABLOCKS_BASE (abase)); |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1098 } |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1099 MALLOC_UNBLOCK_INPUT; |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1100 } |
51683
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 /* 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
|
1103 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
|
1104 |
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1105 struct buffer * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1106 allocate_buffer (void) |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1107 { |
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1108 struct buffer *b |
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1109 = (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
|
1110 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
|
1111 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
|
1112 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
|
1113 return b; |
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1114 } |
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
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 |
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1117 #ifndef SYSTEM_MALLOC |
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1118 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1119 /* 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
|
1120 |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1121 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
|
1122 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
|
1123 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
|
1124 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
|
1125 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
|
1126 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
|
1127 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
|
1128 |
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1129 #ifndef SYNC_INPUT |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1130 /* 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
|
1131 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
|
1132 |
30914
6362b1fc09f2
(lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
30823
diff
changeset
|
1133 #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
|
1134 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
|
1135 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
|
1136 extern void (*__free_hook) (void *, const void *); |
30914
6362b1fc09f2
(lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
30823
diff
changeset
|
1137 /* 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
|
1138 #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
|
1139 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
|
1140 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
|
1141 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
|
1142 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1143 /* 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
|
1144 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1145 static void |
109480
d12162869c07
Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents:
109320
diff
changeset
|
1146 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
|
1147 { |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1148 BLOCK_INPUT_ALLOC; |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1149 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1150 #ifdef GC_MALLOC_CHECK |
32776
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1151 if (ptr) |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1152 { |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1153 struct mem_node *m; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1154 |
32776
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1155 m = mem_find (ptr); |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1156 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
|
1157 { |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1158 fprintf (stderr, |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1159 "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
|
1160 abort (); |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1161 } |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1162 else |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1163 { |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1164 /* 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
|
1165 mem_delete (m); |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1166 } |
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1167 } |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1168 #endif /* GC_MALLOC_CHECK */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1169 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1170 __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
|
1171 free (ptr); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1172 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1173 /* 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
|
1174 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
|
1175 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
|
1176 if (! NILP (Vmemory_full) |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1177 /* 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
|
1178 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
|
1179 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
|
1180 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
|
1181 && (bytes_used_when_full |
66547
9373f926904a
(BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents:
66541
diff
changeset
|
1182 > ((bytes_used_when_reconsidered = BYTES_USED) |
66541
60d77f0435af
* alloc.c (emacs_blocked_free): Fix typo.
Chong Yidong <cyd@stupidchicken.com>
parents:
66530
diff
changeset
|
1183 + 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
|
1184 refill_memory_reserve (); |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1185 |
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
1186 __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
|
1187 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
|
1188 } |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1189 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1190 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1191 /* 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
|
1192 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1193 static void * |
109480
d12162869c07
Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents:
109320
diff
changeset
|
1194 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
|
1195 { |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1196 void *value; |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1197 |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1198 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
|
1199 __malloc_hook = old_malloc_hook; |
17831
9238a2254a23
(BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents:
17348
diff
changeset
|
1200 #ifdef DOUG_LEA_MALLOC |
83543
6b25ef5cc276
Fix obvious runtime errors after merge.
Karoly Lorentey <lorentey@elte.hu>
parents:
83541
diff
changeset
|
1201 /* Segfaults on my system. --lorentey */ |
6b25ef5cc276
Fix obvious runtime errors after merge.
Karoly Lorentey <lorentey@elte.hu>
parents:
83541
diff
changeset
|
1202 /* 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
|
1203 #else |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
1204 __malloc_extra_blocks = malloc_hysteresis; |
17831
9238a2254a23
(BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents:
17348
diff
changeset
|
1205 #endif |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1206 |
3581
152fd924c7bb
* alloc.c (emacs_blocked_malloc, emacs_blocked_realloc): Cast the
Jim Blandy <jimb@redhat.com>
parents:
3536
diff
changeset
|
1207 value = (void *) malloc (size); |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1208 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1209 #ifdef GC_MALLOC_CHECK |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1210 { |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1211 struct mem_node *m = mem_find (value); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1212 if (m != MEM_NIL) |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1213 { |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1214 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
|
1215 value); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1216 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
|
1217 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
|
1218 m->type); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1219 abort (); |
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 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1222 if (!dont_register_blocks) |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1223 { |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1224 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
|
1225 allocated_mem_type = MEM_TYPE_NON_LISP; |
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 } |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1228 #endif /* GC_MALLOC_CHECK */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1229 |
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
1230 __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
|
1231 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
|
1232 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1233 /* 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
|
1234 return value; |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1235 } |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1236 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1237 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1238 /* 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
|
1239 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1240 static void * |
109480
d12162869c07
Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents:
109320
diff
changeset
|
1241 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
|
1242 { |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1243 void *value; |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1244 |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1245 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
|
1246 __realloc_hook = old_realloc_hook; |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1247 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1248 #ifdef GC_MALLOC_CHECK |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1249 if (ptr) |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1250 { |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1251 struct mem_node *m = mem_find (ptr); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1252 if (m == MEM_NIL || m->start != ptr) |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1253 { |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1254 fprintf (stderr, |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1255 "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
|
1256 ptr); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1257 abort (); |
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 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1260 mem_delete (m); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1261 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1262 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1263 /* fprintf (stderr, "%p -> realloc\n", ptr); */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1264 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1265 /* Prevent malloc from registering blocks. */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1266 dont_register_blocks = 1; |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1267 #endif /* GC_MALLOC_CHECK */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1268 |
3581
152fd924c7bb
* alloc.c (emacs_blocked_malloc, emacs_blocked_realloc): Cast the
Jim Blandy <jimb@redhat.com>
parents:
3536
diff
changeset
|
1269 value = (void *) realloc (ptr, size); |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1270 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1271 #ifdef GC_MALLOC_CHECK |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1272 dont_register_blocks = 0; |
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 { |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1275 struct mem_node *m = mem_find (value); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1276 if (m != MEM_NIL) |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1277 { |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1278 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
|
1279 abort (); |
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 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1282 /* 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
|
1283 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
|
1284 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1285 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1286 /* fprintf (stderr, "%p <- realloc\n", value); */ |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1287 #endif /* GC_MALLOC_CHECK */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1288 |
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
1289 __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
|
1290 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
|
1291 |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1292 return value; |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1293 } |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1294 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1295 |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1296 #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
|
1297 /* 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
|
1298 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
|
1299 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
|
1300 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
|
1301 |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1302 void |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1303 reset_malloc_hooks () |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1304 { |
78811
6ebdc9c66c94
(reset_malloc_hooks): Set the hooks to the previous
Andreas Schwab <schwab@suse.de>
parents:
78593
diff
changeset
|
1305 __free_hook = old_free_hook; |
6ebdc9c66c94
(reset_malloc_hooks): Set the hooks to the previous
Andreas Schwab <schwab@suse.de>
parents:
78593
diff
changeset
|
1306 __malloc_hook = old_malloc_hook; |
6ebdc9c66c94
(reset_malloc_hooks): Set the hooks to the previous
Andreas Schwab <schwab@suse.de>
parents:
78593
diff
changeset
|
1307 __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
|
1308 } |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1309 #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
|
1310 |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1311 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1312 /* 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
|
1313 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1314 void |
109480
d12162869c07
Convert some more functions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents:
109320
diff
changeset
|
1315 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
|
1316 { |
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1317 #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
|
1318 #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
|
1319 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
|
1320 |
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1321 /* 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
|
1322 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
|
1323 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
|
1324 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
|
1325 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
|
1326 #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
|
1327 /* 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
|
1328 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
|
1329 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
|
1330 #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
|
1331 #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
|
1332 |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1333 if (__free_hook != emacs_blocked_free) |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1334 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
|
1335 __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
|
1336 |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1337 if (__malloc_hook != emacs_blocked_malloc) |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1338 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
|
1339 __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
|
1340 |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1341 if (__realloc_hook != emacs_blocked_realloc) |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1342 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
|
1343 __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
|
1344 } |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1345 |
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1346 #endif /* not SYNC_INPUT */ |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1347 #endif /* not SYSTEM_MALLOC */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1348 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1349 |
300 | 1350 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1351 /*********************************************************************** |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1352 Interval Allocation |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1353 ***********************************************************************/ |
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
1354 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1355 /* 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
|
1356 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
|
1357 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1358 #define INTERVAL_BLOCK_SIZE \ |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1359 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval)) |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1360 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1361 /* 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
|
1362 structure. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1363 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1364 struct interval_block |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1365 { |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1366 /* Place `intervals' first, to preserve alignment. */ |
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1367 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
|
1368 struct interval_block *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1369 }; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1370 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1371 /* 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
|
1372 blocks. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1373 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
1374 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
|
1375 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1376 /* 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
|
1377 structure. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1378 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1379 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
|
1380 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1381 /* 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
|
1382 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1383 static int total_free_intervals, total_intervals; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1384 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1385 /* List of free intervals. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1386 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1387 INTERVAL interval_free_list; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1388 |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1389 /* 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
|
1390 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
1391 static int n_interval_blocks; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1392 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1393 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1394 /* Initialize interval allocation. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1395 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1396 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1397 init_intervals (void) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1398 { |
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
1399 interval_block = NULL; |
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
1400 interval_block_index = INTERVAL_BLOCK_SIZE; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1401 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
|
1402 n_interval_blocks = 0; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1403 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1404 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1405 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1406 /* Return a new interval. */ |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1407 |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1408 INTERVAL |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1409 make_interval (void) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1410 { |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1411 INTERVAL val; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1412 |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1413 /* eassert (!handling_signal); */ |
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1414 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1415 MALLOC_BLOCK_INPUT; |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
1416 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1417 if (interval_free_list) |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1418 { |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1419 val = interval_free_list; |
28269
fd13be8ae190
Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents:
28220
diff
changeset
|
1420 interval_free_list = INTERVAL_PARENT (interval_free_list); |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1421 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1422 else |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1423 { |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1424 if (interval_block_index == INTERVAL_BLOCK_SIZE) |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1425 { |
12529 | 1426 register struct interval_block *newi; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1427 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1428 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
|
1429 MEM_TYPE_NON_LISP); |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1430 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1431 newi->next = interval_block; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1432 interval_block = newi; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1433 interval_block_index = 0; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1434 n_interval_blocks++; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1435 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1436 val = &interval_block->intervals[interval_block_index++]; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1437 } |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1438 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1439 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1440 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1441 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
|
1442 intervals_consed++; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1443 RESET_INTERVAL (val); |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1444 val->gcmarkbit = 0; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1445 return val; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1446 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1447 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1448 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1449 /* Mark Lisp objects in interval I. */ |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1450 |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1451 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1452 mark_interval (register INTERVAL i, Lisp_Object dummy) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1453 { |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1454 eassert (!i->gcmarkbit); /* Intervals are never shared. */ |
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1455 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
|
1456 mark_object (i->plist); |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1457 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1458 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1459 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1460 /* 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
|
1461 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
|
1462 |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1463 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1464 mark_interval_tree (register INTERVAL tree) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1465 { |
4139
0b32ee899a3a
Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents:
4087
diff
changeset
|
1466 /* 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
|
1467 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
|
1468 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
|
1469 |
39859
36068b62b4c1
(mark_interval_tree): Use traverse_intervals_noorder.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
1470 traverse_intervals_noorder (tree, mark_interval, Qnil); |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1471 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1472 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1473 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1474 /* 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
|
1475 |
4139
0b32ee899a3a
Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents:
4087
diff
changeset
|
1476 #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
|
1477 do { \ |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1478 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
|
1479 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
|
1480 } while (0) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1481 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1482 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1483 #define UNMARK_BALANCE_INTERVALS(i) \ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1484 do { \ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1485 if (! NULL_INTERVAL_P (i)) \ |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1486 (i) = balance_intervals (i); \ |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1487 } while (0) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1488 |
28469
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1489 |
96602 | 1490 /* 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
|
1491 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
|
1492 #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
|
1493 Lisp_Object |
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1494 make_number (n) |
60896
25e4a0f171b5
(make_number): The arg can be bigger than `int'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
60143
diff
changeset
|
1495 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
|
1496 { |
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1497 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
|
1498 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
|
1499 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
|
1500 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
|
1501 } |
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1502 #endif |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1503 |
27142
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 String Allocation |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1506 ***********************************************************************/ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1507 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1508 /* 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
|
1509 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
|
1510 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
|
1511 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
|
1512 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
|
1513 we keep. |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1514 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1515 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
|
1516 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
|
1517 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
|
1518 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1519 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
|
1520 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
|
1521 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
|
1522 its sdata structure. |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1523 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1524 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
|
1525 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
|
1526 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
|
1527 `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
|
1528 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
|
1529 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
|
1530 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1531 /* 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
|
1532 is 8192 minus malloc overhead. */ |
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 #define SBLOCK_SIZE 8188 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1535 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1536 /* 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
|
1537 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
|
1538 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1539 #define LARGE_STRING_BYTES 1024 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1540 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1541 /* 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
|
1542 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
|
1543 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1544 struct sdata |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1545 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1546 /* 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
|
1547 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
|
1548 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
|
1549 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
|
1550 (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
|
1551 contents. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1552 struct Lisp_String *string; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1553 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1554 #ifdef GC_CHECK_STRING_BYTES |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1555 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1556 EMACS_INT nbytes; |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1557 unsigned char data[1]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1558 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1559 #define SDATA_NBYTES(S) (S)->nbytes |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1560 #define SDATA_DATA(S) (S)->data |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1561 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1562 #else /* not GC_CHECK_STRING_BYTES */ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1563 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1564 union |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1565 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1566 /* When STRING in non-null. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1567 unsigned char data[1]; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1568 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1569 /* When STRING is null. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1570 EMACS_INT nbytes; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1571 } u; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1572 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1573 |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1574 #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
|
1575 #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
|
1576 |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1577 #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
|
1578 }; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1579 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1580 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1581 /* 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
|
1582 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
|
1583 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
|
1584 as large as needed. */ |
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 struct sblock |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1587 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1588 /* Next in list. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1589 struct sblock *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1590 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1591 /* 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
|
1592 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
|
1593 struct sdata *next_free; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1594 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1595 /* Start of data. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1596 struct sdata first_data; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1597 }; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1598 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1599 /* 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
|
1600 1024 minus malloc overhead. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1601 |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1602 #define STRING_BLOCK_SIZE \ |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1603 ((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
|
1604 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1605 /* 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
|
1606 are allocated. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1607 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1608 struct string_block |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1609 { |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1610 /* Place `strings' first, to preserve alignment. */ |
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1611 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
|
1612 struct string_block *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1613 }; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1614 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1615 /* 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
|
1616 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
|
1617 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
|
1618 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1619 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
|
1620 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1621 /* List of sblocks for large strings. */ |
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 static struct sblock *large_sblocks; |
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 /* 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
|
1626 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1627 static struct string_block *string_blocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1628 static int n_string_blocks; |
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 /* Free-list of Lisp_Strings. */ |
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 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
|
1633 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1634 /* 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
|
1635 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1636 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
|
1637 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1638 /* 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
|
1639 |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
1640 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
|
1641 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1642 /* 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
|
1643 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
|
1644 free-list. */ |
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 #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
|
1647 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1648 /* 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
|
1649 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
|
1650 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
|
1651 structure starts at a constant offset in front of that. */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1652 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1653 #ifdef GC_CHECK_STRING_BYTES |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1654 |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1655 #define SDATA_OF_STRING(S) \ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1656 ((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
|
1657 - sizeof (EMACS_INT))) |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1658 |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1659 #else /* not GC_CHECK_STRING_BYTES */ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1660 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1661 #define SDATA_OF_STRING(S) \ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1662 ((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
|
1663 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1664 #endif /* not GC_CHECK_STRING_BYTES */ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1665 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1666 |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1667 #ifdef GC_CHECK_STRING_OVERRUN |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1668 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1669 /* 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
|
1670 "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
|
1671 presence of this cookie during GC. */ |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1672 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1673 #define GC_STRING_OVERRUN_COOKIE_SIZE 4 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1674 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
|
1675 { 0xde, 0xad, 0xbe, 0xef }; |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1676 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1677 #else |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1678 #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
|
1679 #endif |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1680 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1681 /* 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
|
1682 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
|
1683 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
|
1684 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1685 #ifdef GC_CHECK_STRING_BYTES |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1686 |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1687 #define SDATA_SIZE(NBYTES) \ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1688 ((sizeof (struct Lisp_String *) \ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1689 + (NBYTES) + 1 \ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1690 + sizeof (EMACS_INT) \ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1691 + sizeof (EMACS_INT) - 1) \ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1692 & ~(sizeof (EMACS_INT) - 1)) |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1693 |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1694 #else /* not GC_CHECK_STRING_BYTES */ |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1695 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1696 #define SDATA_SIZE(NBYTES) \ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1697 ((sizeof (struct Lisp_String *) \ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1698 + (NBYTES) + 1 \ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1699 + sizeof (EMACS_INT) - 1) \ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1700 & ~(sizeof (EMACS_INT) - 1)) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1701 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1702 #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
|
1703 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1704 /* Extra bytes to allocate for each string. */ |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1705 |
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1706 #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
|
1707 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1708 /* 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
|
1709 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
1710 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1711 init_strings (void) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1712 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1713 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
|
1714 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
|
1715 string_blocks = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1716 n_string_blocks = 0; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1717 string_free_list = NULL; |
81272
1842d7137ff2
(init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
77260
diff
changeset
|
1718 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
|
1719 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
|
1720 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1721 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1722 |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1723 #ifdef GC_CHECK_STRING_BYTES |
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1724 |
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1725 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
|
1726 |
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
|
1727 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
|
1728 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
|
1729 |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1730 #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
|
1731 |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1732 |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1733 /* 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
|
1734 |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
1735 EMACS_INT |
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
1736 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
|
1737 { |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
1738 EMACS_INT nbytes = |
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
1739 (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
|
1740 |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1741 if (!PURE_POINTER_P (s) |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1742 && s->data |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1743 && 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
|
1744 abort (); |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1745 return nbytes; |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1746 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1747 |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
1748 /* 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
|
1749 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
1750 static void |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1751 check_sblock (b) |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1752 struct sblock *b; |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1753 { |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1754 struct sdata *from, *end, *from_end; |
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 end = b->next_free; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1757 |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1758 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
|
1759 { |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1760 /* 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
|
1761 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
|
1762 EMACS_INT nbytes; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1763 |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1764 /* 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
|
1765 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
|
1766 if (from->string) |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1767 CHECK_STRING_BYTES (from->string); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1768 |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1769 if (from->string) |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1770 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
|
1771 else |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1772 nbytes = SDATA_NBYTES (from); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1773 |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1774 nbytes = SDATA_SIZE (nbytes); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1775 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
|
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 |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1779 |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1780 /* 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
|
1781 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
|
1782 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
|
1783 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
1784 static void |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1785 check_string_bytes (all_p) |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1786 int all_p; |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1787 { |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1788 if (all_p) |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1789 { |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1790 struct sblock *b; |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1791 |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1792 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
|
1793 { |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1794 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
|
1795 if (s) |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1796 CHECK_STRING_BYTES (s); |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1797 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1798 |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1799 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
|
1800 check_sblock (b); |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1801 } |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1802 else |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1803 check_sblock (current_sblock); |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1804 } |
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1805 |
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1806 #endif /* GC_CHECK_STRING_BYTES */ |
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1807 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1808 #ifdef GC_CHECK_STRING_FREE_LIST |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1809 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1810 /* 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
|
1811 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
|
1812 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1813 static void |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1814 check_string_free_list () |
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 struct Lisp_String *s; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1817 |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1818 /* 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
|
1819 s = string_free_list; |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1820 while (s != NULL) |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1821 { |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
1822 if ((unsigned long)s < 1024) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1823 abort(); |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1824 s = NEXT_FREE_LISP_STRING (s); |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1825 } |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1826 } |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1827 #else |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1828 #define check_string_free_list() |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1829 #endif |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1830 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1831 /* Return a new Lisp_String. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1832 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1833 static struct Lisp_String * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1834 allocate_string (void) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1835 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1836 struct Lisp_String *s; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1837 |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1838 /* eassert (!handling_signal); */ |
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1839 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1840 MALLOC_BLOCK_INPUT; |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
1841 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1842 /* 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
|
1843 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
|
1844 if (string_free_list == NULL) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1845 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1846 struct string_block *b; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1847 int i; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1848 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1849 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
|
1850 memset (b, 0, sizeof *b); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1851 b->next = string_blocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1852 string_blocks = b; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1853 ++n_string_blocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1854 |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1855 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
|
1856 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1857 s = b->strings + i; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1858 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
|
1859 string_free_list = s; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1860 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1861 |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1862 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
|
1863 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1864 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1865 check_string_free_list (); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1866 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1867 /* 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
|
1868 s = string_free_list; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1869 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
|
1870 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1871 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1872 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1873 /* 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
|
1874 memset (s, 0, sizeof *s); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1875 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1876 --total_free_strings; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1877 ++total_strings; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1878 ++strings_consed; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1879 consing_since_gc += sizeof *s; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1880 |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1881 #ifdef GC_CHECK_STRING_BYTES |
87730 | 1882 if (!noninteractive) |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1883 { |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1884 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
|
1885 { |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1886 check_string_bytes_count = 0; |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1887 check_string_bytes (1); |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1888 } |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1889 else |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1890 check_string_bytes (0); |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1891 } |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1892 #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
|
1893 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1894 return s; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1897 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1898 /* 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
|
1899 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
|
1900 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
|
1901 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
|
1902 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
|
1903 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1904 void |
110480
5290c80fda43
Fix some uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
109901
diff
changeset
|
1905 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
|
1906 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
|
1907 { |
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1908 struct sdata *data, *old_data; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1909 struct sblock *b; |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
1910 EMACS_INT needed, old_nbytes; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1911 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1912 /* 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
|
1913 of string data. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1914 needed = SDATA_SIZE (nbytes); |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1915 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
|
1916 old_nbytes = GC_STRING_BYTES (s); |
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1917 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1918 MALLOC_BLOCK_INPUT; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1919 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1920 if (nbytes > LARGE_STRING_BYTES) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1921 { |
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
1922 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
|
1923 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1924 #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
|
1925 /* 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
|
1926 because mapped region contents are not preserved in |
51318 | 1927 a dumped Emacs. |
1928 | |
1929 In case you think of allowing it in a dumped Emacs at the | |
1930 cost of not being able to re-dump, there's another reason: | |
1931 mmap'ed data typically have an address towards the top of the | |
1932 address space, which won't fit into an EMACS_INT (at least on | |
1933 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
|
1934 mallopt (M_MMAP_MAX, 0); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1935 #endif |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1936 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1937 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
|
1938 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1939 #ifdef DOUG_LEA_MALLOC |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1940 /* 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
|
1941 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
|
1942 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1943 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1944 b->next_free = &b->first_data; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1945 b->first_data.string = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1946 b->next = large_sblocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1947 large_sblocks = b; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1948 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1949 else if (current_sblock == NULL |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1950 || (((char *) current_sblock + SBLOCK_SIZE |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1951 - (char *) current_sblock->next_free) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1952 < (needed + GC_STRING_EXTRA))) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1953 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1954 /* 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
|
1955 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
|
1956 b->next_free = &b->first_data; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1957 b->first_data.string = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1958 b->next = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1959 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1960 if (current_sblock) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1961 current_sblock->next = b; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1962 else |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1963 oldest_sblock = b; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1964 current_sblock = b; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1965 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1966 else |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1967 b = current_sblock; |
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1968 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1969 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
|
1970 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
|
1971 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
1972 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1973 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1974 data->string = s; |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1975 s->data = SDATA_DATA (data); |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1976 #ifdef GC_CHECK_STRING_BYTES |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1977 SDATA_NBYTES (data) = nbytes; |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1978 #endif |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1979 s->size = nchars; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1980 s->size_byte = nbytes; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1981 s->data[nbytes] = '\0'; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1982 #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
|
1983 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
|
1984 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1985 |
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1986 /* 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
|
1987 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
|
1988 in it. */ |
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1989 if (old_data) |
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1990 { |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1991 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
|
1992 old_data->string = NULL; |
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1993 } |
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1994 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1995 consing_since_gc += needed; |
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 |
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 /* Sweep and compact strings. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2000 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2001 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2002 sweep_strings (void) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2003 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2004 struct string_block *b, *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2005 struct string_block *live_blocks = NULL; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2006 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2007 string_free_list = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2008 total_strings = total_free_strings = 0; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2009 total_string_size = 0; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2010 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2011 /* 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
|
2012 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
|
2013 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2014 int i, nfree = 0; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2015 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
|
2016 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2017 next = b->next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2018 |
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
2019 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
|
2020 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2021 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
|
2022 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2023 if (s->data) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2024 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2025 /* 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
|
2026 if (STRING_MARKED_P (s)) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2027 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2028 /* 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
|
2029 UNMARK_STRING (s); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2030 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2031 if (!NULL_INTERVAL_P (s->intervals)) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2032 UNMARK_BALANCE_INTERVALS (s->intervals); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2033 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2034 ++total_strings; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2035 total_string_size += STRING_BYTES (s); |
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 else |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2038 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2039 /* 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
|
2040 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
|
2041 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2042 /* 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
|
2043 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
|
2044 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
|
2045 #ifdef GC_CHECK_STRING_BYTES |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2046 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
|
2047 abort (); |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2048 #else |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2049 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
|
2050 #endif |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2051 data->string = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2052 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2053 /* 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
|
2054 know it's free. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2055 s->data = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2056 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2057 /* 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
|
2058 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
|
2059 string_free_list = s; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2060 ++nfree; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2061 } |
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 else |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2064 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2065 /* 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
|
2066 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
|
2067 string_free_list = s; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2068 ++nfree; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2069 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2070 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2071 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2072 /* 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
|
2073 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
|
2074 if (nfree == STRING_BLOCK_SIZE |
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
2075 && 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
|
2076 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2077 lisp_free (b); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2078 --n_string_blocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2079 string_free_list = free_list_before; |
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 else |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2082 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2083 total_free_strings += nfree; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2084 b->next = live_blocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2085 live_blocks = b; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2086 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2087 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2088 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2089 check_string_free_list (); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2090 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2091 string_blocks = live_blocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2092 free_large_strings (); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2093 compact_small_strings (); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2094 |
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2095 check_string_free_list (); |
27142
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 |
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 /* Free dead large strings. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2100 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2101 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2102 free_large_strings (void) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2103 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2104 struct sblock *b, *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2105 struct sblock *live_blocks = NULL; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2106 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2107 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
|
2108 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2109 next = b->next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2110 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2111 if (b->first_data.string == NULL) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2112 lisp_free (b); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2113 else |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2114 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2115 b->next = live_blocks; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2116 live_blocks = b; |
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 } |
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 large_sblocks = live_blocks; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2123 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2124 /* 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
|
2125 data of live strings after compaction. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2126 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2127 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2128 compact_small_strings (void) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2129 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2130 struct sblock *b, *tb, *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2131 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
|
2132 struct sdata *to_end, *from_end; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2133 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2134 /* 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
|
2135 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
|
2136 tb = oldest_sblock; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2137 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
|
2138 to = &tb->first_data; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2139 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2140 /* 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
|
2141 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
|
2142 copying will happen this way. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2143 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
|
2144 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2145 end = b->next_free; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2146 xassert ((char *) end <= (char *) b + SBLOCK_SIZE); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2147 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2148 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
|
2149 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2150 /* 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
|
2151 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
|
2152 EMACS_INT nbytes; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2153 |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2154 #ifdef GC_CHECK_STRING_BYTES |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2155 /* 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
|
2156 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
|
2157 if (from->string |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2158 && 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
|
2159 abort (); |
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2160 #endif /* GC_CHECK_STRING_BYTES */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2161 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2162 if (from->string) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2163 nbytes = GC_STRING_BYTES (from->string); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2164 else |
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2165 nbytes = SDATA_NBYTES (from); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2166 |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2167 if (nbytes > LARGE_STRING_BYTES) |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2168 abort (); |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2169 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2170 nbytes = SDATA_SIZE (nbytes); |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2171 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
|
2172 |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2173 #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
|
2174 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
|
2175 (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
|
2176 GC_STRING_OVERRUN_COOKIE_SIZE)) |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2177 abort (); |
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2178 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2179 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2180 /* 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
|
2181 if (from->string) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2182 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2183 /* 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
|
2184 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
|
2185 if (to_end > tb_end) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2186 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2187 tb->next_free = to; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2188 tb = tb->next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2189 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
|
2190 to = &tb->first_data; |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2191 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
|
2192 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2193 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2194 /* 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
|
2195 if (from != to) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2196 { |
30823
8ee3740aaf60
(compact_small_strings): Use safe_bcopy, add an
Gerd Moellmann <gerd@gnu.org>
parents:
30784
diff
changeset
|
2197 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
|
2198 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
|
2199 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
|
2200 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2201 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2202 /* 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
|
2203 to = to_end; |
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 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2207 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2208 /* 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
|
2209 we can free them. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2210 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
|
2211 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2212 next = b->next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2213 lisp_free (b); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2214 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2215 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2216 tb->next_free = to; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2217 tb->next = NULL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2218 current_sblock = tb; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2221 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2222 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
|
2223 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
|
2224 LENGTH must be an integer. |
1c3b8ce97c63
(Fmake_string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
55720
diff
changeset
|
2225 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
|
2226 (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
|
2227 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2228 register Lisp_Object val; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2229 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
|
2230 int c; |
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2231 EMACS_INT nbytes; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2232 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2233 CHECK_NATNUM (length); |
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2234 CHECK_NUMBER (init); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2235 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2236 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
|
2237 if (ASCII_CHAR_P (c)) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2238 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2239 nbytes = XINT (length); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2240 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
|
2241 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
|
2242 end = p + SCHARS (val); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2243 while (p != end) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2244 *p++ = c; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2245 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2246 else |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2247 { |
33800
7f148cfbd1f7
(Fmake_string): Use MAX_MULTIBYTE_LENGTH, instead of hard coded `4'.
Kenichi Handa <handa@m17n.org>
parents:
33764
diff
changeset
|
2248 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
|
2249 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
|
2250 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
|
2251 |
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2252 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
|
2253 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
|
2254 nbytes = len * string_len; |
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2255 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
|
2256 p = SDATA (val); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2257 end = p + nbytes; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2258 while (p != end) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2259 { |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
2260 memcpy (p, str, len); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2261 p += len; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2262 } |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2263 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2264 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2265 *p = 0; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2266 return val; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2269 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2270 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
|
2271 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
|
2272 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
|
2273 (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
|
2274 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2275 register Lisp_Object val; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2276 struct Lisp_Bool_Vector *p; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2277 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
|
2278 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
|
2279 int bits_per_value; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2280 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2281 CHECK_NATNUM (length); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2282 |
55159
e4e9ec547c6f
(Fmake_bool_vector): Use BOOL_VECTOR_BITS_PER_CHAR instead of
Andreas Schwab <schwab@suse.de>
parents:
53705
diff
changeset
|
2283 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
|
2284 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2285 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
|
2286 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
|
2287 / BOOL_VECTOR_BITS_PER_CHAR); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2288 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2289 /* 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
|
2290 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
|
2291 val = Fmake_vector (make_number (length_in_elts + 1), Qnil); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2292 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2293 /* 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
|
2294 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
|
2295 /* 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
|
2296 XSETPVECTYPE (XVECTOR (val), PVEC_BOOL_VECTOR); |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2297 |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2298 p = XBOOL_VECTOR (val); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2299 p->size = XFASTINT (length); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2300 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2301 real_init = (NILP (init) ? 0 : -1); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2302 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
|
2303 p->data[i] = real_init; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2304 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2305 /* 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
|
2306 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
|
2307 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
|
2308 &= (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
|
2309 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2310 return val; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2313 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2314 /* 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
|
2315 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
|
2316 multibyte, depending on the contents. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2317 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2318 Lisp_Object |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2319 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
|
2320 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2321 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
|
2322 EMACS_INT nchars, multibyte_nbytes; |
28997
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
2323 |
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
2324 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
|
2325 if (nbytes == nchars || nbytes != multibyte_nbytes) |
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
2326 /* 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
|
2327 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
|
2328 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
|
2329 else |
dda5cbf94928
(make_string): Fix previous change. Be sure to make
Kenichi Handa <handa@m17n.org>
parents:
32776
diff
changeset
|
2330 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
|
2331 return val; |
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 |
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 /* 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
|
2336 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2337 Lisp_Object |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2338 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
|
2339 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2340 register Lisp_Object val; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2341 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
|
2342 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
|
2343 STRING_SET_UNIBYTE (val); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2344 return val; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2347 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2348 /* 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
|
2349 bytes at CONTENTS. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2350 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2351 Lisp_Object |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2352 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
|
2353 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
|
2354 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2355 register Lisp_Object val; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2356 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
|
2357 memcpy (SDATA (val), contents, nbytes); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2358 return val; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2361 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2362 /* 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
|
2363 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
|
2364 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2365 Lisp_Object |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2366 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
|
2367 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
|
2368 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2369 register Lisp_Object val; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2370 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
|
2371 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
|
2372 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
|
2373 STRING_SET_UNIBYTE (val); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2374 return val; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2377 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2378 /* 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
|
2379 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
|
2380 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
|
2381 characters by itself. */ |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2382 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2383 Lisp_Object |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
2384 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
|
2385 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
|
2386 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2387 register Lisp_Object val; |
50200
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 (nchars < 0) |
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2390 { |
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2391 if (multibyte) |
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2392 nchars = multibyte_chars_in_text (contents, nbytes); |
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2393 else |
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2394 nchars = nbytes; |
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2395 } |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2396 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
|
2397 memcpy (SDATA (val), contents, nbytes); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2398 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
|
2399 STRING_SET_UNIBYTE (val); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2400 return val; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2403 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2404 /* 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
|
2405 data warrants. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2406 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2407 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2408 build_string (const char *str) |
27142
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 return make_string (str, strlen (str)); |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2413 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2414 /* 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
|
2415 occupying LENGTH bytes. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2416 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2417 Lisp_Object |
110480
5290c80fda43
Fix some uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
109901
diff
changeset
|
2418 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
|
2419 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2420 Lisp_Object val; |
81272
1842d7137ff2
(init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
77260
diff
changeset
|
2421 |
1842d7137ff2
(init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
77260
diff
changeset
|
2422 if (!length) |
1842d7137ff2
(init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
77260
diff
changeset
|
2423 return empty_unibyte_string; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2424 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
|
2425 STRING_SET_UNIBYTE (val); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2426 return val; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2429 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2430 /* 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
|
2431 which occupy NBYTES bytes. */ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2432 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2433 Lisp_Object |
110480
5290c80fda43
Fix some uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
109901
diff
changeset
|
2434 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
|
2435 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2436 Lisp_Object string; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2437 struct Lisp_String *s; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2438 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2439 if (nchars < 0) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2440 abort (); |
81272
1842d7137ff2
(init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
77260
diff
changeset
|
2441 if (!nbytes) |
1842d7137ff2
(init_strings): Initialize canonical empty strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
77260
diff
changeset
|
2442 return empty_multibyte_string; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2443 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2444 s = allocate_string (); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2445 allocate_string_data (s, nchars, nbytes); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2446 XSETSTRING (string, s); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2447 string_chars_consed += nbytes; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2448 return string; |
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 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2453 /*********************************************************************** |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2454 Float Allocation |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2455 ***********************************************************************/ |
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
2456 |
300 | 2457 /* 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
|
2458 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
|
2459 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
|
2460 any new float cells from the latest float_block. */ |
300 | 2461 |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
2462 #define FLOAT_BLOCK_SIZE \ |
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
2463 (((BLOCK_BYTES - sizeof (struct float_block *) \ |
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
2464 /* 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
|
2465 - (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
|
2466 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1)) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2467 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2468 #define GETMARKBIT(block,n) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2469 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2470 >> ((n) % (sizeof(int) * CHAR_BIT))) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2471 & 1) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2472 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2473 #define SETMARKBIT(block,n) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2474 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2475 |= 1 << ((n) % (sizeof(int) * CHAR_BIT)) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2476 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2477 #define UNSETMARKBIT(block,n) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2478 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2479 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT))) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2480 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2481 #define FLOAT_BLOCK(fptr) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2482 ((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
|
2483 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2484 #define FLOAT_INDEX(fptr) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2485 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float)) |
300 | 2486 |
2487 struct float_block | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2488 { |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2489 /* 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
|
2490 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
|
2491 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
|
2492 struct float_block *next; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2493 }; |
300 | 2494 |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2495 #define FLOAT_MARKED_P(fptr) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2496 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2497 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2498 #define FLOAT_MARK(fptr) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2499 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2500 |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2501 #define FLOAT_UNMARK(fptr) \ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2502 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2503 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2504 /* Current float_block. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2505 |
300 | 2506 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
|
2507 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2508 /* 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
|
2509 |
300 | 2510 int float_block_index; |
2511 | |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2512 /* 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
|
2513 |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2514 int n_float_blocks; |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2515 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2516 /* 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
|
2517 |
300 | 2518 struct Lisp_Float *float_free_list; |
2519 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2520 |
39297
aff361cfdccb
Fix a typo in a comment. From Pavel Janik.
Eli Zaretskii <eliz@gnu.org>
parents:
39228
diff
changeset
|
2521 /* Initialize float allocation. */ |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2522 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
2523 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2524 init_float (void) |
300 | 2525 { |
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2526 float_block = NULL; |
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2527 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */ |
300 | 2528 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
|
2529 n_float_blocks = 0; |
300 | 2530 } |
2531 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2532 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2533 /* 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
|
2534 |
300 | 2535 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2536 make_float (double float_value) |
300 | 2537 { |
2538 register Lisp_Object val; | |
2539 | |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2540 /* eassert (!handling_signal); */ |
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2541 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
2542 MALLOC_BLOCK_INPUT; |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2543 |
300 | 2544 if (float_free_list) |
2545 { | |
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
|
2546 /* 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
|
2547 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
|
2548 XSETFLOAT (val, float_free_list); |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2549 float_free_list = float_free_list->u.chain; |
300 | 2550 } |
2551 else | |
2552 { | |
2553 if (float_block_index == FLOAT_BLOCK_SIZE) | |
2554 { | |
12529 | 2555 register struct float_block *new; |
2556 | |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2557 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
|
2558 MEM_TYPE_FLOAT); |
300 | 2559 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
|
2560 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits); |
300 | 2561 float_block = new; |
2562 float_block_index = 0; | |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2563 n_float_blocks++; |
300 | 2564 } |
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2565 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
|
2566 float_block_index++; |
300 | 2567 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2568 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
2569 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2570 |
104313
73f76307d49b
* lisp.h (XFLOAT_DATA): Produce an rvalue by adding 0 to the value.
Ken Raeburn <raeburn@raeburn.org>
parents:
101689
diff
changeset
|
2571 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
|
2572 eassert (!FLOAT_MARKED_P (XFLOAT (val))); |
300 | 2573 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
|
2574 floats_consed++; |
300 | 2575 return val; |
2576 } | |
2577 | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2578 |
300 | 2579 |
27142
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 Cons Allocation |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2582 ***********************************************************************/ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2583 |
300 | 2584 /* We store cons cells inside of cons_blocks, allocating a new |
2585 cons_block with malloc whenever necessary. Cons cells reclaimed by | |
2586 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
|
2587 any new cons cells from the latest cons_block. */ |
300 | 2588 |
2589 #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
|
2590 (((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
|
2591 / (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
|
2592 |
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2593 #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
|
2594 ((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
|
2595 |
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2596 #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
|
2597 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons)) |
300 | 2598 |
2599 struct cons_block | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2600 { |
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2601 /* 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
|
2602 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
|
2603 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
|
2604 struct cons_block *next; |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2605 }; |
300 | 2606 |
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2607 #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
|
2608 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
|
2609 |
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2610 #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
|
2611 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
|
2612 |
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2613 #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
|
2614 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
|
2615 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2616 /* Current cons_block. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2617 |
300 | 2618 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
|
2619 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2620 /* 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
|
2621 |
300 | 2622 int cons_block_index; |
2623 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2624 /* 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
|
2625 |
300 | 2626 struct Lisp_Cons *cons_free_list; |
2627 | |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2628 /* 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
|
2629 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
2630 static int n_cons_blocks; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2631 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2632 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2633 /* Initialize cons allocation. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2634 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
2635 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2636 init_cons (void) |
300 | 2637 { |
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2638 cons_block = NULL; |
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2639 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */ |
300 | 2640 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
|
2641 n_cons_blocks = 0; |
300 | 2642 } |
2643 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2644 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2645 /* 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
|
2646 |
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
2647 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2648 free_cons (struct Lisp_Cons *ptr) |
300 | 2649 { |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2650 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
|
2651 #if GC_MARK_STACK |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2652 ptr->car = Vdead; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2653 #endif |
300 | 2654 cons_free_list = ptr; |
2655 } | |
2656 | |
2657 DEFUN ("cons", Fcons, Scons, 2, 2, 0, | |
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
2658 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
|
2659 (Lisp_Object car, Lisp_Object cdr) |
300 | 2660 { |
2661 register Lisp_Object val; | |
2662 | |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2663 /* eassert (!handling_signal); */ |
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2664 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
2665 MALLOC_BLOCK_INPUT; |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2666 |
300 | 2667 if (cons_free_list) |
2668 { | |
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
|
2669 /* 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
|
2670 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
|
2671 XSETCONS (val, cons_free_list); |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2672 cons_free_list = cons_free_list->u.chain; |
300 | 2673 } |
2674 else | |
2675 { | |
2676 if (cons_block_index == CONS_BLOCK_SIZE) | |
2677 { | |
12529 | 2678 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
|
2679 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
|
2680 MEM_TYPE_CONS); |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
2681 memset (new->gcmarkbits, 0, sizeof new->gcmarkbits); |
300 | 2682 new->next = cons_block; |
2683 cons_block = new; | |
2684 cons_block_index = 0; | |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2685 n_cons_blocks++; |
300 | 2686 } |
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2687 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
|
2688 cons_block_index++; |
300 | 2689 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2690 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
2691 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2692 |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39914
diff
changeset
|
2693 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
|
2694 XSETCDR (val, cdr); |
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2695 eassert (!CONS_MARKED_P (XCONS (val))); |
300 | 2696 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
|
2697 cons_cells_consed++; |
300 | 2698 return val; |
2699 } | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2700 |
56539
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2701 /* 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
|
2702 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2703 check_cons_list (void) |
56539
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2704 { |
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2705 #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
|
2706 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
|
2707 |
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2708 while (tail) |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2709 tail = tail->u.chain; |
56539
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2710 #endif |
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2711 } |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2712 |
71967
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2713 /* 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
|
2714 |
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2715 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2716 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
|
2717 { |
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2718 return Fcons (arg1, Qnil); |
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2719 } |
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2720 |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2721 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2722 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
|
2723 { |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2724 return Fcons (arg1, Fcons (arg2, Qnil)); |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2725 } |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2726 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2727 |
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2728 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2729 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
|
2730 { |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2731 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
|
2732 } |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2733 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2734 |
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2735 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2736 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
|
2737 { |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2738 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
|
2739 } |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2740 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2741 |
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2742 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2743 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
|
2744 { |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2745 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
|
2746 Fcons (arg5, Qnil))))); |
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2747 } |
300 | 2748 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2749 |
300 | 2750 DEFUN ("list", Flist, Slist, 0, MANY, 0, |
40977 | 2751 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
|
2752 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
|
2753 usage: (list &rest OBJECTS) */) |
109179
8cfee7d2955f
Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109165
diff
changeset
|
2754 (int nargs, register Lisp_Object *args) |
300 | 2755 { |
13610
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2756 register Lisp_Object val; |
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2757 val = Qnil; |
300 | 2758 |
13610
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2759 while (nargs > 0) |
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2760 { |
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2761 nargs--; |
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2762 val = Fcons (args[nargs], val); |
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2763 } |
300 | 2764 return val; |
2765 } | |
2766 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2767 |
300 | 2768 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
|
2769 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
|
2770 (register Lisp_Object length, Lisp_Object init) |
300 | 2771 { |
2772 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
|
2773 register EMACS_INT size; |
300 | 2774 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2775 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
|
2776 size = XFASTINT (length); |
300 | 2777 |
2778 val = Qnil; | |
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2779 while (size > 0) |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2780 { |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2781 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
|
2782 --size; |
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 if (size > 0) |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2785 { |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2786 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
|
2787 --size; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2788 |
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2789 if (size > 0) |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2790 { |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2791 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
|
2792 --size; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2793 |
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2794 if (size > 0) |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2795 { |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2796 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
|
2797 --size; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2798 |
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2799 if (size > 0) |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2800 { |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2801 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
|
2802 --size; |
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 } |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2807 |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2808 QUIT; |
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2809 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2810 |
300 | 2811 return val; |
2812 } | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2813 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2814 |
300 | 2815 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2816 /*********************************************************************** |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2817 Vector Allocation |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2818 ***********************************************************************/ |
300 | 2819 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2820 /* 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
|
2821 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
2822 static struct Lisp_Vector *all_vectors; |
300 | 2823 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2824 /* 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
|
2825 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
2826 static int n_vectors; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2827 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2828 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2829 /* 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
|
2830 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
|
2831 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2832 static struct Lisp_Vector * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2833 allocate_vectorlike (EMACS_INT len) |
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2834 { |
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2835 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
|
2836 size_t nbytes; |
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2837 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
2838 MALLOC_BLOCK_INPUT; |
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
2839 |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2840 #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
|
2841 /* 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
|
2842 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
|
2843 a dumped Emacs. */ |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2844 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
|
2845 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2846 |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2847 /* 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
|
2848 /* eassert (!handling_signal); */ |
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2849 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2850 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
|
2851 p = (struct Lisp_Vector *) lisp_malloc (nbytes, MEM_TYPE_VECTORLIKE); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2852 |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2853 #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
|
2854 /* 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
|
2855 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
|
2856 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2857 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2858 consing_since_gc += nbytes; |
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
2859 vector_cells_consed += len; |
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2860 |
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2861 p->next = all_vectors; |
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2862 all_vectors = p; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2863 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
2864 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2865 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2866 ++n_vectors; |
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2867 return p; |
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2868 } |
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2869 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2870 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2871 /* Allocate a vector with NSLOTS slots. */ |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2872 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2873 struct Lisp_Vector * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2874 allocate_vector (EMACS_INT nslots) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2875 { |
84978
33b7fe948502
(enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84977
diff
changeset
|
2876 struct Lisp_Vector *v = allocate_vectorlike (nslots); |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2877 v->size = nslots; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2878 return v; |
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 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2881 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2882 /* Allocate other vector-like structures. */ |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2883 |
86160
1ede747999c6
* alloc.c (ALLOCATE_PSEUDOVECTOR): Move to lisp.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85674
diff
changeset
|
2884 struct Lisp_Vector * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2885 allocate_pseudovector (int memlen, int lisplen, EMACS_INT tag) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2886 { |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2887 struct Lisp_Vector *v = allocate_vectorlike (memlen); |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2888 EMACS_INT i; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2889 |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2890 /* 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
|
2891 v->size = lisplen; |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2892 for (i = 0; i < lisplen; ++i) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2893 v->contents[i] = Qnil; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2894 |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2895 XSETPVECTYPE (v, tag); /* Add the appropriate tag. */ |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2896 return v; |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2897 } |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2898 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2899 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
|
2900 allocate_hash_table (void) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2901 { |
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
|
2902 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
|
2903 } |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2904 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2905 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2906 struct window * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2907 allocate_window (void) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2908 { |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2909 return ALLOCATE_PSEUDOVECTOR(struct window, current_matrix, PVEC_WINDOW); |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2910 } |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2911 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2912 |
84693
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
2913 struct terminal * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2914 allocate_terminal (void) |
84693
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
2915 { |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2916 struct terminal *t = ALLOCATE_PSEUDOVECTOR (struct terminal, |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2917 next_terminal, PVEC_TERMINAL); |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2918 /* 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
|
2919 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
|
2920 (char*) (t + 1) - (char*) &t->next_terminal); |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2921 |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2922 return t; |
84693
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
2923 } |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
2924 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2925 struct frame * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2926 allocate_frame (void) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2927 { |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2928 struct frame *f = ALLOCATE_PSEUDOVECTOR (struct frame, |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2929 face_cache, PVEC_FRAME); |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2930 /* 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
|
2931 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
|
2932 (char *) (f + 1) - (char *) &f->face_cache); |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2933 return f; |
36435
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 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2936 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2937 struct Lisp_Process * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
2938 allocate_process (void) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2939 { |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
2940 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS); |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2941 } |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2942 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2943 |
300 | 2944 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
|
2945 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
|
2946 See also the function `vector'. */) |
109179
8cfee7d2955f
Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109165
diff
changeset
|
2947 (register Lisp_Object length, Lisp_Object init) |
300 | 2948 { |
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2949 Lisp_Object vector; |
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2950 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
|
2951 register EMACS_INT index; |
300 | 2952 register struct Lisp_Vector *p; |
2953 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2954 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
|
2955 sizei = XFASTINT (length); |
300 | 2956 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2957 p = allocate_vector (sizei); |
300 | 2958 for (index = 0; index < sizei; index++) |
2959 p->contents[index] = init; | |
2960 | |
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2961 XSETVECTOR (vector, p); |
300 | 2962 return vector; |
2963 } | |
2964 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2965 |
300 | 2966 DEFUN ("vector", Fvector, Svector, 0, MANY, 0, |
40977 | 2967 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
|
2968 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
|
2969 usage: (vector &rest OBJECTS) */) |
109179
8cfee7d2955f
Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109165
diff
changeset
|
2970 (register int nargs, Lisp_Object *args) |
300 | 2971 { |
2972 register Lisp_Object len, val; | |
2973 register int index; | |
2974 register struct Lisp_Vector *p; | |
2975 | |
9295
17d393a8eed6
(free_float, make_float, free_cons, Flist, Fvector, Fmake_byte_code,
Karl Heuer <kwzh@gnu.org>
parents:
9261
diff
changeset
|
2976 XSETFASTINT (len, nargs); |
300 | 2977 val = Fmake_vector (len, Qnil); |
2978 p = XVECTOR (val); | |
2979 for (index = 0; index < nargs; index++) | |
2980 p->contents[index] = args[index]; | |
2981 return val; | |
2982 } | |
2983 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2984 |
300 | 2985 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
|
2986 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
|
2987 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
|
2988 stack size, (optional) doc string, and (optional) interactive spec. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
2989 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
|
2990 significance. |
50626
a5a77c7717cb
(Fmake_byte_code): Improve the `usage' string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50468
diff
changeset
|
2991 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
|
2992 (register int nargs, Lisp_Object *args) |
300 | 2993 { |
2994 register Lisp_Object len, val; | |
2995 register int index; | |
2996 register struct Lisp_Vector *p; | |
2997 | |
9295
17d393a8eed6
(free_float, make_float, free_cons, Flist, Fvector, Fmake_byte_code,
Karl Heuer <kwzh@gnu.org>
parents:
9261
diff
changeset
|
2998 XSETFASTINT (len, nargs); |
485 | 2999 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
|
3000 val = make_pure_vector ((EMACS_INT) nargs); |
300 | 3001 else |
3002 val = Fmake_vector (len, Qnil); | |
28997
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
3003 |
109278
d14945d39811
* alloc.c (Fmake_byte_code): Don't access undefined argument (Bug#6517).
Andreas Schwab <schwab@linux-m68k.org>
parents:
106950
diff
changeset
|
3004 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
|
3005 /* 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
|
3006 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
|
3007 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
|
3008 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
|
3009 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
|
3010 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
|
3011 |
300 | 3012 p = XVECTOR (val); |
3013 for (index = 0; index < nargs; index++) | |
3014 { | |
485 | 3015 if (!NILP (Vpurify_flag)) |
300 | 3016 args[index] = Fpurecopy (args[index]); |
3017 p->contents[index] = args[index]; | |
3018 } | |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
3019 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
|
3020 XSETCOMPILED (val, p); |
300 | 3021 return val; |
3022 } | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3023 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3024 |
300 | 3025 |
27142
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 Symbol Allocation |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3028 ***********************************************************************/ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3029 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3030 /* 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
|
3031 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
|
3032 own overhead. */ |
300 | 3033 |
3034 #define SYMBOL_BLOCK_SIZE \ | |
3035 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol)) | |
3036 | |
3037 struct symbol_block | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3038 { |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3039 /* Place `symbols' first, to preserve alignment. */ |
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3040 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
|
3041 struct symbol_block *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3042 }; |
300 | 3043 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3044 /* 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
|
3045 structure in it. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3046 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3047 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
|
3048 static int symbol_block_index; |
300 | 3049 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3050 /* List of free symbols. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3051 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3052 static struct Lisp_Symbol *symbol_free_list; |
300 | 3053 |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3054 /* 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
|
3055 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3056 static int n_symbol_blocks; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3057 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3058 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3059 /* Initialize symbol allocation. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3060 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3061 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3062 init_symbol (void) |
300 | 3063 { |
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3064 symbol_block = NULL; |
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3065 symbol_block_index = SYMBOL_BLOCK_SIZE; |
300 | 3066 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
|
3067 n_symbol_blocks = 0; |
300 | 3068 } |
3069 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3070 |
300 | 3071 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
|
3072 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
|
3073 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
|
3074 (Lisp_Object name) |
300 | 3075 { |
3076 register Lisp_Object val; | |
3077 register struct Lisp_Symbol *p; | |
3078 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
3079 CHECK_STRING (name); |
300 | 3080 |
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
|
3081 /* eassert (!handling_signal); */ |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
3082 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
3083 MALLOC_BLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3084 |
300 | 3085 if (symbol_free_list) |
3086 { | |
9261
e5ba7993d378
(VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents:
9144
diff
changeset
|
3087 XSETSYMBOL (val, symbol_free_list); |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
3088 symbol_free_list = symbol_free_list->next; |
300 | 3089 } |
3090 else | |
3091 { | |
3092 if (symbol_block_index == SYMBOL_BLOCK_SIZE) | |
3093 { | |
12529 | 3094 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
|
3095 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
|
3096 MEM_TYPE_SYMBOL); |
300 | 3097 new->next = symbol_block; |
3098 symbol_block = new; | |
3099 symbol_block_index = 0; | |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3100 n_symbol_blocks++; |
300 | 3101 } |
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
3102 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
|
3103 symbol_block_index++; |
300 | 3104 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3105 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
3106 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3107 |
300 | 3108 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
|
3109 p->xname = name; |
300 | 3110 p->plist = Qnil; |
107984
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
3111 p->redirect = SYMBOL_PLAINVAL; |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
3112 SET_SYMBOL_VAL (p, Qunbound); |
300 | 3113 p->function = Qunbound; |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
3114 p->next = NULL; |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
3115 p->gcmarkbit = 0; |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
3116 p->interned = SYMBOL_UNINTERNED; |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
3117 p->constant = 0; |
300 | 3118 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
|
3119 symbols_consed++; |
300 | 3120 return val; |
3121 } | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3122 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3123 |
300 | 3124 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3125 /*********************************************************************** |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3126 Marker (Misc) Allocation |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3127 ***********************************************************************/ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3128 |
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3129 /* Allocation of markers and other objects that share that structure. |
300 | 3130 Works like allocation of conses. */ |
3131 | |
3132 #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
|
3133 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc)) |
300 | 3134 |
3135 struct marker_block | |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3136 { |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3137 /* Place `markers' first, to preserve alignment. */ |
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3138 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
|
3139 struct marker_block *next; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3140 }; |
300 | 3141 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3142 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
|
3143 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
|
3144 |
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3145 static union Lisp_Misc *marker_free_list; |
300 | 3146 |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3147 /* 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
|
3148 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3149 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
|
3150 |
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
3151 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3152 init_marker (void) |
300 | 3153 { |
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3154 marker_block = NULL; |
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3155 marker_block_index = MARKER_BLOCK_SIZE; |
300 | 3156 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
|
3157 n_marker_blocks = 0; |
300 | 3158 } |
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 /* 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
|
3161 |
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3162 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3163 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
|
3164 { |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3165 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
|
3166 |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3167 /* eassert (!handling_signal); */ |
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3168 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
3169 MALLOC_BLOCK_INPUT; |
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
3170 |
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3171 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
|
3172 { |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3173 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
|
3174 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
|
3175 } |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3176 else |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3177 { |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3178 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
|
3179 { |
12529 | 3180 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
|
3181 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
|
3182 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
|
3183 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
|
3184 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
|
3185 marker_block_index = 0; |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3186 n_marker_blocks++; |
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3187 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
|
3188 } |
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
3189 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
|
3190 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
|
3191 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3192 |
84977
3747382d60e9
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): New macros
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84954
diff
changeset
|
3193 MALLOC_UNBLOCK_INPUT; |
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3194 |
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3195 --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
|
3196 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
|
3197 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
|
3198 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
|
3199 return val; |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3200 } |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3201 |
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3202 /* Free a Lisp_Misc object */ |
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3203 |
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3204 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3205 free_misc (Lisp_Object misc) |
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3206 { |
85344
99492f857499
(free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85329
diff
changeset
|
3207 XMISCTYPE (misc) = Lisp_Misc_Free; |
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3208 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
|
3209 marker_free_list = XMISC (misc); |
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 total_free_markers++; |
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3212 } |
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3213 |
49055
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3214 /* 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
|
3215 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
|
3216 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
|
3217 |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3218 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3219 make_save_value (void *pointer, int integer) |
49055
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3220 { |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3221 register Lisp_Object val; |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3222 register struct Lisp_Save_Value *p; |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3223 |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3224 val = allocate_misc (); |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3225 XMISCTYPE (val) = Lisp_Misc_Save_Value; |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3226 p = XSAVE_VALUE (val); |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3227 p->pointer = pointer; |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3228 p->integer = integer; |
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
3229 p->dogc = 0; |
49055
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3230 return val; |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3231 } |
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3232 |
300 | 3233 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
|
3234 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
|
3235 (void) |
300 | 3236 { |
3237 register Lisp_Object val; | |
3238 register struct Lisp_Marker *p; | |
638 | 3239 |
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3240 val = allocate_misc (); |
11243
054ecfce1820
(Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents:
11048
diff
changeset
|
3241 XMISCTYPE (val) = Lisp_Misc_Marker; |
300 | 3242 p = XMARKER (val); |
3243 p->buffer = 0; | |
20565
aa9b7c5f0f62
(Fmake_marker): Initialize marker's bytepos and charpos.
Richard M. Stallman <rms@gnu.org>
parents:
20495
diff
changeset
|
3244 p->bytepos = 0; |
aa9b7c5f0f62
(Fmake_marker): Initialize marker's bytepos and charpos.
Richard M. Stallman <rms@gnu.org>
parents:
20495
diff
changeset
|
3245 p->charpos = 0; |
51668
0f333fd92a1d
(survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51658
diff
changeset
|
3246 p->next = NULL; |
13008
f042ef632b22
(Fmake_marker): Initialize insertion_type to 0.
Richard M. Stallman <rms@gnu.org>
parents:
12748
diff
changeset
|
3247 p->insertion_type = 0; |
300 | 3248 return val; |
3249 } | |
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3250 |
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3251 /* 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
|
3252 |
20375
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
3253 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3254 free_marker (Lisp_Object marker) |
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3255 { |
51668
0f333fd92a1d
(survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51658
diff
changeset
|
3256 unchain_marker (XMARKER (marker)); |
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3257 free_misc (marker); |
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3258 } |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3259 |
21258
693573ac0944
(make_specified_string): New function.
Richard M. Stallman <rms@gnu.org>
parents:
21244
diff
changeset
|
3260 |
300 | 3261 /* 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
|
3262 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
|
3263 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
|
3264 |
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3265 Any number of arguments, even zero arguments, are allowed. */ |
300 | 3266 |
3267 Lisp_Object | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3268 make_event_array (register int nargs, Lisp_Object *args) |
300 | 3269 { |
3270 int i; | |
3271 | |
3272 for (i = 0; i < nargs; i++) | |
2013
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3273 /* 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
|
3274 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
|
3275 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
|
3276 if (!INTEGERP (args[i]) |
3536
58d5ee6ec253
(make_event_array): Ignore bits above CHAR_META.
Richard M. Stallman <rms@gnu.org>
parents:
3181
diff
changeset
|
3277 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200) |
300 | 3278 return Fvector (nargs, args); |
3279 | |
3280 /* Since the loop exited, we know that all the things in it are | |
3281 characters, so we can make a string. */ | |
3282 { | |
6492
8372dce85f8a
(make_event_array): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6227
diff
changeset
|
3283 Lisp_Object result; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3284 |
18104
b2a669ef69b1
(Fmake_byte_code): Set val from p, not from val.
Richard M. Stallman <rms@gnu.org>
parents:
18010
diff
changeset
|
3285 result = Fmake_string (make_number (nargs), make_number (0)); |
300 | 3286 for (i = 0; i < nargs; i++) |
2013
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3287 { |
46418
b12a32662433
* alloc.c (make_event_array): Use SSET for storing into a string.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
3288 SSET (result, i, XINT (args[i])); |
2013
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3289 /* 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
|
3290 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
|
3291 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
|
3292 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3293 |
300 | 3294 return result; |
3295 } | |
3296 } | |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3297 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3298 |
300 | 3299 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3300 /************************************************************************ |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3301 Memory Full Handling |
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 |
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 /* Called if malloc returns zero. */ |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3306 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3307 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3308 memory_full (void) |
66530
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 int i; |
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 Vmemory_full = Qt; |
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 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
|
3315 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3316 /* 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
|
3317 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
|
3318 if (spare_memory[i]) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3319 { |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3320 if (i == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3321 free (spare_memory[i]); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3322 else if (i >= 1 && i <= 4) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3323 lisp_align_free (spare_memory[i]); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3324 else |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3325 lisp_free (spare_memory[i]); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3326 spare_memory[i] = 0; |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3327 } |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3328 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3329 /* 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
|
3330 we can refill the memory reserve. */ |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3331 #ifndef SYSTEM_MALLOC |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3332 bytes_used_when_full = BYTES_USED; |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3333 #endif |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3334 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3335 /* 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
|
3336 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
|
3337 xsignal (Qnil, Vmemory_signal_data); |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3338 } |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3339 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3340 /* 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
|
3341 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
|
3342 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
|
3343 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3344 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
|
3345 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
|
3346 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3347 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3348 refill_memory_reserve (void) |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3349 { |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3350 #ifndef SYSTEM_MALLOC |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3351 if (spare_memory[0] == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3352 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
|
3353 if (spare_memory[1] == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3354 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
|
3355 MEM_TYPE_CONS); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3356 if (spare_memory[2] == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3357 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
|
3358 MEM_TYPE_CONS); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3359 if (spare_memory[3] == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3360 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
|
3361 MEM_TYPE_CONS); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3362 if (spare_memory[4] == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3363 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
|
3364 MEM_TYPE_CONS); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3365 if (spare_memory[5] == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3366 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
|
3367 MEM_TYPE_STRING); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3368 if (spare_memory[6] == 0) |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3369 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
|
3370 MEM_TYPE_STRING); |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3371 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
|
3372 Vmemory_full = Qnil; |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3373 #endif |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3374 } |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3375 |
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3376 /************************************************************************ |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3377 C Stack Marking |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3378 ************************************************************************/ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3379 |
32700
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3380 #if GC_MARK_STACK || defined GC_MALLOC_CHECK |
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3381 |
42403 | 3382 /* Conservative C stack marking requires a method to identify possibly |
3383 live Lisp objects given a pointer value. We do this by keeping | |
3384 track of blocks of Lisp data that are allocated in a red-black tree | |
3385 (see also the comment of mem_node which is the type of nodes in | |
3386 that tree). Function lisp_malloc adds information for an allocated | |
3387 block to the red-black tree with calls to mem_insert, and function | |
3388 lisp_free removes it with mem_delete. Functions live_string_p etc | |
3389 call mem_find to lookup information about a given pointer in the | |
3390 tree, and use that to determine if the pointer points to a Lisp | |
3391 object or not. */ | |
3392 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3393 /* 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
|
3394 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3395 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3396 mem_init (void) |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3397 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3398 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
|
3399 mem_z.parent = NULL; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3400 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
|
3401 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
|
3402 mem_root = MEM_NIL; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3405 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3406 /* 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
|
3407 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
|
3408 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3409 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
|
3410 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
|
3411 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3412 struct mem_node *p; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3413 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3414 if (start < min_heap_address || start > max_heap_address) |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3415 return MEM_NIL; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3416 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3417 /* 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
|
3418 mem_z.start = start; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3419 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
|
3420 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3421 p = mem_root; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3422 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
|
3423 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
|
3424 return p; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3427 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3428 /* 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
|
3429 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
|
3430 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
|
3431 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3432 static struct mem_node * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3433 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
|
3434 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3435 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
|
3436 |
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 (min_heap_address == NULL || start < min_heap_address) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3438 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
|
3439 if (max_heap_address == NULL || end > max_heap_address) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3440 max_heap_address = end; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3441 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3442 /* 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
|
3443 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
|
3444 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
|
3445 c = mem_root; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3446 parent = NULL; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3447 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3448 #if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3449 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3450 while (c != MEM_NIL) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3451 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3452 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
|
3453 abort (); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3454 parent = c; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3455 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
|
3456 } |
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 #else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3459 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3460 while (c != MEM_NIL) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3461 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3462 parent = c; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3463 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
|
3464 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3465 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3466 #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
|
3467 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3468 /* Create a new node. */ |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3469 #ifdef GC_MALLOC_CHECK |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3470 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
|
3471 if (x == NULL) |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3472 abort (); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3473 #else |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3474 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
|
3475 #endif |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3476 x->start = start; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3477 x->end = end; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3478 x->type = type; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3479 x->parent = parent; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3480 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
|
3481 x->color = MEM_RED; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3482 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3483 /* 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
|
3484 if (parent) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3485 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3486 if (start < parent->start) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3487 parent->left = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3488 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3489 parent->right = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3490 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3491 else |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3492 mem_root = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3493 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3494 /* 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
|
3495 mem_insert_fixup (x); |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3496 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3497 return x; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3500 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3501 /* 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
|
3502 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
|
3503 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3504 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3505 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
|
3506 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3507 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
|
3508 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3509 /* 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
|
3510 red-black tree property #3. */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3511 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3512 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
|
3513 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3514 /* 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
|
3515 "uncle". */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3516 struct mem_node *y = x->parent->parent->right; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3517 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3518 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
|
3519 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3520 /* 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
|
3521 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
|
3522 with the grandparent. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3523 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
|
3524 y->color = MEM_BLACK; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3525 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
|
3526 x = x->parent->parent; |
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 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3529 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3530 /* 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
|
3531 red, uncle is black. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3532 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
|
3533 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3534 x = x->parent; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3535 mem_rotate_left (x); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3536 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3537 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3538 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
|
3539 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
|
3540 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
|
3541 } |
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 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3544 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3545 /* 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
|
3546 struct mem_node *y = x->parent->parent->left; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3547 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3548 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
|
3549 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3550 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
|
3551 y->color = MEM_BLACK; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3552 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
|
3553 x = x->parent->parent; |
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 else |
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 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
|
3558 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3559 x = x->parent; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3560 mem_rotate_right (x); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3561 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3562 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3563 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
|
3564 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
|
3565 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
|
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 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3569 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3570 /* 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
|
3571 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
|
3572 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
|
3573 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3574 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3575 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3576 /* (x) (y) |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3577 / \ / \ |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3578 a (y) ===> (x) c |
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 b c a b */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3581 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3582 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3583 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
|
3584 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3585 struct mem_node *y; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3586 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3587 /* 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
|
3588 y = x->right; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3589 x->right = y->left; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3590 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
|
3591 y->left->parent = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3592 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3593 /* 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
|
3594 if (y != MEM_NIL) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3595 y->parent = x->parent; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3596 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3597 /* 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
|
3598 if (x->parent) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3599 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3600 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
|
3601 x->parent->left = y; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3602 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3603 x->parent->right = y; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3604 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3605 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3606 mem_root = y; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3607 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3608 /* 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
|
3609 y->left = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3610 if (x != MEM_NIL) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3611 x->parent = y; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3612 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3613 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3614 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3615 /* (x) (Y) |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3616 / \ / \ |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3617 (y) c ===> a (x) |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3618 / \ / \ |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3619 a b b c */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3620 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3621 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3622 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
|
3623 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3624 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
|
3625 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3626 x->left = y->right; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3627 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
|
3628 y->right->parent = x; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3629 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3630 if (y != MEM_NIL) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3631 y->parent = x->parent; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3632 if (x->parent) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3633 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3634 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
|
3635 x->parent->right = y; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3636 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3637 x->parent->left = y; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3638 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3639 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3640 mem_root = y; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3641 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3642 y->right = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3643 if (x != MEM_NIL) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3644 x->parent = y; |
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 |
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 /* 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
|
3649 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3650 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3651 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
|
3652 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3653 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
|
3654 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3655 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
|
3656 return; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3657 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3658 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
|
3659 y = z; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3660 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3661 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3662 y = z->right; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3663 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
|
3664 y = y->left; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3665 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3666 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3667 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
|
3668 x = y->left; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3669 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3670 x = y->right; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3671 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3672 x->parent = y->parent; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3673 if (y->parent) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3674 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3675 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
|
3676 y->parent->left = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3677 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3678 y->parent->right = x; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3679 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3680 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3681 mem_root = x; |
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 if (y != z) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3684 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3685 z->start = y->start; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3686 z->end = y->end; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3687 z->type = y->type; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3688 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3689 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3690 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
|
3691 mem_delete_fixup (x); |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3692 |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3693 #ifdef GC_MALLOC_CHECK |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3694 _free_internal (y); |
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3695 #else |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3696 xfree (y); |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3697 #endif |
27738
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3700 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3701 /* 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
|
3702 deletion. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3703 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3704 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3705 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
|
3706 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3707 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
|
3708 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3709 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
|
3710 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3711 struct mem_node *w = x->parent->right; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3712 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3713 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
|
3714 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3715 w->color = MEM_BLACK; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3716 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
|
3717 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
|
3718 w = x->parent->right; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3719 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3720 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3721 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
|
3722 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3723 w->color = MEM_RED; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3724 x = x->parent; |
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 else |
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 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
|
3729 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3730 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
|
3731 w->color = MEM_RED; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3732 mem_rotate_right (w); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3733 w = x->parent->right; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3734 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3735 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
|
3736 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
|
3737 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
|
3738 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
|
3739 x = mem_root; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3740 } |
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 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3743 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3744 struct mem_node *w = x->parent->left; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3745 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3746 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
|
3747 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3748 w->color = MEM_BLACK; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3749 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
|
3750 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
|
3751 w = x->parent->left; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3752 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3753 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3754 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
|
3755 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3756 w->color = MEM_RED; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3757 x = x->parent; |
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 else |
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 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
|
3762 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3763 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
|
3764 w->color = MEM_RED; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3765 mem_rotate_left (w); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3766 w = x->parent->left; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3767 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3768 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3769 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
|
3770 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
|
3771 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
|
3772 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
|
3773 x = mem_root; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3774 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3775 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3776 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3777 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3778 x->color = MEM_BLACK; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3781 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3782 /* 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
|
3783 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
|
3784 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3785 static INLINE int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3786 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
|
3787 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3788 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
|
3789 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3790 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
|
3791 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
|
3792 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3793 /* 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
|
3794 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
|
3795 return (offset >= 0 |
184d1fb71cc1
(live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents:
36487
diff
changeset
|
3796 && offset % sizeof b->strings[0] == 0 |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3797 && 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
|
3798 && ((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
|
3799 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3800 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3801 return 0; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3804 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3805 /* 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
|
3806 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
|
3807 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3808 static INLINE int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3809 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
|
3810 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3811 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
|
3812 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3813 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
|
3814 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
|
3815 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3816 /* 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
|
3817 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
|
3818 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
|
3819 return (offset >= 0 |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3820 && 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
|
3821 && 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
|
3822 && (b != cons_block |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3823 || 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
|
3824 && !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
|
3825 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3826 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3827 return 0; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3830 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3831 /* 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
|
3832 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
|
3833 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3834 static INLINE int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3835 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
|
3836 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3837 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
|
3838 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3839 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
|
3840 ptrdiff_t offset = (char *) p - (char *) &b->symbols[0]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3841 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3842 /* 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
|
3843 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
|
3844 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
|
3845 return (offset >= 0 |
184d1fb71cc1
(live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents:
36487
diff
changeset
|
3846 && offset % sizeof b->symbols[0] == 0 |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3847 && 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
|
3848 && (b != symbol_block |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3849 || 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
|
3850 && !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
|
3851 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3852 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3853 return 0; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3856 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3857 /* 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
|
3858 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
|
3859 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3860 static INLINE int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3861 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
|
3862 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3863 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
|
3864 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3865 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
|
3866 ptrdiff_t offset = (char *) p - (char *) &b->floats[0]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3867 |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
3868 /* 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
|
3869 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
|
3870 return (offset >= 0 |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3871 && 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
|
3872 && 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
|
3873 && (b != float_block |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
3874 || 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
|
3875 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3876 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3877 return 0; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3880 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3881 /* 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
|
3882 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
|
3883 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3884 static INLINE int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3885 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
|
3886 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3887 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
|
3888 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3889 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
|
3890 ptrdiff_t offset = (char *) p - (char *) &b->markers[0]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3891 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3892 /* 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
|
3893 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
|
3894 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
|
3895 return (offset >= 0 |
184d1fb71cc1
(live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents:
36487
diff
changeset
|
3896 && offset % sizeof b->markers[0] == 0 |
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3897 && 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
|
3898 && (b != marker_block |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3899 || offset / sizeof b->markers[0] < marker_block_index) |
85344
99492f857499
(free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85329
diff
changeset
|
3900 && ((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
|
3901 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3902 else |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3903 return 0; |
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 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3906 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3907 /* 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
|
3908 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
|
3909 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3910 static INLINE int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3911 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
|
3912 { |
84978
33b7fe948502
(enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84977
diff
changeset
|
3913 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
|
3914 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3915 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3916 |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
3917 /* 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
|
3918 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
|
3919 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3920 static INLINE int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3921 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
|
3922 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3923 /* 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
|
3924 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
|
3925 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
|
3926 && p == m->start |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3927 && !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
|
3928 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3929 |
32700
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3930 #endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */ |
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3931 |
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3932 #if GC_MARK_STACK |
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3933 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3934 #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
|
3935 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3936 /* 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
|
3937 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
|
3938 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3939 #define MAX_ZOMBIES 10 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3940 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
|
3941 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3942 /* Number of zombie objects. */ |
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 static int nzombies; |
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 /* Number of garbage collections. */ |
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 static int ngcs; |
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 /* 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
|
3951 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3952 static double avg_zombies; |
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 /* 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
|
3955 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3956 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
|
3957 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3958 /* 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
|
3959 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3960 static double avg_live; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3961 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3962 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
|
3963 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
|
3964 (void) |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3965 { |
49357 | 3966 Lisp_Object args[8], zombie_list = Qnil; |
3967 int i; | |
3968 for (i = 0; i < nzombies; i++) | |
3969 zombie_list = Fcons (zombies[i], zombie_list); | |
3970 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
|
3971 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
|
3972 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
|
3973 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
|
3974 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
|
3975 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
|
3976 args[6] = make_number (max_zombies); |
49357 | 3977 args[7] = zombie_list; |
3978 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
|
3979 } |
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 #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
|
3982 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3983 |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
3984 /* 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
|
3985 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
3986 static INLINE void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
3987 mark_maybe_object (Lisp_Object obj) |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
3988 { |
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
|
3989 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
|
3990 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
|
3991 |
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 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
|
3993 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
|
3994 |
f736e5e4fef4
* alloc.c (mark_maybe_object): Return early if given a Lisp integer (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents:
111632
diff
changeset
|
3995 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
|
3996 m = mem_find (po); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3997 |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
3998 if (m != MEM_NIL) |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
3999 { |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4000 int mark_p = 0; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4001 |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
4002 switch (XTYPE (obj)) |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4003 { |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4004 case Lisp_String: |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4005 mark_p = (live_string_p (m, po) |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4006 && !STRING_MARKED_P ((struct Lisp_String *) po)); |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4007 break; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4008 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4009 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
|
4010 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
|
4011 break; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4012 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4013 case Lisp_Symbol: |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4014 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
|
4015 break; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4016 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4017 case Lisp_Float: |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
4018 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
|
4019 break; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4020 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4021 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
|
4022 /* 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
|
4023 buffer because checking that dereferences the pointer |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4024 PO which might point anywhere. */ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4025 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
|
4026 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
|
4027 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
|
4028 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
|
4029 break; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4030 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4031 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
|
4032 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
|
4033 break; |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4034 |
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
|
4035 default: |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4036 break; |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4037 } |
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 (mark_p) |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4040 { |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4041 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4042 if (nzombies < MAX_ZOMBIES) |
49357 | 4043 zombies[nzombies] = obj; |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4044 ++nzombies; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4045 #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
|
4046 mark_object (obj); |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4047 } |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4048 } |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4049 } |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4050 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4051 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4052 /* 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
|
4053 marked. */ |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4054 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4055 static INLINE void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4056 mark_maybe_pointer (void *p) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4057 { |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4058 struct mem_node *m; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4059 |
81798
3b39669cb653
(mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
81272
diff
changeset
|
4060 /* 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
|
4061 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
|
4062 #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
|
4063 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
|
4064 #else |
3b39669cb653
(mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
81272
diff
changeset
|
4065 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
|
4066 #endif |
3b39669cb653
(mark_maybe_pointer): Enforce mult-of-8 alignment when using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
81272
diff
changeset
|
4067 ) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4068 return; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4069 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4070 m = mem_find (p); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4071 if (m != MEM_NIL) |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4072 { |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4073 Lisp_Object obj = Qnil; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4074 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4075 switch (m->type) |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4076 { |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4077 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
|
4078 /* Nothing to do; not a pointer to Lisp memory. */ |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4079 break; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4080 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4081 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
|
4082 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
|
4083 XSETVECTOR (obj, p); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4084 break; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4085 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4086 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
|
4087 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
|
4088 XSETCONS (obj, p); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4089 break; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4090 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4091 case MEM_TYPE_STRING: |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4092 if (live_string_p (m, p) |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4093 && !STRING_MARKED_P ((struct Lisp_String *) p)) |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4094 XSETSTRING (obj, p); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4095 break; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4096 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4097 case MEM_TYPE_MISC: |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4098 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
|
4099 XSETMISC (obj, p); |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4100 break; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4101 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4102 case MEM_TYPE_SYMBOL: |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4103 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
|
4104 XSETSYMBOL (obj, p); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4105 break; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4106 |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4107 case MEM_TYPE_FLOAT: |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
4108 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
|
4109 XSETFLOAT (obj, p); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4110 break; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4111 |
84978
33b7fe948502
(enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84977
diff
changeset
|
4112 case MEM_TYPE_VECTORLIKE: |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4113 if (live_vector_p (m, p)) |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4114 { |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4115 Lisp_Object tem; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4116 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
|
4117 if (!SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem))) |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4118 obj = tem; |
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 break; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4121 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4122 default: |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4123 abort (); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4124 } |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4125 |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
4126 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
|
4127 mark_object (obj); |
36435
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 } |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4130 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4131 |
73964
b684c6771753
(mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72537
diff
changeset
|
4132 /* 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
|
4133 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
|
4134 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4135 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4136 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
|
4137 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4138 Lisp_Object *p; |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4139 void **pp; |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4140 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4141 #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
|
4142 nzombies = 0; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4143 #endif |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4144 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4145 /* 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
|
4146 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
|
4147 if (end < start) |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4148 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4149 void *tem = start; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4150 start = end; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4151 end = tem; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4152 } |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4153 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4154 /* 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
|
4155 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
|
4156 mark_maybe_object (*p); |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4157 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4158 /* 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
|
4159 situations, the C compiler optimizes Lisp objects away, so that |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4160 only a pointer to them remains. Example: |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4161 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4162 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
|
4163 () |
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4164 { |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4165 Lisp_Object obj = build_string ("test"); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4166 struct Lisp_String *s = XSTRING (obj); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4167 Fgarbage_collect (); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4168 fprintf (stderr, "test `%s'\n", s->data); |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4169 return Qnil; |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4170 } |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4171 |
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4172 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
|
4173 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
|
4174 pointer `s'. */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4175 |
73964
b684c6771753
(mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72537
diff
changeset
|
4176 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
|
4177 mark_maybe_pointer (*pp); |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4178 } |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4179 |
48316 | 4180 /* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in |
4181 the GCC system configuration. In gcc 3.2, the only systems for | |
4182 which this is so are i386-sco5 non-ELF, i386-sysv3 (maybe included | |
4183 by others?) and ns32k-pc532-min. */ | |
28365
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 #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
|
4186 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4187 static int setjmp_tested_p, longjmps_done; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4188 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4189 #define SETJMP_WILL_LIKELY_WORK "\ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4190 \n\ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4191 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
|
4192 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
|
4193 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
|
4194 \n\ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4195 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
|
4196 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
|
4197 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
|
4198 \n\ |
43200
4082674ce69b
(SETJMP_WILL_LIKELY_WORK, SETJMP_WILL_NOT_WORK):
Kim F. Storm <storm@cua.dk>
parents:
43161
diff
changeset
|
4199 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
|
4200 " |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4201 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4202 #define SETJMP_WILL_NOT_WORK "\ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4203 \n\ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4204 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
|
4205 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
|
4206 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
|
4207 solution for your system.\n\ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4208 \n\ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4209 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
|
4210 try to find a way to make it work on your system.\n\ |
48316 | 4211 \n\ |
4212 Note that you may get false negatives, depending on the compiler.\n\ | |
4213 In particular, you need to use -O with GCC for this test.\n\ | |
4214 \n\ | |
43200
4082674ce69b
(SETJMP_WILL_LIKELY_WORK, SETJMP_WILL_NOT_WORK):
Kim F. Storm <storm@cua.dk>
parents:
43161
diff
changeset
|
4215 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
|
4216 " |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4217 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4218 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4219 /* 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
|
4220 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
|
4221 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
|
4222 conservative stack marking. Only the sources or a disassembly |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4223 can prove that. */ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4224 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4225 static void |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4226 test_setjmp () |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4227 { |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4228 char buf[10]; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4229 register int x; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4230 jmp_buf jbuf; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4231 int result = 0; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4232 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4233 /* Arrange for X to be put in a register. */ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4234 sprintf (buf, "1"); |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4235 x = strlen (buf); |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4236 x = 2 * x - 1; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4237 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4238 setjmp (jbuf); |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4239 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
|
4240 { |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4241 /* 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
|
4242 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4243 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
|
4244 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
|
4245 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
|
4246 isn't sure. |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4247 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4248 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
|
4249 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
|
4250 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4251 if (x == 1) |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4252 fprintf (stderr, SETJMP_WILL_LIKELY_WORK); |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4253 else |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4254 { |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4255 fprintf (stderr, SETJMP_WILL_NOT_WORK); |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4256 exit (1); |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4257 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4258 } |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4259 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4260 ++longjmps_done; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4261 x = 2; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4262 if (longjmps_done == 1) |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4263 longjmp (jbuf, 1); |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4264 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4265 |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4266 #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
|
4267 |
27738
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 #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
|
4270 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4271 /* 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
|
4272 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4273 static void |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4274 check_gcpros () |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4275 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4276 struct gcpro *p; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4277 int i; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4278 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4279 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
|
4280 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
|
4281 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
|
4282 /* 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
|
4283 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
|
4284 abort (); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4285 } |
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 #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
|
4288 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4289 static void |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4290 dump_zombies () |
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 int i; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4293 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4294 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
|
4295 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
|
4296 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4297 fprintf (stderr, " %d = ", i); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4298 debug_print (zombies[i]); |
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 } |
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 #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
|
4303 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4304 |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4305 /* Mark live Lisp objects on the C stack. |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4306 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4307 There are several system-dependent problems to consider when |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4308 porting this to new architectures: |
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 Processor Registers |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4311 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4312 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
|
4313 variables or are used to pass parameters. |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4314 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4315 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
|
4316 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
|
4317 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
|
4318 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4319 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
|
4320 implementation assumes that calling setjmp saves registers we need |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4321 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
|
4322 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
|
4323 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
|
4324 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4325 Stack Layout |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4326 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4327 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
|
4328 For example, the stack might look like this |
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 +----------------+ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4331 | Lisp_Object | size = 4 |
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 | something else | size = 2 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4334 +----------------+ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4335 | Lisp_Object | size = 4 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4336 +----------------+ |
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 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4339 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
|
4340 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
|
4341 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
|
4342 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
|
4343 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
|
4344 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
|
4345 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
|
4346 from the stack start. |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4347 |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4348 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
|
4349 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
|
4350 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4351 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4352 mark_stack (void) |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4353 { |
43160
630c8b6deafd
(mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents:
43005
diff
changeset
|
4354 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
|
4355 /* 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
|
4356 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
|
4357 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
|
4358 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
|
4359 } j; |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4360 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
|
4361 void *end; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4362 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4363 /* 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
|
4364 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
|
4365 /* 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
|
4366 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
|
4367 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
|
4368 #ifdef __sparc__ |
101689
697627d7beda
(mark_stack): Properly conditionalize previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
101387
diff
changeset
|
4369 #if defined (__sparc64__) && defined (__FreeBSD__) |
697627d7beda
(mark_stack): Properly conditionalize previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
101387
diff
changeset
|
4370 /* 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
|
4371 asm ("flushw"); |
b19b16732fb0
(mark_stack): Use "flushw" instead of "ta 3" assembly call for
Chong Yidong <cyd@stupidchicken.com>
parents:
100951
diff
changeset
|
4372 #else |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4373 asm ("ta 3"); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4374 #endif |
101387
b19b16732fb0
(mark_stack): Use "flushw" instead of "ta 3" assembly call for
Chong Yidong <cyd@stupidchicken.com>
parents:
100951
diff
changeset
|
4375 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4376 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4377 /* 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
|
4378 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
|
4379 pass parameters. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4380 #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
|
4381 GC_SAVE_REGISTERS_ON_STACK (end); |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4382 #else /* not GC_SAVE_REGISTERS_ON_STACK */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4383 |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4384 #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
|
4385 setjmp will definitely work, test it |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4386 and print a message with the result |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4387 of the test. */ |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4388 if (!setjmp_tested_p) |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4389 { |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4390 setjmp_tested_p = 1; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4391 test_setjmp (); |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4392 } |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4393 #endif /* GC_SETJMP_WORKS */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4394 |
73964
b684c6771753
(mark_memory): New argument OFFSET. All uses changed.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72537
diff
changeset
|
4395 setjmp (j.j); |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4396 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
|
4397 #endif /* not GC_SAVE_REGISTERS_ON_STACK */ |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4398 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4399 /* 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
|
4400 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
|
4401 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
|
4402 #ifndef GC_LISP_OBJECT_ALIGNMENT |
49414
668c96afa702
(mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents:
49357
diff
changeset
|
4403 #ifdef __GNUC__ |
668c96afa702
(mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents:
49357
diff
changeset
|
4404 #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
|
4405 #else |
43160
630c8b6deafd
(mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents:
43005
diff
changeset
|
4406 #define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object) |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4407 #endif |
49414
668c96afa702
(mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents:
49357
diff
changeset
|
4408 #endif |
43161
8a549ab185a2
Fix thinko in last change.
Andreas Schwab <schwab@suse.de>
parents:
43160
diff
changeset
|
4409 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
|
4410 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
|
4411 /* 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
|
4412 ia64. */ |
ff0c144203a1
(mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents:
57137
diff
changeset
|
4413 #ifdef GC_MARK_SECONDARY_STACK |
ff0c144203a1
(mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents:
57137
diff
changeset
|
4414 GC_MARK_SECONDARY_STACK (); |
ff0c144203a1
(mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents:
57137
diff
changeset
|
4415 #endif |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4416 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4417 #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
|
4418 check_gcpros (); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4419 #endif |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4420 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4421 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4422 #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
|
4423 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4424 |
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4425 /* 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
|
4426 static int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4427 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
|
4428 { |
72288 | 4429 #ifdef WINDOWSNT |
4430 return w32_valid_pointer_p (p, 16); | |
4431 #else | |
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4432 int fd; |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4433 |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4434 /* 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
|
4435 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
|
4436 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
|
4437 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
|
4438 |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4439 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
|
4440 { |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4441 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
|
4442 emacs_close (fd); |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4443 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
|
4444 return valid; |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4445 } |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4446 |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4447 return -1; |
72288 | 4448 #endif |
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4449 } |
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4450 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4451 /* 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
|
4452 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
|
4453 Return -1 if we cannot validate OBJ. |
67494
28fd92314a04
Comment and whitespace changes.
Richard M. Stallman <rms@gnu.org>
parents:
67216
diff
changeset
|
4454 This function can be quite slow, |
28fd92314a04
Comment and whitespace changes.
Richard M. Stallman <rms@gnu.org>
parents:
67216
diff
changeset
|
4455 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
|
4456 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4457 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4458 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
|
4459 { |
67216
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
4460 void *p; |
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4461 #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
|
4462 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
|
4463 #endif |
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4464 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4465 if (INTEGERP (obj)) |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4466 return 1; |
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 p = (void *) XPNTR (obj); |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4469 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
|
4470 return 1; |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4471 |
67216
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
4472 #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
|
4473 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
|
4474 #else |
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
4475 |
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4476 m = mem_find (p); |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4477 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4478 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
|
4479 { |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4480 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
|
4481 if (valid <= 0) |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4482 return valid; |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4483 |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4484 if (SUBRP (obj)) |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4485 return 1; |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4486 |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4487 return 0; |
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4488 } |
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4489 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4490 switch (m->type) |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4491 { |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4492 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
|
4493 return 0; |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4494 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4495 case MEM_TYPE_BUFFER: |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4496 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
|
4497 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4498 case MEM_TYPE_CONS: |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4499 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
|
4500 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4501 case MEM_TYPE_STRING: |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4502 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
|
4503 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4504 case MEM_TYPE_MISC: |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4505 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
|
4506 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4507 case MEM_TYPE_SYMBOL: |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4508 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
|
4509 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4510 case MEM_TYPE_FLOAT: |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4511 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
|
4512 |
84978
33b7fe948502
(enum mem_type): Replace all vector subtypes -> MEM_TYPE_VECTORLIKE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84977
diff
changeset
|
4513 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
|
4514 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
|
4515 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4516 default: |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4517 break; |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4518 } |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4519 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4520 return 0; |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4521 #endif |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4522 } |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4523 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4524 |
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4525 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4526 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4527 /*********************************************************************** |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4528 Pure Storage Management |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4529 ***********************************************************************/ |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4530 |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4531 /* 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
|
4532 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
|
4533 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
|
4534 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4535 static POINTER_TYPE * |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4536 pure_alloc (size_t size, int type) |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4537 { |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4538 POINTER_TYPE *result; |
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4539 #ifdef USE_LSB_TAG |
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4540 size_t alignment = (1 << GCTYPEBITS); |
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4541 #else |
49159
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4542 size_t alignment = sizeof (EMACS_INT); |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4543 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4544 /* Give Lisp_Floats an extra alignment. */ |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4545 if (type == Lisp_Float) |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4546 { |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4547 #if defined __GNUC__ && __GNUC__ >= 2 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4548 alignment = __alignof (struct Lisp_Float); |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4549 #else |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4550 alignment = sizeof (struct Lisp_Float); |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4551 #endif |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4552 } |
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4553 #endif |
49159
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4554 |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4555 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
|
4556 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
|
4557 { |
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
|
4558 /* 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
|
4559 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
|
4560 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
|
4561 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
|
4562 } |
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
|
4563 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
|
4564 { |
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
|
4565 /* 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
|
4566 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
|
4567 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
|
4568 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
|
4569 } |
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 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
|
4571 |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4572 if (pure_bytes_used <= pure_size) |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4573 return result; |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4574 |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4575 /* Don't allocate a large amount here, |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4576 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
|
4577 might not be usable. */ |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4578 purebeg = (char *) xmalloc (10000); |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4579 pure_size = 10000; |
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4580 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
|
4581 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
|
4582 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
|
4583 goto again; |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4584 } |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4585 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4586 |
44149
a3e6cfa20afd
(check_pure_size): Update the comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
44100
diff
changeset
|
4587 /* 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
|
4588 |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4589 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4590 check_pure_size (void) |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4591 { |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4592 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
|
4593 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
|
4594 (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
|
4595 } |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4596 |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4597 |
72114
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4598 /* 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
|
4599 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
|
4600 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
|
4601 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4602 static char * |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
4603 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
|
4604 { |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
4605 int i; |
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
4606 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
|
4607 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
|
4608 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
|
4609 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4610 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
|
4611 return NULL; |
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 /* 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
|
4614 skip = nbytes + 1; |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4615 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
|
4616 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
|
4617 |
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 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
|
4619 while (--skip > 0) |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4620 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
|
4621 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4622 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
|
4623 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4624 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
|
4625 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
|
4626 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4627 /* 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
|
4628 use of `infinity'. */ |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4629 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
|
4630 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
|
4631 |
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
|
4632 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
|
4633 start = 0; |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4634 do |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4635 { |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4636 /* 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
|
4637 do |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4638 { |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4639 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
|
4640 } |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4641 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
|
4642 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4643 if (start < infinity) |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4644 /* 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
|
4645 return NULL; |
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 /* 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
|
4648 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
|
4649 start -= infinity; |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4650 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4651 /* 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
|
4652 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
|
4653 /* Found. */ |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4654 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
|
4655 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4656 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
|
4657 } |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4658 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
|
4659 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4660 return NULL; |
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 |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4663 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4664 /* 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
|
4665 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
|
4666 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
|
4667 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4668 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
|
4669 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
|
4670 string; then the string is not protected from gc. */ |
300 | 4671 |
4672 Lisp_Object | |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
4673 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
|
4674 EMACS_INT nchars, EMACS_INT nbytes, int multibyte) |
300 | 4675 { |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4676 Lisp_Object string; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4677 struct Lisp_String *s; |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4678 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4679 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
|
4680 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
|
4681 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
|
4682 { |
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4683 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
|
4684 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
|
4685 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
|
4686 } |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4687 s->size = nchars; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4688 s->size_byte = multibyte ? nbytes : -1; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4689 s->intervals = NULL_INTERVAL; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4690 XSETSTRING (string, s); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4691 return string; |
300 | 4692 } |
4693 | |
105871
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4694 /* 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
|
4695 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
|
4696 |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4697 Lisp_Object |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4698 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
|
4699 { |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4700 Lisp_Object string; |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4701 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
|
4702 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
|
4703 |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4704 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
|
4705 s->size = nchars; |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4706 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
|
4707 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
|
4708 s->intervals = NULL_INTERVAL; |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4709 XSETSTRING (string, s); |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4710 return string; |
1fa408e42f53
* alloc.c (make_pure_c_string): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
4711 } |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4712 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4713 /* 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
|
4714 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
|
4715 |
300 | 4716 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4717 pure_cons (Lisp_Object car, Lisp_Object cdr) |
300 | 4718 { |
4719 register Lisp_Object new; | |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4720 struct Lisp_Cons *p; |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4721 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4722 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
|
4723 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
|
4724 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
|
4725 XSETCDR (new, Fpurecopy (cdr)); |
300 | 4726 return new; |
4727 } | |
4728 | |
4729 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4730 /* 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
|
4731 |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
4732 static Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4733 make_pure_float (double num) |
300 | 4734 { |
4735 register Lisp_Object new; | |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4736 struct Lisp_Float *p; |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4737 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4738 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
|
4739 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
|
4740 XFLOAT_INIT (new, num); |
300 | 4741 return new; |
4742 } | |
4743 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4744 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4745 /* 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
|
4746 pure space. */ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4747 |
300 | 4748 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4749 make_pure_vector (EMACS_INT len) |
300 | 4750 { |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4751 Lisp_Object new; |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4752 struct Lisp_Vector *p; |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4753 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
|
4754 |
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4755 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
|
4756 XSETVECTOR (new, p); |
300 | 4757 XVECTOR (new)->size = len; |
4758 return new; | |
4759 } | |
4760 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4761 |
300 | 4762 DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0, |
68741
2892a36e596e
(Fmake_bool_vector, Fpurecopy): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents:
68430
diff
changeset
|
4763 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
|
4764 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
|
4765 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
|
4766 (register Lisp_Object obj) |
300 | 4767 { |
485 | 4768 if (NILP (Vpurify_flag)) |
300 | 4769 return obj; |
4770 | |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4771 if (PURE_POINTER_P (XPNTR (obj))) |
300 | 4772 return obj; |
4773 | |
107895
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4774 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */ |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4775 { |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4776 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil); |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4777 if (!NILP (tmp)) |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4778 return tmp; |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4779 } |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4780 |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4781 if (CONSP (obj)) |
107895
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4782 obj = pure_cons (XCAR (obj), XCDR (obj)); |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4783 else if (FLOATP (obj)) |
107895
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4784 obj = make_pure_float (XFLOAT_DATA (obj)); |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4785 else if (STRINGP (obj)) |
107895
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4786 obj = make_pure_string (SDATA (obj), SCHARS (obj), |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4787 SBYTES (obj), |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4788 STRING_MULTIBYTE (obj)); |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4789 else if (COMPILEDP (obj) || VECTORP (obj)) |
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4790 { |
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4791 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
|
4792 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
|
4793 EMACS_INT size; |
300 | 4794 |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4795 size = XVECTOR (obj)->size; |
10427
5faba1b094d5
(Fpurecopy): Mask size field when copying pseudovector.
Karl Heuer <kwzh@gnu.org>
parents:
10414
diff
changeset
|
4796 if (size & PSEUDOVECTOR_FLAG) |
5faba1b094d5
(Fpurecopy): Mask size field when copying pseudovector.
Karl Heuer <kwzh@gnu.org>
parents:
10414
diff
changeset
|
4797 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
|
4798 vec = XVECTOR (make_pure_vector (size)); |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4799 for (i = 0; i < size; i++) |
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4800 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]); |
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4801 if (COMPILEDP (obj)) |
85329
ad9922c079e4
(Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85328
diff
changeset
|
4802 { |
ad9922c079e4
(Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85328
diff
changeset
|
4803 XSETPVECTYPE (vec, PVEC_COMPILED); |
ad9922c079e4
(Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85328
diff
changeset
|
4804 XSETCOMPILED (obj, vec); |
ad9922c079e4
(Fpurecopy): Set the pvec tag on pseudo vectors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85328
diff
changeset
|
4805 } |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4806 else |
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4807 XSETVECTOR (obj, vec); |
300 | 4808 } |
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4809 else if (MARKERP (obj)) |
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4810 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
|
4811 else |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4812 /* Not purified, don't hash-cons. */ |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4813 return obj; |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4814 |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4815 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */ |
265966b778f9
Hash-cons pure data.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107435
diff
changeset
|
4816 Fputhash (obj, obj, Vpurify_flag); |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4817 |
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4818 return obj; |
300 | 4819 } |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4820 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4821 |
300 | 4822 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4823 /*********************************************************************** |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4824 Protection from GC |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4825 ***********************************************************************/ |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4826 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4827 /* 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
|
4828 VARADDRESS. */ |
300 | 4829 |
4830 void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4831 staticpro (Lisp_Object *varaddress) |
300 | 4832 { |
4833 staticvec[staticidx++] = varaddress; | |
4834 if (staticidx >= NSTATICS) | |
4835 abort (); | |
4836 } | |
4837 | |
4838 | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4839 /*********************************************************************** |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4840 Protection from GC |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4841 ***********************************************************************/ |
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
4842 |
11374
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
4843 /* Temporarily prevent garbage collection. */ |
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
4844 |
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
4845 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
4846 inhibit_garbage_collection (void) |
11374
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
4847 { |
46293
1fb8f75062c6
Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
46285
diff
changeset
|
4848 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
|
4849 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
|
4850 |
a555c6419185
(inhibit_garbage_collection): Don't exceed value an int can hold.
Andreas Schwab <schwab@suse.de>
parents:
41831
diff
changeset
|
4851 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
|
4852 return count; |
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
4853 } |
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
4854 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4855 |
300 | 4856 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
|
4857 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
|
4858 Garbage collection happens automatically if you cons more than |
43d663a05e2d
(Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
51779
diff
changeset
|
4859 `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
|
4860 `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
|
4861 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS) |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
4862 (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
|
4863 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS) |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
4864 (USED-STRINGS . FREE-STRINGS)) |
51788
43d663a05e2d
(Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
51779
diff
changeset
|
4865 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
|
4866 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
|
4867 (void) |
300 | 4868 { |
4869 register struct specbinding *bind; | |
4870 struct catchtag *catch; | |
4871 struct handler *handler; | |
4872 char stack_top_variable; | |
4873 register int i; | |
25343
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
4874 int message_p; |
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
4875 Lisp_Object total[8]; |
46285
3f111801efb4
Rename BINDING_STACK_SIZE to SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
45392
diff
changeset
|
4876 int count = SPECPDL_INDEX (); |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
4877 EMACS_TIME t1, t2, t3; |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
4878 |
50745
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
4879 if (abort_on_gc) |
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
4880 abort (); |
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
4881 |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4882 /* 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
|
4883 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
|
4884 if (pure_bytes_used_before_overflow) |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4885 return Qnil; |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4886 |
61252
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
4887 CHECK_CONS_LIST (); |
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
4888 |
59047
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4889 /* 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
|
4890 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
|
4891 { |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4892 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
|
4893 |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4894 while (nextb) |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4895 { |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4896 /* 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
|
4897 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
|
4898 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
|
4899 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
|
4900 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
|
4901 truncate_undo_list (nextb); |
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 /* 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
|
4904 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
|
4905 && ! nextb->text->inhibit_shrinking) |
59047
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 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
|
4908 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
|
4909 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
|
4910 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
|
4911 |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4912 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
|
4913 { |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4914 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
|
4915 current_buffer = nextb; |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4916 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
|
4917 current_buffer = save_current; |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4918 } |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4919 } |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4920 |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4921 nextb = nextb->next; |
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 } |
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 EMACS_GET_TIME (t1); |
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
4926 |
11892
6be0b7a0ac44
(Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents:
11727
diff
changeset
|
4927 /* 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
|
4928 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
|
4929 consing_since_gc = 0; |
6be0b7a0ac44
(Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents:
11727
diff
changeset
|
4930 |
25343
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
4931 /* 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
|
4932 message_p = push_message (); |
47391
1afd007f814f
(Fgarbage_collect): Use pop_message_unwind.
Richard M. Stallman <rms@gnu.org>
parents:
47185
diff
changeset
|
4933 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
|
4934 |
300 | 4935 /* Save a copy of the contents of the stack, for debugging. */ |
4936 #if MAX_SAVE_STACK > 0 | |
485 | 4937 if (NILP (Vpurify_flag)) |
300 | 4938 { |
4939 i = &stack_top_variable - stack_bottom; | |
4940 if (i < 0) i = -i; | |
4941 if (i < MAX_SAVE_STACK) | |
4942 { | |
4943 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
|
4944 stack_copy = (char *) xmalloc (stack_copy_size = i); |
300 | 4945 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
|
4946 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i)); |
300 | 4947 if (stack_copy) |
4948 { | |
8817
48ff00bebef6
(pure, pure_size): Use EMACS_INT.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
4949 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
|
4950 memcpy (stack_copy, stack_bottom, i); |
300 | 4951 else |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109139
diff
changeset
|
4952 memcpy (stack_copy, &stack_top_variable, i); |
300 | 4953 } |
4954 } | |
4955 } | |
4956 #endif /* MAX_SAVE_STACK > 0 */ | |
4957 | |
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
4958 if (garbage_collection_messages) |
10395
c121703d35c7
(Fgarbage_collect): Don't log the GC message.
Karl Heuer <kwzh@gnu.org>
parents:
10389
diff
changeset
|
4959 message1_nolog ("Garbage collecting..."); |
300 | 4960 |
23534
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
4961 BLOCK_INPUT; |
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
4962 |
22220
a0cd311af6e3
(Fgarbage_collect): Call shrink_regexp_cache.
Richard M. Stallman <rms@gnu.org>
parents:
21948
diff
changeset
|
4963 shrink_regexp_cache (); |
a0cd311af6e3
(Fgarbage_collect): Call shrink_regexp_cache.
Richard M. Stallman <rms@gnu.org>
parents:
21948
diff
changeset
|
4964 |
300 | 4965 gc_in_progress = 1; |
4966 | |
16231 | 4967 /* clear_marks (); */ |
300 | 4968 |
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
4969 /* Mark all the special slots that serve as the roots of accessibility. */ |
300 | 4970 |
4971 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
|
4972 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
|
4973 |
57098
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4974 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
|
4975 { |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4976 mark_object (bind->symbol); |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4977 mark_object (bind->old_value); |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4978 } |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83420
diff
changeset
|
4979 mark_terminals (); |
57098
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4980 mark_kboards (); |
83206 | 4981 mark_ttys (); |
57098
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4982 |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4983 #ifdef USE_GTK |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4984 { |
109139
c25c24812fb1
Convert declarations or definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109126
diff
changeset
|
4985 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
|
4986 xg_mark_data (); |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4987 } |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4988 #endif |
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
4989 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4990 #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
|
4991 || 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
|
4992 mark_stack (); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4993 #else |
51228
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
4994 { |
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
4995 register struct gcpro *tail; |
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
4996 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
|
4997 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
|
4998 mark_object (tail->var[i]); |
51228
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
4999 } |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5000 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5001 |
26364
7b0217d9259c
(Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
5002 mark_byte_stack (); |
300 | 5003 for (catch = catchlist; catch; catch = catch->next) |
5004 { | |
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
|
5005 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
|
5006 mark_object (catch->val); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5007 } |
300 | 5008 for (handler = handlerlist; handler; handler = handler->next) |
5009 { | |
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
|
5010 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
|
5011 mark_object (handler->var); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5012 } |
55798
a1bb695e9a0c
(struct backtrace): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55767
diff
changeset
|
5013 mark_backtrace (); |
300 | 5014 |
59400
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5015 #ifdef HAVE_WINDOW_SYSTEM |
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5016 mark_fringe_data (); |
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5017 #endif |
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5018 |
55667
57f4a242e8f4
(Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55635
diff
changeset
|
5019 #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
|
5020 mark_stack (); |
57f4a242e8f4
(Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55635
diff
changeset
|
5021 #endif |
57f4a242e8f4
(Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55635
diff
changeset
|
5022 |
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5023 /* 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
|
5024 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
|
5025 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
|
5026 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
|
5027 and delete them. */ |
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5028 { |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5029 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
|
5030 |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5031 while (nextb) |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5032 { |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5033 /* 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
|
5034 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
|
5035 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
|
5036 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
|
5037 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
|
5038 { |
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5039 Lisp_Object tail, prev; |
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5040 tail = nextb->undo_list; |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5041 prev = Qnil; |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5042 while (CONSP (tail)) |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5043 { |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5044 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
|
5045 && 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
|
5046 && !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
|
5047 { |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5048 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
|
5049 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
|
5050 else |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39914
diff
changeset
|
5051 { |
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5052 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
|
5053 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
|
5054 } |
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5055 } |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5056 else |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5057 { |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5058 prev = tail; |
25645
a14111a2a100
Use XCAR, XCDR, XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25544
diff
changeset
|
5059 tail = XCDR (tail); |
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5060 } |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5061 } |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
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 /* 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
|
5064 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
|
5065 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
|
5066 |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5067 nextb = nextb->next; |
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 } |
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5070 |
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5071 gc_sweep (); |
55767
ee3a30045908
(marker_blocks_pending_free): New var.
Kim F. Storm <storm@cua.dk>
parents:
55745
diff
changeset
|
5072 |
300 | 5073 /* Clear the mark bits that we set in certain root slots. */ |
5074 | |
26378
cbf297593a79
(Fgarbage_collect): Call unmark_byte_stack.
Gerd Moellmann <gerd@gnu.org>
parents:
26372
diff
changeset
|
5075 unmark_byte_stack (); |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5076 VECTOR_UNMARK (&buffer_defaults); |
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5077 VECTOR_UNMARK (&buffer_local_symbols); |
300 | 5078 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5079 #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
|
5080 dump_zombies (); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5081 #endif |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5082 |
23534
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
5083 UNBLOCK_INPUT; |
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
5084 |
61252
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
5085 CHECK_CONS_LIST (); |
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
5086 |
16231 | 5087 /* clear_marks (); */ |
300 | 5088 gc_in_progress = 0; |
5089 | |
5090 consing_since_gc = 0; | |
5091 if (gc_cons_threshold < 10000) | |
5092 gc_cons_threshold = 10000; | |
5093 | |
64267
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
5094 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
|
5095 { /* 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
|
5096 EMACS_INT total = 0; |
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5097 |
64267
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
5098 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
|
5099 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
|
5100 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
|
5101 total += total_string_size; |
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
5102 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
|
5103 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
|
5104 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
|
5105 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
|
5106 |
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5107 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
|
5108 } |
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5109 else |
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5110 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
|
5111 |
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5112 if (garbage_collection_messages) |
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5113 { |
25343
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
5114 if (message_p || minibuf_level > 0) |
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
5115 restore_message (); |
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5116 else |
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5117 message1_nolog ("Garbage collecting...done"); |
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5118 } |
300 | 5119 |
35170
a9b677239421
(Fgarbage_collect): Use a record_unwind_protect to
Gerd Moellmann <gerd@gnu.org>
parents:
34325
diff
changeset
|
5120 unbind_to (count, Qnil); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5121 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5122 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
|
5123 make_number (total_free_conses)); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5124 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
|
5125 make_number (total_free_symbols)); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5126 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
|
5127 make_number (total_free_markers)); |
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5128 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
|
5129 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
|
5130 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
|
5131 make_number (total_free_floats)); |
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5132 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
|
5133 make_number (total_free_intervals)); |
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5134 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
|
5135 make_number (total_free_strings)); |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5136 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5137 #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
|
5138 { |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5139 /* 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
|
5140 double nlive = 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5141 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5142 for (i = 0; i < 7; ++i) |
49357 | 5143 if (CONSP (total[i])) |
5144 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
|
5145 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5146 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
|
5147 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
|
5148 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
|
5149 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
|
5150 ++ngcs; |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5151 } |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5152 #endif |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5153 |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5154 if (!NILP (Vpost_gc_hook)) |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5155 { |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5156 int count = inhibit_garbage_collection (); |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5157 safe_run_hooks (Qpost_gc_hook); |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5158 unbind_to (count, Qnil); |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5159 } |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5160 |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5161 /* Accumulate statistics. */ |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5162 EMACS_GET_TIME (t2); |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5163 EMACS_SUB_TIME (t3, t2, t1); |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5164 if (FLOATP (Vgc_elapsed)) |
49911
d9ade23e09df
(Fgarbage_collect): Don't use XSETFLOAT.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49600
diff
changeset
|
5165 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
|
5166 EMACS_SECS (t3) + |
d9ade23e09df
(Fgarbage_collect): Don't use XSETFLOAT.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49600
diff
changeset
|
5167 EMACS_USECS (t3) * 1.0e-6); |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5168 gcs_done++; |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5169 |
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5170 return Flist (sizeof total / sizeof *total, total); |
300 | 5171 } |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5172 |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5173 |
25367
823e14641544
(mark_glyph_matrix): Mark strings only.
Gerd Moellmann <gerd@gnu.org>
parents:
25343
diff
changeset
|
5174 /* 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
|
5175 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
|
5176 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5177 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5178 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
|
5179 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5180 struct glyph_row *row = matrix->rows; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5181 struct glyph_row *end = row + matrix->nrows; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5182 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5183 for (; row < end; ++row) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5184 if (row->enabled_p) |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5185 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5186 int area; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5187 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
|
5188 { |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5189 struct glyph *glyph = row->glyphs[area]; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5190 struct glyph *end_glyph = glyph + row->used[area]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5191 |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5192 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
|
5193 if (STRINGP (glyph->object) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5194 && !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
|
5195 mark_object (glyph->object); |
27142
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 } |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5198 } |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5199 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5200 |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5201 /* 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
|
5202 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5203 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5204 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
|
5205 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5206 if (c) |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5207 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5208 int i, j; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5209 for (i = 0; i < c->used; ++i) |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5210 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5211 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
|
5212 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5213 if (face) |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5214 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5215 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
|
5216 mark_object (face->lface[j]); |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5217 } |
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 } |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5220 } |
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 |
300 | 5223 |
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
5224 /* 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
|
5225 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
|
5226 all the references contained in it. */ |
300 | 5227 |
1168
2b07af77d7ec
(mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents:
1114
diff
changeset
|
5228 #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
|
5229 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
|
5230 int last_marked_index; |
2b07af77d7ec
(mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents:
1114
diff
changeset
|
5231 |
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5232 /* 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
|
5233 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
|
5234 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
|
5235 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
|
5236 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
|
5237 |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5238 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5239 mark_vectorlike (struct Lisp_Vector *ptr) |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5240 { |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
5241 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
|
5242 register EMACS_UINT i; |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5243 |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5244 eassert (!VECTOR_MARKED_P (ptr)); |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5245 VECTOR_MARK (ptr); /* Else mark it */ |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5246 if (size & PSEUDOVECTOR_FLAG) |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5247 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
|
5248 |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5249 /* 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
|
5250 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
|
5251 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
|
5252 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
|
5253 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
|
5254 mark_object (ptr->contents[i]); |
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5255 } |
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5256 |
104582
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5257 /* Like mark_vectorlike but optimized for char-tables (and |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5258 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
|
5259 symbols. */ |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5260 |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5261 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5262 mark_char_table (struct Lisp_Vector *ptr) |
104582
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5263 { |
110503
fda36a325177
Fix some more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents:
110480
diff
changeset
|
5264 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
|
5265 register EMACS_UINT i; |
104582
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5266 |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5267 eassert (!VECTOR_MARKED_P (ptr)); |
104582
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5268 VECTOR_MARK (ptr); |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5269 for (i = 0; i < size; i++) |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5270 { |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5271 Lisp_Object val = ptr->contents[i]; |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5272 |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5273 if (INTEGERP (val) || SYMBOLP (val) && XSYMBOL (val)->gcmarkbit) |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5274 continue; |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5275 if (SUB_CHAR_TABLE_P (val)) |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5276 { |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5277 if (! VECTOR_MARKED_P (XVECTOR (val))) |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5278 mark_char_table (XVECTOR (val)); |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5279 } |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5280 else |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5281 mark_object (val); |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5282 } |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5283 } |
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5284 |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5285 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5286 mark_object (Lisp_Object arg) |
300 | 5287 { |
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
|
5288 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
|
5289 #ifdef GC_CHECK_MARKED_OBJECTS |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5290 void *po; |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5291 struct mem_node *m; |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5292 #endif |
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5293 int cdr_count = 0; |
300 | 5294 |
5868
a7bd57a60cb8
(mark_object): Fetch obj from *objptr at loop, not at the gotos.
Karl Heuer <kwzh@gnu.org>
parents:
5353
diff
changeset
|
5295 loop: |
300 | 5296 |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
5297 if (PURE_POINTER_P (XPNTR (obj))) |
300 | 5298 return; |
5299 | |
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
|
5300 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
|
5301 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
|
5302 last_marked_index = 0; |
2b07af77d7ec
(mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents:
1114
diff
changeset
|
5303 |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5304 /* 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
|
5305 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
|
5306 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
|
5307 #ifdef GC_CHECK_MARKED_OBJECTS |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5308 |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5309 po = (void *) XPNTR (obj); |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5310 |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5311 /* 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
|
5312 structure allocated from the heap. */ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5313 #define CHECK_ALLOCATED() \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5314 do { \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5315 m = mem_find (po); \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5316 if (m == MEM_NIL) \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5317 abort (); \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5318 } while (0) |
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 /* 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
|
5321 function LIVEP. */ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5322 #define CHECK_LIVE(LIVEP) \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5323 do { \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5324 if (!LIVEP (m, po)) \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5325 abort (); \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5326 } while (0) |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5327 |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5328 /* 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
|
5329 #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
|
5330 do { \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5331 CHECK_ALLOCATED (); \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5332 CHECK_LIVE (LIVEP); \ |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5333 } while (0) \ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5334 |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5335 #else /* not GC_CHECK_MARKED_OBJECTS */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5336 |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5337 #define CHECK_ALLOCATED() (void) 0 |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5338 #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
|
5339 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5340 |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5341 #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
|
5342 |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5343 switch (SWITCH_ENUM_CAST (XTYPE (obj))) |
300 | 5344 { |
5345 case Lisp_String: | |
5346 { | |
5347 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
|
5348 if (STRING_MARKED_P (ptr)) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5349 break; |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5350 CHECK_ALLOCATED_AND_LIVE (live_string_p); |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5351 MARK_INTERVAL_TREE (ptr->intervals); |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5352 MARK_STRING (ptr); |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
5353 #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
|
5354 /* 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
|
5355 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
|
5356 CHECK_STRING_BYTES (ptr); |
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
5357 #endif /* GC_CHECK_STRING_BYTES */ |
300 | 5358 } |
5359 break; | |
5360 | |
10009
82f3daf76995
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
10004
diff
changeset
|
5361 case Lisp_Vectorlike: |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5362 if (VECTOR_MARKED_P (XVECTOR (obj))) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5363 break; |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5364 #ifdef GC_CHECK_MARKED_OBJECTS |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5365 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
|
5366 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
|
5367 && po != &buffer_defaults |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5368 && po != &buffer_local_symbols) |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5369 abort (); |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5370 #endif /* GC_CHECK_MARKED_OBJECTS */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5371 |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5372 if (BUFFERP (obj)) |
10340
ef58c7a5a4d6
(mark_object, mark_buffer): Don't mark buffer twice.
Karl Heuer <kwzh@gnu.org>
parents:
10320
diff
changeset
|
5373 { |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5374 #ifdef GC_CHECK_MARKED_OBJECTS |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5375 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
|
5376 { |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5377 struct buffer *b; |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5378 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
|
5379 ; |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5380 if (b == NULL) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5381 abort (); |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5382 } |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5383 #endif /* GC_CHECK_MARKED_OBJECTS */ |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5384 mark_buffer (obj); |
10340
ef58c7a5a4d6
(mark_object, mark_buffer): Don't mark buffer twice.
Karl Heuer <kwzh@gnu.org>
parents:
10320
diff
changeset
|
5385 } |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5386 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
|
5387 break; |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5388 else if (COMPILEDP (obj)) |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5389 /* 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
|
5390 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
|
5391 recursion there. */ |
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5392 { |
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5393 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
|
5394 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
|
5395 register EMACS_UINT i; |
300 | 5396 |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5397 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
|
5398 VECTOR_MARK (ptr); /* Else mark it */ |
10009
82f3daf76995
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
10004
diff
changeset
|
5399 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
|
5400 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
|
5401 { |
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5402 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
|
5403 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
|
5404 } |
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
|
5405 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
|
5406 goto loop; |
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5407 } |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5408 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
|
5409 { |
32360
d8b668a486d7
(mark_object): Remove all workarounds installed on
Andreas Schwab <schwab@suse.de>
parents:
32099
diff
changeset
|
5410 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
|
5411 mark_vectorlike (XVECTOR (obj)); |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5412 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
|
5413 } |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5414 else if (WINDOWP (obj)) |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5415 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5416 register struct Lisp_Vector *ptr = XVECTOR (obj); |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5417 struct window *w = XWINDOW (obj); |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5418 mark_vectorlike (ptr); |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5419 /* 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
|
5420 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
|
5421 memory. */ |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5422 if (NILP (w->hchild) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5423 && NILP (w->vchild) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5424 && w->current_matrix) |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5425 { |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5426 mark_glyph_matrix (w->current_matrix); |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5427 mark_glyph_matrix (w->desired_matrix); |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5428 } |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5429 } |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5430 else if (HASH_TABLE_P (obj)) |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5431 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5432 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
|
5433 mark_vectorlike ((struct Lisp_Vector *)h); |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5434 /* 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
|
5435 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
|
5436 if (NILP (h->weak)) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5437 mark_object (h->key_and_value); |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5438 else |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5439 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
|
5440 } |
104582
7d47cb148b29
(mark_char_table): New function.
Kenichi Handa <handa@m17n.org>
parents:
104313
diff
changeset
|
5441 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
|
5442 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
|
5443 else |
85019
21a145f18ed2
(allocate_pseudovector): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84978
diff
changeset
|
5444 mark_vectorlike (XVECTOR (obj)); |
300 | 5445 break; |
5446 | |
5447 case Lisp_Symbol: | |
5448 { | |
32360
d8b668a486d7
(mark_object): Remove all workarounds installed on
Andreas Schwab <schwab@suse.de>
parents:
32099
diff
changeset
|
5449 register struct Lisp_Symbol *ptr = XSYMBOL (obj); |
300 | 5450 struct Lisp_Symbol *ptrx; |
5451 | |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5452 if (ptr->gcmarkbit) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5453 break; |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5454 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
|
5455 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
|
5456 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
|
5457 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
|
5458 switch (ptr->redirect) |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5459 { |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5460 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
|
5461 case SYMBOL_VARALIAS: |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5462 { |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5463 Lisp_Object tem; |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5464 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
|
5465 mark_object (tem); |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5466 break; |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5467 } |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5468 case SYMBOL_LOCALIZED: |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5469 { |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5470 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
|
5471 /* 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
|
5472 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
|
5473 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
|
5474 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
|
5475 mark_object (blv->where); |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5476 mark_object (blv->valcell); |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5477 mark_object (blv->defcell); |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5478 break; |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5479 } |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5480 case SYMBOL_FORWARDED: |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5481 /* 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
|
5482 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
|
5483 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
|
5484 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
|
5485 break; |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5486 default: abort (); |
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5487 } |
45392
f3d7ab65641f
* alloc.c (Fmake_symbol): Set symbol xname field instead of name.
Ken Raeburn <raeburn@raeburn.org>
parents:
44890
diff
changeset
|
5488 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
|
5489 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
|
5490 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname)); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5491 |
300 | 5492 ptr = ptr->next; |
5493 if (ptr) | |
5494 { | |
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
5495 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */ |
300 | 5496 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
|
5497 goto loop; |
300 | 5498 } |
5499 } | |
5500 break; | |
5501 | |
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5502 case Lisp_Misc: |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5503 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
|
5504 if (XMISCANY (obj)->gcmarkbit) |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5505 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
|
5506 XMISCANY (obj)->gcmarkbit = 1; |
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5507 |
11243
054ecfce1820
(Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents:
11048
diff
changeset
|
5508 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
|
5509 { |
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5510 |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5511 case Lisp_Misc_Marker: |
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5512 /* 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
|
5513 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
|
5514 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
|
5515 break; |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5516 |
52166
25f780eb3fd8
(mark_object): Handle Lisp_Misc_Save_Value.
Andreas Schwab <schwab@suse.de>
parents:
51985
diff
changeset
|
5517 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
|
5518 #if GC_MARK_STACK |
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5519 { |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5520 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
|
5521 /* 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
|
5522 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
|
5523 if (ptr->dogc) |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5524 { |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5525 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
|
5526 int nelt; |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5527 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
|
5528 mark_maybe_object (*p); |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5529 } |
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5530 } |
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
|
5531 #endif |
9463
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5532 break; |
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5533 |
9926
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5534 case Lisp_Misc_Overlay: |
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5535 { |
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5536 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
|
5537 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
|
5538 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
|
5539 mark_object (ptr->plist); |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5540 if (ptr->next) |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5541 { |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5542 XSETMISC (obj, ptr->next); |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5543 goto loop; |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5544 } |
9926
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5545 } |
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5546 break; |
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5547 |
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5548 default: |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5549 abort (); |
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5550 } |
300 | 5551 break; |
5552 | |
5553 case Lisp_Cons: | |
5554 { | |
5555 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
|
5556 if (CONS_MARKED_P (ptr)) |
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5557 break; |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5558 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
|
5559 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
|
5560 /* 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
|
5561 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
|
5562 { |
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
|
5563 obj = ptr->car; |
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5564 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
|
5565 goto loop; |
a9241dc503ab
(mark_object): Avoid car recursion on cons with nil in cdr.
Richard M. Stallman <rms@gnu.org>
parents:
1168
diff
changeset
|
5566 } |
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
|
5567 mark_object (ptr->car); |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5568 obj = ptr->u.cdr; |
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5569 cdr_count++; |
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5570 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
|
5571 abort (); |
300 | 5572 goto loop; |
5573 } | |
5574 | |
5575 case Lisp_Float: | |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5576 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
|
5577 FLOAT_MARK (XFLOAT (obj)); |
300 | 5578 break; |
5579 | |
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
|
5580 case_Lisp_Int: |
300 | 5581 break; |
5582 | |
5583 default: | |
5584 abort (); | |
5585 } | |
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5586 |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5587 #undef CHECK_LIVE |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5588 #undef CHECK_ALLOCATED |
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5589 #undef CHECK_ALLOCATED_AND_LIVE |
300 | 5590 } |
5591 | |
5592 /* Mark the pointers in a buffer structure. */ | |
5593 | |
5594 static void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5595 mark_buffer (Lisp_Object buf) |
300 | 5596 { |
5597 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
|
5598 register Lisp_Object *ptr, tmp; |
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5599 Lisp_Object base_buffer; |
300 | 5600 |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5601 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
|
5602 VECTOR_MARK (buffer); |
300 | 5603 |
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5604 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5605 |
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5606 /* 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
|
5607 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
|
5608 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
|
5609 |
51843
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5610 if (buffer->overlays_before) |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5611 { |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5612 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
|
5613 mark_object (tmp); |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5614 } |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5615 if (buffer->overlays_after) |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5616 { |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5617 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
|
5618 mark_object (tmp); |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5619 } |
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5620 |
91780
d097bc79fdfb
(mark_buffer): Comment fix to clarify the status of Lisp fields.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91367
diff
changeset
|
5621 /* 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
|
5622 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
|
5623 for (ptr = &buffer->name; |
300 | 5624 (char *)ptr < (char *)buffer + sizeof (struct buffer); |
5625 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
|
5626 mark_object (*ptr); |
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5627 |
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5628 /* 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
|
5629 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
|
5630 { |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5631 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
|
5632 mark_buffer (base_buffer); |
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5633 } |
300 | 5634 } |
10649
52cdd8cc8d3e
(mark_perdisplays): New function.
Karl Heuer <kwzh@gnu.org>
parents:
10581
diff
changeset
|
5635 |
84693
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5636 /* 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
|
5637 Called by the Fgarbage_collector. */ |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5638 |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5639 static void |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5640 mark_terminals (void) |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5641 { |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5642 struct terminal *t; |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5643 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
|
5644 { |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5645 eassert (t->name != NULL); |
111758
0813efd37bf9
Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents:
109278
diff
changeset
|
5646 #ifdef HAVE_WINDOW_SYSTEM |
0813efd37bf9
Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents:
109278
diff
changeset
|
5647 /* 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
|
5648 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
|
5649 gets marked. */ |
0813efd37bf9
Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents:
109278
diff
changeset
|
5650 mark_image_cache (t->image_cache); |
0813efd37bf9
Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents:
109278
diff
changeset
|
5651 #endif /* HAVE_WINDOW_SYSTEM */ |
105986
850debe3a245
(mark_object): Don't reprocess marked strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105958
diff
changeset
|
5652 if (!VECTOR_MARKED_P (t)) |
111758
0813efd37bf9
Fix image cache marking bug (Bug#6301).
Chong Yidong <cyd@stupidchicken.com>
parents:
109278
diff
changeset
|
5653 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
|
5654 } |
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 |
7ee574475f20
(enum mem_type): New member for `terminal' objects.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84602
diff
changeset
|
5657 |
10649
52cdd8cc8d3e
(mark_perdisplays): New function.
Karl Heuer <kwzh@gnu.org>
parents:
10581
diff
changeset
|
5658 |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5659 /* 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
|
5660 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
|
5661 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5662 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5663 survives_gc_p (Lisp_Object obj) |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5664 { |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5665 int survives_p; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5666 |
90970
3371fc48749b
Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
90918
diff
changeset
|
5667 switch (XTYPE (obj)) |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5668 { |
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
|
5669 case_Lisp_Int: |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5670 survives_p = 1; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5671 break; |
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 case Lisp_Symbol: |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5674 survives_p = XSYMBOL (obj)->gcmarkbit; |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5675 break; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5676 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5677 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
|
5678 survives_p = XMISCANY (obj)->gcmarkbit; |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5679 break; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5680 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5681 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
|
5682 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
|
5683 break; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5684 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5685 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
|
5686 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
|
5687 break; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5688 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5689 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
|
5690 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
|
5691 break; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5692 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5693 case Lisp_Float: |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
5694 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
|
5695 break; |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5696 |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5697 default: |
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5698 abort (); |
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 |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5701 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
|
5702 } |
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 |
300 | 5705 |
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
5706 /* Sweep: find all structures not marked, and free them. */ |
300 | 5707 |
5708 static void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
5709 gc_sweep (void) |
300 | 5710 { |
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5711 /* 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
|
5712 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
|
5713 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
|
5714 |
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5715 sweep_strings (); |
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5716 #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
|
5717 if (!noninteractive) |
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5718 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
|
5719 #endif |
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5720 |
300 | 5721 /* Put all unmarked conses on free list */ |
5722 { | |
5723 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
|
5724 struct cons_block **cprev = &cons_block; |
300 | 5725 register int lim = cons_block_index; |
5726 register int num_free = 0, num_used = 0; | |
5727 | |
5728 cons_free_list = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5729 |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5730 for (cblk = cons_block; cblk; cblk = *cprev) |
300 | 5731 { |
84816
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5732 register int i = 0; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5733 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
|
5734 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
|
5735 |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5736 /* 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
|
5737 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
|
5738 { |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5739 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
|
5740 { |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5741 /* 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
|
5742 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
|
5743 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
|
5744 } |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5745 else |
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 /* 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
|
5748 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
|
5749 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
|
5750 |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5751 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
|
5752 stop = lim - start; |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5753 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
|
5754 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
|
5755 stop += start; |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5756 |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5757 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
|
5758 { |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5759 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
|
5760 { |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5761 this_free++; |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5762 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
|
5763 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
|
5764 #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
|
5765 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
|
5766 #endif |
84816
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 else |
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 num_used++; |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5771 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
|
5772 } |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5773 } |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5774 } |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5775 } |
4d1c866492b0
(gc_sweep): Check cons cell mark bits word by word
Richard M. Stallman <rms@gnu.org>
parents:
84693
diff
changeset
|
5776 |
300 | 5777 lim = CONS_BLOCK_SIZE; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5778 /* 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
|
5779 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
|
5780 this block. */ |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5781 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
|
5782 { |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5783 *cprev = cblk->next; |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5784 /* Unhook from the free list. */ |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5785 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
|
5786 lisp_align_free (cblk); |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
5787 n_cons_blocks--; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5788 } |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5789 else |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5790 { |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5791 num_free += this_free; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5792 cprev = &cblk->next; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5793 } |
300 | 5794 } |
5795 total_conses = num_used; | |
5796 total_free_conses = num_free; | |
5797 } | |
5798 | |
5799 /* Put all unmarked floats on free list */ | |
5800 { | |
5801 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
|
5802 struct float_block **fprev = &float_block; |
300 | 5803 register int lim = float_block_index; |
5804 register int num_free = 0, num_used = 0; | |
5805 | |
5806 float_free_list = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5807 |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5808 for (fblk = float_block; fblk; fblk = *fprev) |
300 | 5809 { |
5810 register int i; | |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5811 int this_free = 0; |
300 | 5812 for (i = 0; i < lim; i++) |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
5813 if (!FLOAT_MARKED_P (&fblk->floats[i])) |
300 | 5814 { |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5815 this_free++; |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5816 fblk->floats[i].u.chain = float_free_list; |
300 | 5817 float_free_list = &fblk->floats[i]; |
5818 } | |
5819 else | |
5820 { | |
5821 num_used++; | |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
5822 FLOAT_UNMARK (&fblk->floats[i]); |
300 | 5823 } |
5824 lim = FLOAT_BLOCK_SIZE; | |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5825 /* 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
|
5826 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
|
5827 this block. */ |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5828 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
|
5829 { |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5830 *fprev = fblk->next; |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5831 /* Unhook from the free list. */ |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5832 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
|
5833 lisp_align_free (fblk); |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
5834 n_float_blocks--; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5835 } |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5836 else |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5837 { |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5838 num_free += this_free; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5839 fprev = &fblk->next; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5840 } |
300 | 5841 } |
5842 total_floats = num_used; | |
5843 total_free_floats = num_free; | |
5844 } | |
5845 | |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5846 /* Put all unmarked intervals on free list */ |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5847 { |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5848 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
|
5849 struct interval_block **iprev = &interval_block; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5850 register int lim = interval_block_index; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5851 register int num_free = 0, num_used = 0; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5852 |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5853 interval_free_list = 0; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5854 |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5855 for (iblk = interval_block; iblk; iblk = *iprev) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5856 { |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5857 register int i; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5858 int this_free = 0; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5859 |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5860 for (i = 0; i < lim; i++) |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5861 { |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5862 if (!iblk->intervals[i].gcmarkbit) |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5863 { |
28269
fd13be8ae190
Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents:
28220
diff
changeset
|
5864 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
|
5865 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
|
5866 this_free++; |
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 else |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5869 { |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5870 num_used++; |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5871 iblk->intervals[i].gcmarkbit = 0; |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5872 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5873 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5874 lim = INTERVAL_BLOCK_SIZE; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5875 /* 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
|
5876 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
|
5877 deallocate this block. */ |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5878 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
|
5879 { |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5880 *iprev = iblk->next; |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5881 /* Unhook from the free list. */ |
28269
fd13be8ae190
Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents:
28220
diff
changeset
|
5882 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
|
5883 lisp_free (iblk); |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
5884 n_interval_blocks--; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5885 } |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5886 else |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5887 { |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5888 num_free += this_free; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5889 iprev = &iblk->next; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5890 } |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5891 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5892 total_intervals = num_used; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5893 total_free_intervals = num_free; |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5894 } |
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5895 |
300 | 5896 /* Put all unmarked symbols on free list */ |
5897 { | |
5898 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
|
5899 struct symbol_block **sprev = &symbol_block; |
300 | 5900 register int lim = symbol_block_index; |
5901 register int num_free = 0, num_used = 0; | |
5902 | |
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5903 symbol_free_list = NULL; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5904 |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5905 for (sblk = symbol_block; sblk; sblk = *sprev) |
300 | 5906 { |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5907 int this_free = 0; |
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5908 struct Lisp_Symbol *sym = sblk->symbols; |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5909 struct Lisp_Symbol *end = sym + lim; |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5910 |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5911 for (; sym < end; ++sym) |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5912 { |
34325
a65d8c29442a
(gc_sweep): Add comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34308
diff
changeset
|
5913 /* 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
|
5914 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
|
5915 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
|
5916 int pure_p = PURE_POINTER_P (XSTRING (sym->xname)); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5917 |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5918 if (!sym->gcmarkbit && !pure_p) |
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5919 { |
107984
bef5d1738c0b
Make variable forwarding explicit rather the using special values.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107895
diff
changeset
|
5920 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
|
5921 xfree (SYMBOL_BLV (sym)); |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5922 sym->next = symbol_free_list; |
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5923 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
|
5924 #if GC_MARK_STACK |
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5925 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
|
5926 #endif |
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5927 ++this_free; |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5928 } |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5929 else |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5930 { |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5931 ++num_used; |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5932 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
|
5933 UNMARK_STRING (XSTRING (sym->xname)); |
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5934 sym->gcmarkbit = 0; |
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5935 } |
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
5936 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5937 |
300 | 5938 lim = SYMBOL_BLOCK_SIZE; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5939 /* 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
|
5940 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
|
5941 this block. */ |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5942 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
|
5943 { |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5944 *sprev = sblk->next; |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5945 /* Unhook from the free list. */ |
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5946 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
|
5947 lisp_free (sblk); |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
5948 n_symbol_blocks--; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5949 } |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5950 else |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5951 { |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5952 num_free += this_free; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5953 sprev = &sblk->next; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5954 } |
300 | 5955 } |
5956 total_symbols = num_used; | |
5957 total_free_symbols = num_free; | |
5958 } | |
5959 | |
21143
ce12eac1ee45
(gc_sweep, mark_object): Handle new data structure
Richard M. Stallman <rms@gnu.org>
parents:
21084
diff
changeset
|
5960 /* 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
|
5961 For a marker, first unchain it from the buffer it points into. */ |
300 | 5962 { |
5963 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
|
5964 struct marker_block **mprev = &marker_block; |
300 | 5965 register int lim = marker_block_index; |
5966 register int num_free = 0, num_used = 0; | |
5967 | |
5968 marker_free_list = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5969 |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5970 for (mblk = marker_block; mblk; mblk = *mprev) |
300 | 5971 { |
5972 register int i; | |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5973 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
|
5974 |
300 | 5975 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
|
5976 { |
85344
99492f857499
(free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85329
diff
changeset
|
5977 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
|
5978 { |
85344
99492f857499
(free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85329
diff
changeset
|
5979 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
|
5980 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
|
5981 /* 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
|
5982 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
|
5983 but this might catch bugs faster. */ |
11243
054ecfce1820
(Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents:
11048
diff
changeset
|
5984 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
|
5985 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
|
5986 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
|
5987 this_free++; |
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5988 } |
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5989 else |
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5990 { |
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5991 num_used++; |
85344
99492f857499
(free_misc): Use XMISCTYPE.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85329
diff
changeset
|
5992 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
|
5993 } |
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5994 } |
300 | 5995 lim = MARKER_BLOCK_SIZE; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5996 /* 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
|
5997 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
|
5998 this block. */ |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5999 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
|
6000 { |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6001 *mprev = mblk->next; |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6002 /* Unhook from the free list. */ |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6003 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
|
6004 lisp_free (mblk); |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6005 n_marker_blocks--; |
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6006 } |
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6007 else |
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6008 { |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6009 num_free += this_free; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6010 mprev = &mblk->next; |
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6011 } |
300 | 6012 } |
6013 | |
6014 total_markers = num_used; | |
6015 total_free_markers = num_free; | |
6016 } | |
6017 | |
6018 /* Free all unmarked buffers */ | |
6019 { | |
6020 register struct buffer *buffer = all_buffers, *prev = 0, *next; | |
6021 | |
6022 while (buffer) | |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6023 if (!VECTOR_MARKED_P (buffer)) |
300 | 6024 { |
6025 if (prev) | |
6026 prev->next = buffer->next; | |
6027 else | |
6028 all_buffers = buffer->next; | |
6029 next = buffer->next; | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6030 lisp_free (buffer); |
300 | 6031 buffer = next; |
6032 } | |
6033 else | |
6034 { | |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6035 VECTOR_UNMARK (buffer); |
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
6036 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer)); |
300 | 6037 prev = buffer, buffer = buffer->next; |
6038 } | |
6039 } | |
6040 | |
6041 /* Free all unmarked vectors */ | |
6042 { | |
6043 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next; | |
6044 total_vector_size = 0; | |
6045 | |
6046 while (vector) | |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6047 if (!VECTOR_MARKED_P (vector)) |
300 | 6048 { |
6049 if (prev) | |
6050 prev->next = vector->next; | |
6051 else | |
6052 all_vectors = vector->next; | |
6053 next = vector->next; | |
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6054 lisp_free (vector); |
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6055 n_vectors--; |
300 | 6056 vector = next; |
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
6057 |
300 | 6058 } |
6059 else | |
6060 { | |
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6061 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
|
6062 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
|
6063 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
|
6064 else |
bd3241a14d0a
(gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents:
11374
diff
changeset
|
6065 total_vector_size += vector->size; |
300 | 6066 prev = vector, vector = vector->next; |
6067 } | |
6068 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
6069 |
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6070 #ifdef GC_CHECK_STRING_BYTES |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6071 if (!noninteractive) |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6072 check_string_bytes (1); |
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6073 #endif |
300 | 6074 } |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6075 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6076 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6077 |
300 | 6078 |
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6079 /* Debugging aids. */ |
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6080 |
5353
6389ed5b45ac
(Fmemory_limit): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
4956
diff
changeset
|
6081 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
|
6082 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
|
6083 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
|
6084 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
|
6085 (void) |
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6086 { |
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6087 Lisp_Object end; |
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6088 |
9261
e5ba7993d378
(VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents:
9144
diff
changeset
|
6089 XSETINT (end, (EMACS_INT) sbrk (0) / 1024); |
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6090 |
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6091 return end; |
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6092 } |
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6093 |
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6094 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
|
6095 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
|
6096 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
|
6097 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
|
6098 Garbage collection does not decrease them. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6099 The elements of the value are as follows: |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6100 (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
|
6101 All are in units of 1 = one object consed |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6102 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
|
6103 objects consed. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6104 MISCS include overlays, markers, and some internal types. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6105 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
|
6106 (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
|
6107 (void) |
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6108 { |
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6109 Lisp_Object consed[8]; |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6110 |
39633
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6111 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
|
6112 consed[1] = make_number (min (MOST_POSITIVE_FIXNUM, floats_consed)); |
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6113 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
|
6114 consed[3] = make_number (min (MOST_POSITIVE_FIXNUM, symbols_consed)); |
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6115 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
|
6116 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
|
6117 consed[6] = make_number (min (MOST_POSITIVE_FIXNUM, intervals_consed)); |
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6118 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
|
6119 |
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6120 return Flist (8, consed); |
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6121 } |
28406
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6122 |
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6123 int suppress_checking; |
85674
01258ecfc38e
(spare_memory, stack_copy, stack_copy_size, ignore_warnings, Vdead,
Juanma Barranquero <lekktu@gmail.com>
parents:
85344
diff
changeset
|
6124 |
28406
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6125 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
6126 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
|
6127 { |
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
|
6128 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
|
6129 file, line, msg); |
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6130 abort (); |
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6131 } |
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6132 |
300 | 6133 /* Initialization */ |
6134 | |
21514 | 6135 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
6136 init_alloc_once (void) |
300 | 6137 { |
6138 /* 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
|
6139 purebeg = PUREBEG; |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6140 pure_size = PURESIZE; |
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
6141 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
|
6142 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
|
6143 pure_bytes_used_before_overflow = 0; |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6144 |
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6145 /* Initialize the list of free aligned blocks. */ |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6146 free_ablock = NULL; |
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6147 |
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
6148 #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
|
6149 mem_init (); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6150 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
|
6151 #endif |
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6152 |
300 | 6153 all_vectors = 0; |
6154 ignore_warnings = 1; | |
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
6155 #ifdef DOUG_LEA_MALLOC |
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
6156 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
|
6157 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
|
6158 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
|
6159 #endif |
300 | 6160 init_strings (); |
6161 init_cons (); | |
6162 init_symbol (); | |
6163 init_marker (); | |
6164 init_float (); | |
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6165 init_intervals (); |
94993
b0b4e9fbfb37
(init_alloc_once): Call init_weak_hash_tables.
Chong Yidong <cyd@stupidchicken.com>
parents:
94963
diff
changeset
|
6166 init_weak_hash_tables (); |
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6167 |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6168 #ifdef REL_ALLOC |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6169 malloc_hysteresis = 32; |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6170 #else |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6171 malloc_hysteresis = 0; |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6172 #endif |
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6173 |
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
6174 refill_memory_reserve (); |
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6175 |
300 | 6176 ignore_warnings = 0; |
6177 gcprolist = 0; | |
26364
7b0217d9259c
(Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
6178 byte_stack_list = 0; |
300 | 6179 staticidx = 0; |
6180 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
|
6181 gc_cons_threshold = 100000 * sizeof (Lisp_Object); |
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
6182 gc_relative_threshold = 0; |
300 | 6183 } |
6184 | |
21514 | 6185 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
6186 init_alloc (void) |
300 | 6187 { |
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; |
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6190 #if GC_MARK_STACK |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6191 #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
|
6192 setjmp_tested_p = longjmps_done = 0; |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6193 #endif |
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6194 #endif |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6195 Vgc_elapsed = make_float (0.0); |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6196 gcs_done = 0; |
300 | 6197 } |
6198 | |
6199 void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
6200 syms_of_alloc (void) |
300 | 6201 { |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6202 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
|
6203 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
|
6204 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
|
6205 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
|
6206 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6207 Garbage collection happens automatically only when `eval' is called. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6208 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6209 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
|
6210 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
|
6211 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
|
6212 |
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
6213 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
|
6214 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
|
6215 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
|
6216 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
|
6217 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
|
6218 Vgc_cons_percentage = make_float (0.1); |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6219 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6220 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
|
6221 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
|
6222 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6223 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
|
6224 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
|
6225 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6226 DEFVAR_INT ("floats-consed", &floats_consed, |
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6227 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
|
6228 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6229 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
|
6230 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
|
6231 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6232 DEFVAR_INT ("symbols-consed", &symbols_consed, |
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6233 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
|
6234 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6235 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
|
6236 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
|
6237 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6238 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
|
6239 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
|
6240 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6241 DEFVAR_INT ("intervals-consed", &intervals_consed, |
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6242 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
|
6243 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6244 DEFVAR_INT ("strings-consed", &strings_consed, |
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6245 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
|
6246 |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6247 DEFVAR_LISP ("purify-flag", &Vpurify_flag, |
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6248 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
|
6249 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
|
6250 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
|
6251 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
|
6252 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6253 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
|
6254 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
|
6255 garbage_collection_messages = 0; |
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
6256 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6257 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
|
6258 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
|
6259 Vpost_gc_hook = Qnil; |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105871
diff
changeset
|
6260 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
|
6261 staticpro (&Qpost_gc_hook); |
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6262 |
46305
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6263 DEFVAR_LISP ("memory-signal-data", &Vmemory_signal_data, |
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6264 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
|
6265 /* 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
|
6266 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
|
6267 Vmemory_signal_data |
105958
341a779db1d0
* frame.c (make_initial_frame):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105885
diff
changeset
|
6268 = pure_cons (Qerror, |
341a779db1d0
* frame.c (make_initial_frame):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105885
diff
changeset
|
6269 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
|
6270 |
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6271 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
|
6272 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
|
6273 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
|
6274 |
11374
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
6275 staticpro (&Qgc_cons_threshold); |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105871
diff
changeset
|
6276 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
|
6277 |
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
6278 staticpro (&Qchar_table_extra_slots); |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105871
diff
changeset
|
6279 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
|
6280 |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6281 DEFVAR_LISP ("gc-elapsed", &Vgc_elapsed, |
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6282 doc: /* Accumulated time elapsed in garbage collections. |
51974
111cc76606c6
(syms_of_alloc): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents:
51938
diff
changeset
|
6283 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
|
6284 DEFVAR_INT ("gcs-done", &gcs_done, |
51974
111cc76606c6
(syms_of_alloc): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents:
51938
diff
changeset
|
6285 doc: /* Accumulated number of garbage collections done. */); |
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6286 |
300 | 6287 defsubr (&Scons); |
6288 defsubr (&Slist); | |
6289 defsubr (&Svector); | |
6290 defsubr (&Smake_byte_code); | |
6291 defsubr (&Smake_list); | |
6292 defsubr (&Smake_vector); | |
6293 defsubr (&Smake_string); | |
13141
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
6294 defsubr (&Smake_bool_vector); |
300 | 6295 defsubr (&Smake_symbol); |
6296 defsubr (&Smake_marker); | |
6297 defsubr (&Spurecopy); | |
6298 defsubr (&Sgarbage_collect); | |
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6299 defsubr (&Smemory_limit); |
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6300 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
|
6301 |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6302 #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
|
6303 defsubr (&Sgc_status); |
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6304 #endif |
300 | 6305 } |
52401 | 6306 |
6307 /* arch-tag: 6695ca10-e3c5-4c2c-8bc3-ed26a7dda857 | |
6308 (do not change this comment) */ |