Mercurial > emacs
annotate src/alloc.c @ 83543:6b25ef5cc276
Fix obvious runtime errors after merge.
* lisp/term/x-win.el (x-initialize-window-system): Make a copy of pure list.
* src/puresize.h (BASE_PURESIZE): Increase puresize.
* src/alloc.c (emacs_blocked_malloc): Disable mallopt call.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-583
| author | Karoly Lorentey <lorentey@elte.hu> |
|---|---|
| date | Sat, 14 Oct 2006 18:40:58 +0000 |
| parents | 694bbb62a75d |
| children | c71725faff1a |
| 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, |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
3 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. |
| 300 | 4 |
| 5 This file is part of GNU Emacs. | |
| 6 | |
| 7 GNU Emacs is free software; you can redistribute it and/or modify | |
| 8 it under the terms of the GNU General Public License as published by | |
|
1784
11f62e53acff
Make scrollbar structures into lisp objects, so that they can be
Jim Blandy <jimb@redhat.com>
parents:
1562
diff
changeset
|
9 the Free Software Foundation; either version 2, or (at your option) |
| 300 | 10 any later version. |
| 11 | |
| 12 GNU Emacs is distributed in the hope that it will be useful, | |
| 13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 15 GNU General Public License for more details. | |
| 16 | |
| 17 You should have received a copy of the GNU General Public License | |
| 18 along with GNU Emacs; see the file COPYING. If not, write to | |
| 64084 | 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 20 Boston, MA 02110-1301, USA. */ | |
| 300 | 21 |
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25762
diff
changeset
|
22 #include <config.h> |
|
28374
7a3e8a76057b
Include stdio.h. Test STDC_HEADERS, not __STDC__.
Dave Love <fx@gnu.org>
parents:
28365
diff
changeset
|
23 #include <stdio.h> |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
24 #include <limits.h> /* For CHAR_BIT. */ |
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25762
diff
changeset
|
25 |
|
69876
272487a77b8e
[STDC_HEADERS]: Include stddef.h.
Eli Zaretskii <eliz@gnu.org>
parents:
69873
diff
changeset
|
26 #ifdef STDC_HEADERS |
|
272487a77b8e
[STDC_HEADERS]: Include stddef.h.
Eli Zaretskii <eliz@gnu.org>
parents:
69873
diff
changeset
|
27 #include <stddef.h> /* For offsetof, used by PSEUDOVECSIZE. */ |
|
272487a77b8e
[STDC_HEADERS]: Include stddef.h.
Eli Zaretskii <eliz@gnu.org>
parents:
69873
diff
changeset
|
28 #endif |
|
272487a77b8e
[STDC_HEADERS]: Include stddef.h.
Eli Zaretskii <eliz@gnu.org>
parents:
69873
diff
changeset
|
29 |
|
47185
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
30 #ifdef ALLOC_DEBUG |
|
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
31 #undef INLINE |
|
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
32 #endif |
|
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
33 |
|
13320
e0f3a961851a
Cast first arg to bzero.
Richard M. Stallman <rms@gnu.org>
parents:
13219
diff
changeset
|
34 /* Note that this declares bzero on OSF/1. How dumb. */ |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
35 |
|
3003
5a73d384f45e
* syssignal.h: Don't #include <signal.h>
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
36 #include <signal.h> |
| 300 | 37 |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
38 #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
|
39 #include <pthread.h> |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
40 #endif |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
41 |
|
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
42 /* 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
|
43 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
|
44 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
|
45 |
|
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
46 #undef HIDE_LISP_IMPLEMENTATION |
| 300 | 47 #include "lisp.h" |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
48 #include "process.h" |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
49 #include "intervals.h" |
| 356 | 50 #include "puresize.h" |
| 300 | 51 #include "buffer.h" |
| 52 #include "window.h" | |
|
31102
6a0caa788013
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
30914
diff
changeset
|
53 #include "keyboard.h" |
| 764 | 54 #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
|
55 #include "blockinput.h" |
|
21084
371ed7bdfd2b
(Fmake_string): Handle the case INIT is a multibyte character correctly.
Richard M. Stallman <rms@gnu.org>
parents:
20849
diff
changeset
|
56 #include "charset.h" |
| 638 | 57 #include "syssignal.h" |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
58 #include <setjmp.h> |
| 638 | 59 |
|
52547
623355edbb1d
(GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents:
52475
diff
changeset
|
60 /* 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
|
61 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
|
62 |
|
623355edbb1d
(GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents:
52475
diff
changeset
|
63 #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
|
64 #undef GC_MALLOC_CHECK |
|
623355edbb1d
(GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents:
52475
diff
changeset
|
65 #endif |
|
623355edbb1d
(GC_MALLOC_CHECK): Move conditional undef after lisp.h.
Dave Love <fx@gnu.org>
parents:
52475
diff
changeset
|
66 |
|
30784
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
67 #ifdef HAVE_UNISTD_H |
|
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
68 #include <unistd.h> |
|
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
69 #else |
|
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
70 extern POINTER_TYPE *sbrk (); |
|
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
71 #endif |
| 12096 | 72 |
|
67216
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
73 #ifdef HAVE_FCNTL_H |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
74 #define INCLUDED_FCNTL |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
75 #include <fcntl.h> |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
76 #endif |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
77 #ifndef O_WRONLY |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
78 #define O_WRONLY 1 |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
79 #endif |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
80 |
|
72177
4eba80d54b43
[WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents:
72167
diff
changeset
|
81 #ifdef WINDOWSNT |
|
4eba80d54b43
[WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents:
72167
diff
changeset
|
82 #include <fcntl.h> |
| 72288 | 83 #include "w32.h" |
|
72177
4eba80d54b43
[WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents:
72167
diff
changeset
|
84 #endif |
|
4eba80d54b43
[WINDOWSNT]: Include fcntl.h, to fix last change.
Eli Zaretskii <eliz@gnu.org>
parents:
72167
diff
changeset
|
85 |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
86 #ifdef DOUG_LEA_MALLOC |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
87 |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
88 #include <malloc.h> |
|
31892
2f3d88ac2b38
(__malloc_size_t) [DOUG_LEA_MALLOC]: Don't redefine it.
Dave Love <fx@gnu.org>
parents:
31889
diff
changeset
|
89 /* 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
|
90 #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
|
91 #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
|
92 #endif |
|
23973
2eb9e2f5aa33
(MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents:
23958
diff
changeset
|
93 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
94 /* 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
|
95 value that explicitly means "no limit". */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
96 |
|
23973
2eb9e2f5aa33
(MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents:
23958
diff
changeset
|
97 #define MMAP_MAX_AREAS 100000000 |
|
2eb9e2f5aa33
(MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents:
23958
diff
changeset
|
98 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
99 #else /* not DOUG_LEA_MALLOC */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
100 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
101 /* 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
|
102 |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
103 #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
|
104 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
|
105 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
|
106 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
107 #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
|
108 |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
109 #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
|
110 |
|
58831
408c5135b0a2
* alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58818
diff
changeset
|
111 /* 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
|
112 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
|
113 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
|
114 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
|
115 |
|
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
|
116 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
|
117 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
|
118 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
|
119 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
|
120 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
|
121 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
|
122 |
|
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
123 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
|
124 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
|
125 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
|
126 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
|
127 |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
128 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
|
129 |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
130 #define BLOCK_INPUT_ALLOC \ |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
131 do \ |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
132 { \ |
|
72537
07b45e10e844
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Undo previous
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72342
diff
changeset
|
133 if (pthread_self () == main_thread) \ |
|
07b45e10e844
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Undo previous
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72342
diff
changeset
|
134 BLOCK_INPUT; \ |
|
07b45e10e844
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Undo previous
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72342
diff
changeset
|
135 pthread_mutex_lock (&alloc_mutex); \ |
|
58818
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 while (0) |
|
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 \ |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
139 do \ |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
140 { \ |
|
72537
07b45e10e844
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Undo previous
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72342
diff
changeset
|
141 pthread_mutex_unlock (&alloc_mutex); \ |
|
07b45e10e844
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Undo previous
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72342
diff
changeset
|
142 if (pthread_self () == main_thread) \ |
|
07b45e10e844
(BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Undo previous
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72342
diff
changeset
|
143 UNBLOCK_INPUT; \ |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
144 } \ |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
145 while (0) |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
146 |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
147 #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
|
148 |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
149 #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
|
150 #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
|
151 |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
152 #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
|
153 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
154 /* 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
|
155 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
156 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
|
157 |
|
66547
9373f926904a
(BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents:
66541
diff
changeset
|
158 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
|
159 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
160 /* 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
|
161 to a struct Lisp_String. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
162 |
|
51985
b52e88c3d6d0
(MARK_STRING, UNMARK_STRING, STRING_MARKED_P)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51974
diff
changeset
|
163 #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
|
164 #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
|
165 #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
|
166 |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
167 #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
|
168 #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
|
169 #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
|
170 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
171 /* 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
|
172 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
|
173 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
|
174 strings. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
175 |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
176 #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
|
177 #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
|
178 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
179 /* 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
|
180 |
| 300 | 181 int consing_since_gc; |
| 182 | |
|
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
183 /* 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
|
184 |
|
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
|
185 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
|
186 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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 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
|
192 EMACS_INT strings_consed; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
193 |
|
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
194 /* 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
|
195 |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
196 EMACS_INT gc_cons_threshold; |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
197 |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
198 /* Similar minimum, computed from Vgc_cons_percentage. */ |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
199 |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
200 EMACS_INT gc_relative_threshold; |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
201 |
|
64267
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
202 static Lisp_Object Vgc_cons_percentage; |
| 300 | 203 |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
204 /* 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
|
205 when memory is full. */ |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
206 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
207 EMACS_INT memory_full_cons_threshold; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
208 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
209 /* Nonzero during GC. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
210 |
| 300 | 211 int gc_in_progress; |
| 212 | |
|
50745
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
213 /* Nonzero means abort if try to GC. |
|
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
214 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
|
215 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
|
216 |
|
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
217 int abort_on_gc; |
|
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
218 |
|
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
219 /* 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
|
220 |
|
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
221 int garbage_collection_messages; |
|
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
222 |
| 300 | 223 #ifndef VIRT_ADDR_VARIES |
| 224 extern | |
| 225 #endif /* VIRT_ADDR_VARIES */ | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
226 int malloc_sbrk_used; |
| 300 | 227 |
| 228 #ifndef VIRT_ADDR_VARIES | |
| 229 extern | |
| 230 #endif /* VIRT_ADDR_VARIES */ | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
231 int malloc_sbrk_unused; |
| 300 | 232 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
233 /* 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
|
234 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
235 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
|
236 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
|
237 static int total_free_floats, total_floats; |
|
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
238 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
239 /* 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
|
240 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
|
241 two string blocks. */ |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
242 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
243 char *spare_memory[7]; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
244 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
245 /* 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
|
246 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
247 #define SPARE_MEMORY (1 << 14) |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
248 |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
249 /* 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
|
250 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
251 static int malloc_hysteresis; |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
252 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
253 /* 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
|
254 |
| 300 | 255 Lisp_Object Vpurify_flag; |
| 256 | |
|
46305
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
257 /* 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
|
258 |
|
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
259 Lisp_Object Vmemory_full; |
|
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
260 |
| 300 | 261 #ifndef HAVE_SHM |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
262 |
| 57137 | 263 /* Initialize it to a nonzero value to force it into data space |
| 264 (rather than bss space). That way unexec will remap it into text | |
| 265 space (pure), on some systems. We have not implemented the | |
| 266 remapping on more recent systems because this is less important | |
| 267 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
|
268 |
|
cb3976b5e59f
(pure, staticvec): Initialize these arrays to nonzero, so that they're
Paul Eggert <eggert@twinsun.com>
parents:
51907
diff
changeset
|
269 EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {1,}; |
| 300 | 270 #define PUREBEG (char *) pure |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
271 |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
272 #else /* HAVE_SHM */ |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
273 |
| 300 | 274 #define pure PURE_SEG_BITS /* Use shared memory segment */ |
| 275 #define PUREBEG (char *)PURE_SEG_BITS | |
| 356 | 276 |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
277 #endif /* HAVE_SHM */ |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
278 |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
279 /* 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
|
280 |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
281 static char *purebeg; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
282 static size_t pure_size; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
283 |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
284 /* 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
|
285 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
|
286 |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
287 static size_t pure_bytes_used_before_overflow; |
| 300 | 288 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
289 /* 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
|
290 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
291 #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
|
292 (((PNTR_COMPARISON_TYPE) (P) \ |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
293 < (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
|
294 && ((PNTR_COMPARISON_TYPE) (P) \ |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
295 >= (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
|
296 |
|
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
|
297 /* 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
|
298 |
|
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
|
299 EMACS_INT pure_bytes_used; |
| 300 | 300 |
|
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
|
301 /* 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
|
302 |
|
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
|
303 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
|
304 |
|
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
|
305 /* 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
|
306 |
|
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
|
307 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
|
308 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
309 /* 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
|
310 displayed. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
311 |
| 300 | 312 char *pending_malloc_warning; |
| 313 | |
|
6116
64417bbbb128
(memory_full): Use new variable memory_signal_data with precomputed value
Karl Heuer <kwzh@gnu.org>
parents:
5874
diff
changeset
|
314 /* 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
|
315 |
|
46305
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
316 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
|
317 |
| 300 | 318 /* Maximum amount of C stack to save when a GC happens. */ |
| 319 | |
| 320 #ifndef MAX_SAVE_STACK | |
| 321 #define MAX_SAVE_STACK 16000 | |
| 322 #endif | |
| 323 | |
| 324 /* Buffer in which we save a copy of the C stack at each GC. */ | |
| 325 | |
| 326 char *stack_copy; | |
| 327 int stack_copy_size; | |
| 328 | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
329 /* 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
|
330 Currently not used. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
331 |
| 300 | 332 int ignore_warnings; |
| 1318 | 333 |
|
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
334 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
|
335 |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
336 /* Hook run after GC has finished. */ |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
337 |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
338 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
|
339 |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
340 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
|
341 EMACS_INT gcs_done; /* accumulated GCs */ |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
342 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
343 static void mark_buffer P_ ((Lisp_Object)); |
|
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83420
diff
changeset
|
344 extern void mark_terminals P_ ((void)); |
|
51578
42f25a716cb8
(mark_kboards): Move to keyboard.c.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51318
diff
changeset
|
345 extern void mark_kboards P_ ((void)); |
|
82988
f82e3a6f5ccb
A few more bugfixes and new features.
Karoly Lorentey <lorentey@elte.hu>
parents:
53093
diff
changeset
|
346 extern void mark_ttys P_ ((void)); |
|
55798
a1bb695e9a0c
(struct backtrace): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55767
diff
changeset
|
347 extern void mark_backtrace P_ ((void)); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
348 static void gc_sweep P_ ((void)); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
349 static void mark_glyph_matrix P_ ((struct glyph_matrix *)); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
350 static void mark_face_cache P_ ((struct face_cache *)); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
351 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
352 #ifdef HAVE_WINDOW_SYSTEM |
|
59400
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
353 extern void mark_fringe_data P_ ((void)); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
354 static void mark_image P_ ((struct image *)); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
355 static void mark_image_cache P_ ((struct frame *)); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
356 #endif /* HAVE_WINDOW_SYSTEM */ |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
357 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
358 static struct Lisp_String *allocate_string P_ ((void)); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
359 static void compact_small_strings P_ ((void)); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
360 static void free_large_strings P_ ((void)); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
361 static void sweep_strings P_ ((void)); |
| 20495 | 362 |
| 363 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
|
364 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
365 /* 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
|
366 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
|
367 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
|
368 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
369 enum mem_type |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
370 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
371 MEM_TYPE_NON_LISP, |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
372 MEM_TYPE_BUFFER, |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
373 MEM_TYPE_CONS, |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
374 MEM_TYPE_STRING, |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
375 MEM_TYPE_MISC, |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
376 MEM_TYPE_SYMBOL, |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
377 MEM_TYPE_FLOAT, |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
378 /* Keep the following vector-like types together, with |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
379 MEM_TYPE_WINDOW being the last, and MEM_TYPE_VECTOR the |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
380 first. Or change the code of live_vector_p, for instance. */ |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
381 MEM_TYPE_VECTOR, |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
382 MEM_TYPE_PROCESS, |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
383 MEM_TYPE_HASH_TABLE, |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
384 MEM_TYPE_FRAME, |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
385 MEM_TYPE_WINDOW |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
386 }; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
387 |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
388 static POINTER_TYPE *lisp_align_malloc P_ ((size_t, enum mem_type)); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
389 static POINTER_TYPE *lisp_malloc P_ ((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
|
390 void refill_memory_reserve (); |
|
6ab8d86f8a2b
(refill_memory_reserve): Move decl out of conditionals.
Richard M. Stallman <rms@gnu.org>
parents:
66547
diff
changeset
|
391 |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
392 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
393 #if GC_MARK_STACK || defined GC_MALLOC_CHECK |
|
27746
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
394 |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
395 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
396 #include <stdio.h> /* For fprintf. */ |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
397 #endif |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
398 |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
399 /* 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
|
400 on free lists recognizable in O(1). */ |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
401 |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
402 Lisp_Object Vdead; |
|
2556e20596b8
(enum mem_type): Compile unconditionally.
Gerd Moellmann <gerd@gnu.org>
parents:
27738
diff
changeset
|
403 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
404 #ifdef GC_MALLOC_CHECK |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
405 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
406 enum mem_type allocated_mem_type; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
407 int dont_register_blocks; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
408 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
409 #endif /* GC_MALLOC_CHECK */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
410 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
411 /* 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
|
412 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
|
413 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
|
414 is freed. |
|
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 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
|
417 properties: |
|
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 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
|
420 2. Every leaf is black. |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
421 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
|
422 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
|
423 the same number of black nodes. |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
424 5. The root is always black. |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
425 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
426 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
|
427 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
|
428 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
429 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
|
430 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
|
431 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
|
432 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
|
433 describe them. */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
434 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
435 struct mem_node |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
436 { |
| 48907 | 437 /* Children of this node. These pointers are never NULL. When there |
| 438 is no child, the value is MEM_NIL, which points to a dummy node. */ | |
| 439 struct mem_node *left, *right; | |
| 440 | |
| 441 /* The parent of this node. In the root node, this is NULL. */ | |
| 442 struct mem_node *parent; | |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
443 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
444 /* Start and end of allocated region. */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
445 void *start, *end; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
446 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
447 /* Node color. */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
448 enum {MEM_BLACK, MEM_RED} color; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
449 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
450 /* Memory type. */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
451 enum mem_type type; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
452 }; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
453 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
454 /* Base address of stack. Set in main. */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
455 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
456 Lisp_Object *stack_base; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
457 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
458 /* 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
|
459 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
460 static struct mem_node *mem_root; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
461 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
462 /* Lowest and highest known address in the heap. */ |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
463 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
464 static void *min_heap_address, *max_heap_address; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
465 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
466 /* Sentinel node of the tree. */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
467 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
468 static struct mem_node mem_z; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
469 #define MEM_NIL &mem_z |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
470 |
|
30914
6362b1fc09f2
(lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
30823
diff
changeset
|
471 static POINTER_TYPE *lisp_malloc P_ ((size_t, enum mem_type)); |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
472 static struct Lisp_Vector *allocate_vectorlike P_ ((EMACS_INT, enum mem_type)); |
|
30784
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
473 static void lisp_free P_ ((POINTER_TYPE *)); |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
474 static void mark_stack P_ ((void)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
475 static int live_vector_p P_ ((struct mem_node *, void *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
476 static int live_buffer_p P_ ((struct mem_node *, void *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
477 static int live_string_p P_ ((struct mem_node *, void *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
478 static int live_cons_p P_ ((struct mem_node *, void *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
479 static int live_symbol_p P_ ((struct mem_node *, void *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
480 static int live_float_p P_ ((struct mem_node *, void *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
481 static int live_misc_p P_ ((struct mem_node *, void *)); |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
482 static void mark_maybe_object P_ ((Lisp_Object)); |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
483 static void mark_memory P_ ((void *, void *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
484 static void mem_init P_ ((void)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
485 static struct mem_node *mem_insert P_ ((void *, void *, enum mem_type)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
486 static void mem_insert_fixup P_ ((struct mem_node *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
487 static void mem_rotate_left P_ ((struct mem_node *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
488 static void mem_rotate_right P_ ((struct mem_node *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
489 static void mem_delete P_ ((struct mem_node *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
490 static void mem_delete_fixup P_ ((struct mem_node *)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
491 static INLINE struct mem_node *mem_find P_ ((void *)); |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
492 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
493 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
494 #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
|
495 static void check_gcpros P_ ((void)); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
496 #endif |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
497 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
498 #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
|
499 |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
500 /* Recording what needs to be marked for gc. */ |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
501 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
502 struct gcpro *gcprolist; |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
503 |
|
51908
cb3976b5e59f
(pure, staticvec): Initialize these arrays to nonzero, so that they're
Paul Eggert <eggert@twinsun.com>
parents:
51907
diff
changeset
|
504 /* 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
|
505 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
|
506 |
|
43313
32f59a921eb9
(NSTATICS): Increase to 1280.
Andreas Schwab <schwab@suse.de>
parents:
43302
diff
changeset
|
507 #define NSTATICS 1280 |
|
51908
cb3976b5e59f
(pure, staticvec): Initialize these arrays to nonzero, so that they're
Paul Eggert <eggert@twinsun.com>
parents:
51907
diff
changeset
|
508 Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag}; |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
509 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
510 /* Index of next unused slot in staticvec. */ |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
511 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
512 int staticidx = 0; |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
513 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
514 static POINTER_TYPE *pure_alloc P_ ((size_t, int)); |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
515 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
516 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
517 /* 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
|
518 ALIGNMENT must be a power of 2. */ |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
519 |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
520 #define ALIGN(ptr, ALIGNMENT) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
521 ((POINTER_TYPE *) ((((EMACS_UINT)(ptr)) + (ALIGNMENT) - 1) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
522 & ~((ALIGNMENT) - 1))) |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
523 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
524 |
| 300 | 525 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
526 /************************************************************************ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
527 Malloc |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
528 ************************************************************************/ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
529 |
|
47185
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
530 /* 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
|
531 |
|
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
532 void |
| 300 | 533 malloc_warning (str) |
| 534 char *str; | |
| 535 { | |
| 536 pending_malloc_warning = str; | |
| 537 } | |
| 538 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
539 |
|
47185
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
540 /* 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
|
541 |
|
20375
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
542 void |
| 300 | 543 display_malloc_warning () |
| 544 { | |
|
47185
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
545 call3 (intern ("display-warning"), |
|
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
546 intern ("alloc"), |
|
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
547 build_string (pending_malloc_warning), |
|
2ff45b08a155
(display_malloc_warning): Use display-warning.
Richard M. Stallman <rms@gnu.org>
parents:
46833
diff
changeset
|
548 intern ("emergency")); |
| 300 | 549 pending_malloc_warning = 0; |
| 550 } | |
| 551 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
552 |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
553 #ifdef DOUG_LEA_MALLOC |
|
66547
9373f926904a
(BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents:
66541
diff
changeset
|
554 # 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
|
555 #else |
|
17831
9238a2254a23
(BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents:
17348
diff
changeset
|
556 # 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
|
557 #endif |
|
65832
5159ee08b219
(refill_memory_reserve): Conditionalize the body, not the function's existence.
Richard M. Stallman <rms@gnu.org>
parents:
65764
diff
changeset
|
558 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
559 /* 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
|
560 |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
561 void |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
562 buffer_memory_full () |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
563 { |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
564 /* 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
|
565 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
|
566 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
|
567 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
|
568 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
|
569 malloc. */ |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
570 |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
571 #ifndef REL_ALLOC |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
572 memory_full (); |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
573 #endif |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
574 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
575 /* 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
|
576 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
|
577 xsignal (Qnil, Vmemory_signal_data); |
| 300 | 578 } |
| 579 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
580 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
581 #ifdef XMALLOC_OVERRUN_CHECK |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
582 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
583 /* 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
|
584 and a 16 byte trailer around each block. |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
585 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
586 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
|
587 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
|
588 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
589 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
|
590 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
|
591 functions may bypass the malloc hooks. |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
592 */ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
593 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
594 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
595 #define XMALLOC_OVERRUN_CHECK_SIZE 16 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
596 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
597 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
|
598 { 0x9a, 0x9b, 0xae, 0xaf, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
599 0xbf, 0xbe, 0xce, 0xcf, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
600 0xea, 0xeb, 0xec, 0xed }; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
601 |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
602 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
|
603 { 0xaa, 0xab, 0xac, 0xad, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
604 0xba, 0xbb, 0xbc, 0xbd, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
605 0xca, 0xcb, 0xcc, 0xcd, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
606 0xda, 0xdb, 0xdc, 0xdd }; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
607 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
608 /* 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
|
609 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
610 #define XMALLOC_PUT_SIZE(ptr, size) \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
611 (ptr[-1] = (size & 0xff), \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
612 ptr[-2] = ((size >> 8) & 0xff), \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
613 ptr[-3] = ((size >> 16) & 0xff), \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
614 ptr[-4] = ((size >> 24) & 0xff)) |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
615 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
616 #define XMALLOC_GET_SIZE(ptr) \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
617 (size_t)((unsigned)(ptr[-1]) | \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
618 ((unsigned)(ptr[-2]) << 8) | \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
619 ((unsigned)(ptr[-3]) << 16) | \ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
620 ((unsigned)(ptr[-4]) << 24)) |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
621 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
622 |
|
59083
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
623 /* 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
|
624 xmalloc() |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
625 overrun_check_malloc() |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
626 -> malloc -> (via hook)_-> emacs_blocked_malloc |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
627 -> overrun_check_malloc |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
628 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
|
629 malloc returns 10000. |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
630 add overhead, return 10016. |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
631 <- (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
|
632 add overhead again, return 10032 |
|
59083
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
633 xmalloc returns 10032. |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
634 |
|
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
635 (time passes). |
|
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
636 |
|
59083
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
637 xfree(10032) |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
638 overrun_check_free(10032) |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
639 decrease overhed |
|
4295cf593352
Update comment for check_depth.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59082
diff
changeset
|
640 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
|
641 |
|
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
642 static int check_depth; |
|
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
643 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
644 /* 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
|
645 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
646 POINTER_TYPE * |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
647 overrun_check_malloc (size) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
648 size_t size; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
649 { |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
650 register unsigned char *val; |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
651 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
|
652 |
|
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
653 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
|
654 if (val && check_depth == 1) |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
655 { |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
656 bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
657 val += XMALLOC_OVERRUN_CHECK_SIZE; |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
658 XMALLOC_PUT_SIZE(val, size); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
659 bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
660 } |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
661 --check_depth; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
662 return (POINTER_TYPE *)val; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
663 } |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
664 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
665 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
666 /* 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
|
667 with header and trailer. */ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
668 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
669 POINTER_TYPE * |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
670 overrun_check_realloc (block, size) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
671 POINTER_TYPE *block; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
672 size_t size; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
673 { |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
674 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
|
675 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
|
676 |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
677 if (val |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
678 && check_depth == 1 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
679 && bcmp (xmalloc_overrun_check_header, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
680 val - XMALLOC_OVERRUN_CHECK_SIZE, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
681 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
682 { |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
683 size_t osize = XMALLOC_GET_SIZE (val); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
684 if (bcmp (xmalloc_overrun_check_trailer, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
685 val + osize, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
686 XMALLOC_OVERRUN_CHECK_SIZE)) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
687 abort (); |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
688 bzero (val + osize, XMALLOC_OVERRUN_CHECK_SIZE); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
689 val -= XMALLOC_OVERRUN_CHECK_SIZE; |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
690 bzero (val, XMALLOC_OVERRUN_CHECK_SIZE); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
691 } |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
692 |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
693 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
|
694 |
|
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
695 if (val && check_depth == 1) |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
696 { |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
697 bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
698 val += XMALLOC_OVERRUN_CHECK_SIZE; |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
699 XMALLOC_PUT_SIZE(val, size); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
700 bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
701 } |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
702 --check_depth; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
703 return (POINTER_TYPE *)val; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
704 } |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
705 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
706 /* Like free, but checks block for overrun. */ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
707 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
708 void |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
709 overrun_check_free (block) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
710 POINTER_TYPE *block; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
711 { |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
712 unsigned char *val = (unsigned char *)block; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
713 |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
714 ++check_depth; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
715 if (val |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
716 && check_depth == 1 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
717 && bcmp (xmalloc_overrun_check_header, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
718 val - XMALLOC_OVERRUN_CHECK_SIZE, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
719 XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
720 { |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
721 size_t osize = XMALLOC_GET_SIZE (val); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
722 if (bcmp (xmalloc_overrun_check_trailer, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
723 val + osize, |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
724 XMALLOC_OVERRUN_CHECK_SIZE)) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
725 abort (); |
|
59400
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
726 #ifdef XMALLOC_CLEAR_FREE_MEMORY |
|
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
727 val -= XMALLOC_OVERRUN_CHECK_SIZE; |
|
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
728 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
|
729 #else |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
730 bzero (val + osize, XMALLOC_OVERRUN_CHECK_SIZE); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
731 val -= XMALLOC_OVERRUN_CHECK_SIZE; |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
732 bzero (val, XMALLOC_OVERRUN_CHECK_SIZE); |
|
59400
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
733 #endif |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
734 } |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
735 |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
736 free (val); |
|
59082
f487226310e0
* alloc.c (check_depth): New variable.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
59047
diff
changeset
|
737 --check_depth; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
738 } |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
739 |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
740 #undef malloc |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
741 #undef realloc |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
742 #undef free |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
743 #define malloc overrun_check_malloc |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
744 #define realloc overrun_check_realloc |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
745 #define free overrun_check_free |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
746 #endif |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
747 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
748 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
749 /* 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
|
750 |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
751 POINTER_TYPE * |
| 300 | 752 xmalloc (size) |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
753 size_t size; |
| 300 | 754 { |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
755 register POINTER_TYPE *val; |
| 300 | 756 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
757 BLOCK_INPUT; |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
758 val = (POINTER_TYPE *) malloc (size); |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
759 UNBLOCK_INPUT; |
| 300 | 760 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
761 if (!val && size) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
762 memory_full (); |
| 300 | 763 return val; |
| 764 } | |
| 765 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
766 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
767 /* 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
|
768 |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
769 POINTER_TYPE * |
| 300 | 770 xrealloc (block, size) |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
771 POINTER_TYPE *block; |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
772 size_t size; |
| 300 | 773 { |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
774 register POINTER_TYPE *val; |
| 300 | 775 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
776 BLOCK_INPUT; |
| 590 | 777 /* We must call malloc explicitly when BLOCK is 0, since some |
| 778 reallocs don't do this. */ | |
| 779 if (! block) | |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
780 val = (POINTER_TYPE *) malloc (size); |
|
600
a8d78999e46d
*** empty log message ***
Noah Friedman <friedman@splode.com>
parents:
590
diff
changeset
|
781 else |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
782 val = (POINTER_TYPE *) realloc (block, size); |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
783 UNBLOCK_INPUT; |
| 300 | 784 |
| 785 if (!val && size) memory_full (); | |
| 786 return val; | |
| 787 } | |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
788 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
789 |
|
52276
5623f26dff58
(lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents:
52256
diff
changeset
|
790 /* 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
|
791 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
792 void |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
793 xfree (block) |
|
29781
4a3b0c2cbcd5
(xmalloc, xrealloc, xfree): Define using POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
29743
diff
changeset
|
794 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
|
795 { |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
796 BLOCK_INPUT; |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
797 free (block); |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
798 UNBLOCK_INPUT; |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
799 /* 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
|
800 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
|
801 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
|
802 } |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
803 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
804 |
|
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
805 /* Like strdup, but uses xmalloc. */ |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
806 |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
807 char * |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
808 xstrdup (s) |
|
46459
0a9cbcbdbe45
(xstrdup, make_string, make_unibyte_string)
Ken Raeburn <raeburn@raeburn.org>
parents:
46418
diff
changeset
|
809 const char *s; |
|
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
810 { |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
811 size_t len = strlen (s) + 1; |
|
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
812 char *p = (char *) xmalloc (len); |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
813 bcopy (s, p, len); |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
814 return p; |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
815 } |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
816 |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
817 |
|
56187
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
818 /* Unwind for SAFE_ALLOCA */ |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
819 |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
820 Lisp_Object |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
821 safe_alloca_unwind (arg) |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
822 Lisp_Object arg; |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
823 { |
|
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
824 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
|
825 |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
826 p->dogc = 0; |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
827 xfree (p->pointer); |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
828 p->pointer = 0; |
|
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
829 free_misc (arg); |
|
56187
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
830 return Qnil; |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
831 } |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
832 |
|
e3720731abbb
(safe_alloca_unwind): New function.
Kim F. Storm <storm@cua.dk>
parents:
55838
diff
changeset
|
833 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
834 /* 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
|
835 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
|
836 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
|
837 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
838 #ifndef USE_LSB_TAG |
|
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
839 static void *lisp_malloc_loser; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
840 #endif |
|
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
841 |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
842 static POINTER_TYPE * |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
843 lisp_malloc (nbytes, type) |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
844 size_t nbytes; |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
845 enum mem_type type; |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
846 { |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
847 register void *val; |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
848 |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
849 BLOCK_INPUT; |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
850 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
851 #ifdef GC_MALLOC_CHECK |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
852 allocated_mem_type = type; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
853 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
854 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
855 val = (void *) malloc (nbytes); |
|
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
856 |
|
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
857 #ifndef USE_LSB_TAG |
|
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
858 /* 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
|
859 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
|
860 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
|
861 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
|
862 { |
|
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
863 Lisp_Object tem; |
|
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
864 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
|
865 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
|
866 { |
|
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
867 lisp_malloc_loser = val; |
|
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
868 free (val); |
|
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
869 val = 0; |
|
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
870 } |
|
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
871 } |
|
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
872 #endif |
|
50468
16fdb9f87d89
(VALIDATE_LISP_STORAGE): Macro deleted. All calls deleted.
Richard M. Stallman <rms@gnu.org>
parents:
50274
diff
changeset
|
873 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
874 #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
|
875 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
|
876 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
|
877 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
878 |
|
28411
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
879 UNBLOCK_INPUT; |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
880 if (!val && nbytes) |
|
ecba29fa0198
(xstrdup): Moved here from xfaces.c.
Gerd Moellmann <gerd@gnu.org>
parents:
28406
diff
changeset
|
881 memory_full (); |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
882 return val; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
883 } |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
884 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
885 /* 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
|
886 call to lisp_malloc. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
887 |
|
30784
dbc1e69a89a9
[HAVE_UNISTD_H]: Include unistd.h; don't declare sbrk.
Dave Love <fx@gnu.org>
parents:
30557
diff
changeset
|
888 static void |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
889 lisp_free (block) |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
890 POINTER_TYPE *block; |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
891 { |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
892 BLOCK_INPUT; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
893 free (block); |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
894 #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
|
895 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
|
896 #endif |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
897 UNBLOCK_INPUT; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
898 } |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
899 |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
900 /* 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
|
901 /* 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
|
902 /* 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
|
903 |
|
69348
2c8e608f28e7
(USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
68974
diff
changeset
|
904 /* 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
|
905 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
|
906 its memalloc could be used). */ |
|
69355
a685fca1ccb6
(USE_POSIX_MEMALIGN): Fix last change.
Kim F. Storm <storm@cua.dk>
parents:
69348
diff
changeset
|
907 #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
|
908 #define USE_POSIX_MEMALIGN 1 |
|
a685fca1ccb6
(USE_POSIX_MEMALIGN): Fix last change.
Kim F. Storm <storm@cua.dk>
parents:
69348
diff
changeset
|
909 #endif |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
910 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
911 /* 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
|
912 #define BLOCK_ALIGN (1 << 10) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
913 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
914 /* 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
|
915 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
|
916 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
|
917 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
|
918 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
|
919 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
|
920 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
|
921 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
|
922 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
|
923 nothing else. */ |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
924 #define BLOCK_PADDING 0 |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
925 #define BLOCK_BYTES \ |
|
60143
84ff5b7a4139
(BLOCK_BYTES): Harmless typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59657
diff
changeset
|
926 (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
|
927 |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
928 /* Internal data structures and constants. */ |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
929 |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
930 #define ABLOCKS_SIZE 16 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
931 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
932 /* An aligned block of memory. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
933 struct ablock |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
934 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
935 union |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
936 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
937 char payload[BLOCK_BYTES]; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
938 struct ablock *next_free; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
939 } x; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
940 /* `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
|
941 /* 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
|
942 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
|
943 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
|
944 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
|
945 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
|
946 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
|
947 (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
|
948 real base). */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
949 struct ablocks *abase; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
950 /* 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
|
951 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
|
952 #if BLOCK_PADDING |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
953 char padding[BLOCK_PADDING]; |
|
51758
ff38ea4b40ed
(struct ablock): Only include padding when there is some.
Jason Rumney <jasonr@gnu.org>
parents:
51723
diff
changeset
|
954 #endif |
|
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 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
957 /* A bunch of consecutive aligned blocks. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
958 struct ablocks |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
959 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
960 struct ablock blocks[ABLOCKS_SIZE]; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
961 }; |
|
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 /* 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
|
964 #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
|
965 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
966 #define ABLOCK_ABASE(block) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
967 (((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
|
968 ? (struct ablocks *)(block) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
969 : (block)->abase) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
970 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
971 /* Virtual `busy' field. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
972 #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
|
973 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
974 /* 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
|
975 #ifdef USE_POSIX_MEMALIGN |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
976 #define ABLOCKS_BASE(abase) (abase) |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
977 #else |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
978 #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
|
979 (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
|
980 #endif |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
981 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
982 /* The list of free ablock. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
983 static struct ablock *free_ablock; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
984 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
985 /* Allocate an aligned block of nbytes. |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
986 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
|
987 smaller or equal to BLOCK_BYTES. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
988 static POINTER_TYPE * |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
989 lisp_align_malloc (nbytes, type) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
990 size_t nbytes; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
991 enum mem_type type; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
992 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
993 void *base, *val; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
994 struct ablocks *abase; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
995 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
996 eassert (nbytes <= BLOCK_BYTES); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
997 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
998 BLOCK_INPUT; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
999 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1000 #ifdef GC_MALLOC_CHECK |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1001 allocated_mem_type = type; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1002 #endif |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1003 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1004 if (!free_ablock) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1005 { |
|
52276
5623f26dff58
(lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents:
52256
diff
changeset
|
1006 int i; |
|
5623f26dff58
(lisp_align_malloc): Change type of `aligned'.
Dave Love <fx@gnu.org>
parents:
52256
diff
changeset
|
1007 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
|
1008 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1009 #ifdef DOUG_LEA_MALLOC |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1010 /* 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
|
1011 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
|
1012 a dumped Emacs. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1013 mallopt (M_MMAP_MAX, 0); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1014 #endif |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1015 |
|
69348
2c8e608f28e7
(USE_POSIX_MEMALIGN): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
68974
diff
changeset
|
1016 #ifdef USE_POSIX_MEMALIGN |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1017 { |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1018 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
|
1019 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
|
1020 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
|
1021 abase = base; |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1022 } |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1023 #else |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1024 base = malloc (ABLOCKS_BYTES); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1025 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
|
1026 #endif |
|
a05a653f63af
(lisp_align_malloc): Check for base == 0 regardless of HAVE_POSIX_MEMALIGN.
Richard M. Stallman <rms@gnu.org>
parents:
55816
diff
changeset
|
1027 |
|
52837
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
1028 if (base == 0) |
|
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
1029 { |
|
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
1030 UNBLOCK_INPUT; |
|
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
1031 memory_full (); |
|
1bbf3f566879
(lisp_align_malloc): If BASE is 0, call memory_full.
Richard M. Stallman <rms@gnu.org>
parents:
52547
diff
changeset
|
1032 } |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1033 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1034 aligned = (base == abase); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1035 if (!aligned) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1036 ((void**)abase)[-1] = base; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1037 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1038 #ifdef DOUG_LEA_MALLOC |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1039 /* 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
|
1040 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1041 #endif |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1042 |
|
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
1043 #ifndef USE_LSB_TAG |
|
52256
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1044 /* 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
|
1045 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
|
1046 running out of memory. */ |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1047 if (type != MEM_TYPE_NON_LISP) |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1048 { |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1049 Lisp_Object tem; |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1050 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
|
1051 XSETCONS (tem, end); |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1052 if ((char *) XCONS (tem) != end) |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1053 { |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1054 lisp_malloc_loser = base; |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1055 free (base); |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1056 UNBLOCK_INPUT; |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1057 memory_full (); |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1058 } |
|
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1059 } |
|
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
1060 #endif |
|
52256
36e112575ca8
(lisp_align_malloc): Check for memory full when
Gerd Moellmann <gerd@gnu.org>
parents:
52166
diff
changeset
|
1061 |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1062 /* 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
|
1063 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
|
1064 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
|
1065 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1066 abase->blocks[i].abase = abase; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1067 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
|
1068 free_ablock = &abase->blocks[i]; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1069 } |
|
52453
62fcd311bb98
Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1070 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
|
1071 |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1072 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
|
1073 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
|
1074 eassert (ABLOCK_ABASE (&abase->blocks[0]) == abase); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1075 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
|
1076 eassert (aligned == (long) ABLOCKS_BUSY (abase)); |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1077 } |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1078 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1079 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
|
1080 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
|
1081 val = free_ablock; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1082 free_ablock = free_ablock->x.next_free; |
|
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 GC_MARK_STACK && !defined GC_MALLOC_CHECK |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1085 if (val && type != MEM_TYPE_NON_LISP) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1086 mem_insert (val, (char *) val + nbytes, type); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1087 #endif |
|
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 UNBLOCK_INPUT; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1090 if (!val && nbytes) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1091 memory_full (); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1092 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1093 eassert (0 == ((EMACS_UINT)val) % BLOCK_ALIGN); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1094 return val; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1095 } |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1096 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1097 static void |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1098 lisp_align_free (block) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1099 POINTER_TYPE *block; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1100 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1101 struct ablock *ablock = block; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1102 struct ablocks *abase = ABLOCK_ABASE (ablock); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1103 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1104 BLOCK_INPUT; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1105 #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
|
1106 mem_delete (mem_find (block)); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1107 #endif |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1108 /* Put on free list. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1109 ablock->x.next_free = free_ablock; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1110 free_ablock = ablock; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1111 /* Update busy count. */ |
|
52453
62fcd311bb98
Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1112 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
|
1113 |
|
52453
62fcd311bb98
Use long instead of int when casting ABLOCKS_BUSY to
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1114 if (2 > (long) ABLOCKS_BUSY (abase)) |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1115 { /* 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
|
1116 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
|
1117 struct ablock **tem = &free_ablock; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1118 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
|
1119 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1120 while (*tem) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1121 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1122 if (*tem >= (struct ablock *) abase && *tem < atop) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1123 { |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1124 i++; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1125 *tem = (*tem)->x.next_free; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1126 } |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1127 else |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1128 tem = &(*tem)->x.next_free; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1129 } |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1130 eassert ((aligned & 1) == aligned); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1131 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
|
1132 #ifdef USE_POSIX_MEMALIGN |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
1133 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
|
1134 #endif |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1135 free (ABLOCKS_BASE (abase)); |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1136 } |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1137 UNBLOCK_INPUT; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
1138 } |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1139 |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1140 /* 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
|
1141 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
|
1142 |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1143 struct buffer * |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1144 allocate_buffer () |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1145 { |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1146 struct buffer *b |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1147 = (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
|
1148 MEM_TYPE_BUFFER); |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1149 return b; |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1150 } |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
1151 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1152 |
|
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1153 #ifndef SYSTEM_MALLOC |
|
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1154 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1155 /* 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
|
1156 |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1157 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
|
1158 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
|
1159 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
|
1160 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
|
1161 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
|
1162 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
|
1163 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
|
1164 |
|
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1165 #ifndef SYNC_INPUT |
|
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1166 |
|
30914
6362b1fc09f2
(lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
30823
diff
changeset
|
1167 #ifndef DOUG_LEA_MALLOC |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1168 extern void * (*__malloc_hook) P_ ((size_t, const void *)); |
|
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1169 extern void * (*__realloc_hook) P_ ((void *, size_t, const void *)); |
|
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1170 extern void (*__free_hook) P_ ((void *, const void *)); |
|
30914
6362b1fc09f2
(lisp_malloc): Declare with POINTER_TYPE.
Dave Love <fx@gnu.org>
parents:
30823
diff
changeset
|
1171 /* 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
|
1172 #endif /* DOUG_LEA_MALLOC */ |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1173 static void * (*old_malloc_hook) P_ ((size_t, const void *)); |
|
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1174 static void * (*old_realloc_hook) P_ ((void *, size_t, const void*)); |
|
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1175 static void (*old_free_hook) P_ ((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
|
1176 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1177 /* 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
|
1178 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1179 static void |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1180 emacs_blocked_free (ptr, ptr2) |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1181 void *ptr; |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1182 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
|
1183 { |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
1184 EMACS_INT bytes_used_now; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
1185 |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1186 BLOCK_INPUT_ALLOC; |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1187 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1188 #ifdef GC_MALLOC_CHECK |
|
32776
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1189 if (ptr) |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1190 { |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1191 struct mem_node *m; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1192 |
|
32776
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1193 m = mem_find (ptr); |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1194 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
|
1195 { |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1196 fprintf (stderr, |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1197 "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
|
1198 abort (); |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1199 } |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1200 else |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1201 { |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1202 /* 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
|
1203 mem_delete (m); |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1204 } |
|
416924b6f303
(emacs_blocked_free) [GC_MALLOC_CHECK]: Handle freeing
Gerd Moellmann <gerd@gnu.org>
parents:
32700
diff
changeset
|
1205 } |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1206 #endif /* GC_MALLOC_CHECK */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1207 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1208 __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
|
1209 free (ptr); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1210 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1211 /* 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
|
1212 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
|
1213 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
|
1214 if (! NILP (Vmemory_full) |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1215 /* 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
|
1216 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
|
1217 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
|
1218 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
|
1219 && (bytes_used_when_full |
|
66547
9373f926904a
(BYTES_USED): Use uordblks, not arena.
Richard M. Stallman <rms@gnu.org>
parents:
66541
diff
changeset
|
1220 > ((bytes_used_when_reconsidered = BYTES_USED) |
|
66541
60d77f0435af
* alloc.c (emacs_blocked_free): Fix typo.
Chong Yidong <cyd@stupidchicken.com>
parents:
66530
diff
changeset
|
1221 + 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
|
1222 refill_memory_reserve (); |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1223 |
|
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
1224 __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
|
1225 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
|
1226 } |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1227 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1228 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
1229 /* 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
|
1230 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1231 static void * |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1232 emacs_blocked_malloc (size, ptr) |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
1233 size_t size; |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1234 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
|
1235 { |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1236 void *value; |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1237 |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1238 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
|
1239 __malloc_hook = old_malloc_hook; |
|
17831
9238a2254a23
(BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents:
17348
diff
changeset
|
1240 #ifdef DOUG_LEA_MALLOC |
|
83543
6b25ef5cc276
Fix obvious runtime errors after merge.
Karoly Lorentey <lorentey@elte.hu>
parents:
83541
diff
changeset
|
1241 /* Segfaults on my system. --lorentey */ |
|
6b25ef5cc276
Fix obvious runtime errors after merge.
Karoly Lorentey <lorentey@elte.hu>
parents:
83541
diff
changeset
|
1242 /* 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
|
1243 #else |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
1244 __malloc_extra_blocks = malloc_hysteresis; |
|
17831
9238a2254a23
(BYTES_USED): Put # at the beginning of line.
Kenichi Handa <handa@m17n.org>
parents:
17348
diff
changeset
|
1245 #endif |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1246 |
|
3581
152fd924c7bb
* alloc.c (emacs_blocked_malloc, emacs_blocked_realloc): Cast the
Jim Blandy <jimb@redhat.com>
parents:
3536
diff
changeset
|
1247 value = (void *) malloc (size); |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1248 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1249 #ifdef GC_MALLOC_CHECK |
|
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 (value); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1252 if (m != MEM_NIL) |
|
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, "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
|
1255 value); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1256 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
|
1257 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
|
1258 m->type); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1259 abort (); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1260 } |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1261 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1262 if (!dont_register_blocks) |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1263 { |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1264 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
|
1265 allocated_mem_type = MEM_TYPE_NON_LISP; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1266 } |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1267 } |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1268 #endif /* GC_MALLOC_CHECK */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1269 |
|
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
1270 __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
|
1271 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
|
1272 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1273 /* 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
|
1274 return value; |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1275 } |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1276 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1277 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1278 /* 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
|
1279 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1280 static void * |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1281 emacs_blocked_realloc (ptr, size, ptr2) |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1282 void *ptr; |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
1283 size_t size; |
|
65764
375ab086d366
* image.c (slurp_file, xbm_read_bitmap_data): Cast to the correct
Dan Nicolaescu <dann@ics.uci.edu>
parents:
64611
diff
changeset
|
1284 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
|
1285 { |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1286 void *value; |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1287 |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1288 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
|
1289 __realloc_hook = old_realloc_hook; |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1290 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1291 #ifdef GC_MALLOC_CHECK |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1292 if (ptr) |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1293 { |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1294 struct mem_node *m = mem_find (ptr); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1295 if (m == MEM_NIL || m->start != ptr) |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1296 { |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1297 fprintf (stderr, |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1298 "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
|
1299 ptr); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1300 abort (); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1301 } |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1302 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1303 mem_delete (m); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1304 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1305 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1306 /* fprintf (stderr, "%p -> realloc\n", ptr); */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1307 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1308 /* Prevent malloc from registering blocks. */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1309 dont_register_blocks = 1; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1310 #endif /* GC_MALLOC_CHECK */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1311 |
|
3581
152fd924c7bb
* alloc.c (emacs_blocked_malloc, emacs_blocked_realloc): Cast the
Jim Blandy <jimb@redhat.com>
parents:
3536
diff
changeset
|
1312 value = (void *) realloc (ptr, size); |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1313 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1314 #ifdef GC_MALLOC_CHECK |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1315 dont_register_blocks = 0; |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1316 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1317 { |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1318 struct mem_node *m = mem_find (value); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1319 if (m != MEM_NIL) |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1320 { |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1321 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
|
1322 abort (); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1323 } |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1324 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1325 /* 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
|
1326 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
|
1327 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1328 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1329 /* fprintf (stderr, "%p <- realloc\n", value); */ |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
1330 #endif /* GC_MALLOC_CHECK */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1331 |
|
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
1332 __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
|
1333 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
|
1334 |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1335 return value; |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1336 } |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1337 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1338 |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1339 #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
|
1340 /* 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
|
1341 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
|
1342 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
|
1343 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
|
1344 |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1345 void |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1346 reset_malloc_hooks () |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1347 { |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1348 __free_hook = 0; |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1349 __malloc_hook = 0; |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1350 __realloc_hook = 0; |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1351 } |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1352 #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
|
1353 |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
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 /* 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
|
1356 |
|
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1357 void |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1358 uninterrupt_malloc () |
|
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2370
diff
changeset
|
1359 { |
|
58818
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1360 #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
|
1361 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
|
1362 |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1363 /* 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
|
1364 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
|
1365 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
|
1366 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
|
1367 pthread_mutex_init (&alloc_mutex, &attr); |
|
f8cddae7d959
* gtkutil.c: Include signal.h and syssignal.h.
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
58707
diff
changeset
|
1368 #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
|
1369 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1370 if (__free_hook != emacs_blocked_free) |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1371 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
|
1372 __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
|
1373 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1374 if (__malloc_hook != emacs_blocked_malloc) |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1375 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
|
1376 __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
|
1377 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1378 if (__realloc_hook != emacs_blocked_realloc) |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1379 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
|
1380 __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
|
1381 } |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1382 |
|
59359
1678d14c4109
(refill_memory_reserve): Move.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59314
diff
changeset
|
1383 #endif /* not SYNC_INPUT */ |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1384 #endif /* not SYSTEM_MALLOC */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1385 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1386 |
| 300 | 1387 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1388 /*********************************************************************** |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1389 Interval Allocation |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1390 ***********************************************************************/ |
|
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
1391 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1392 /* 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
|
1393 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
|
1394 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1395 #define INTERVAL_BLOCK_SIZE \ |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1396 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval)) |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1397 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1398 /* 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
|
1399 structure. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1400 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1401 struct interval_block |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1402 { |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1403 /* Place `intervals' first, to preserve alignment. */ |
|
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1404 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
|
1405 struct interval_block *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1406 }; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1407 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1408 /* 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
|
1409 blocks. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1410 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1411 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
|
1412 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1413 /* 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
|
1414 structure. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1415 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1416 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
|
1417 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1418 /* 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
|
1419 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1420 static int total_free_intervals, total_intervals; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1421 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1422 /* List of free intervals. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1423 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1424 INTERVAL interval_free_list; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1425 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1426 /* 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
|
1427 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1428 int n_interval_blocks; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1429 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1430 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1431 /* Initialize interval allocation. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1432 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1433 static void |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1434 init_intervals () |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1435 { |
|
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
1436 interval_block = NULL; |
|
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
1437 interval_block_index = INTERVAL_BLOCK_SIZE; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1438 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
|
1439 n_interval_blocks = 0; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1440 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1441 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1442 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1443 /* Return a new interval. */ |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1444 |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1445 INTERVAL |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1446 make_interval () |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1447 { |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1448 INTERVAL val; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1449 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1450 /* eassert (!handling_signal); */ |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1451 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1452 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1453 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1454 #endif |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
1455 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1456 if (interval_free_list) |
|
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 val = interval_free_list; |
|
28269
fd13be8ae190
Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents:
28220
diff
changeset
|
1459 interval_free_list = INTERVAL_PARENT (interval_free_list); |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1460 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1461 else |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1462 { |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1463 if (interval_block_index == INTERVAL_BLOCK_SIZE) |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1464 { |
| 12529 | 1465 register struct interval_block *newi; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1466 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1467 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
|
1468 MEM_TYPE_NON_LISP); |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1469 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1470 newi->next = interval_block; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1471 interval_block = newi; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1472 interval_block_index = 0; |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
1473 n_interval_blocks++; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1474 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1475 val = &interval_block->intervals[interval_block_index++]; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1476 } |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1477 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1478 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1479 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1480 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1481 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1482 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
|
1483 intervals_consed++; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1484 RESET_INTERVAL (val); |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1485 val->gcmarkbit = 0; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1486 return val; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1487 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1488 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1489 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1490 /* Mark Lisp objects in interval I. */ |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1491 |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1492 static void |
|
1957
54c8c66cd9ac
(mark_interval): Add ignored arg.
Richard M. Stallman <rms@gnu.org>
parents:
1939
diff
changeset
|
1493 mark_interval (i, dummy) |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1494 register INTERVAL i; |
|
1957
54c8c66cd9ac
(mark_interval): Add ignored arg.
Richard M. Stallman <rms@gnu.org>
parents:
1939
diff
changeset
|
1495 Lisp_Object dummy; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1496 { |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1497 eassert (!i->gcmarkbit); /* Intervals are never shared. */ |
|
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1498 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
|
1499 mark_object (i->plist); |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1500 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1501 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1502 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1503 /* 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
|
1504 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
|
1505 |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1506 static void |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1507 mark_interval_tree (tree) |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1508 register INTERVAL tree; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1509 { |
|
4139
0b32ee899a3a
Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents:
4087
diff
changeset
|
1510 /* 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
|
1511 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
|
1512 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
|
1513 |
|
39859
36068b62b4c1
(mark_interval_tree): Use traverse_intervals_noorder.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
1514 traverse_intervals_noorder (tree, mark_interval, Qnil); |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1515 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1516 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1517 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1518 /* 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
|
1519 |
|
4139
0b32ee899a3a
Consistently use the mark bit of the root interval's parent field
Jim Blandy <jimb@redhat.com>
parents:
4087
diff
changeset
|
1520 #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
|
1521 do { \ |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1522 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
|
1523 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
|
1524 } while (0) |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1525 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1526 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1527 #define UNMARK_BALANCE_INTERVALS(i) \ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1528 do { \ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1529 if (! NULL_INTERVAL_P (i)) \ |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
1530 (i) = balance_intervals (i); \ |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1531 } while (0) |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1532 |
|
28469
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1533 |
|
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1534 /* Number support. If NO_UNION_TYPE isn't in effect, we |
|
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1535 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
|
1536 #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
|
1537 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
|
1538 make_number (n) |
|
60896
25e4a0f171b5
(make_number): The arg can be bigger than `int'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
60143
diff
changeset
|
1539 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
|
1540 { |
|
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1541 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
|
1542 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
|
1543 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
|
1544 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
|
1545 } |
|
f66f2b4d5eb7
* alloc.c (MARK_STRING, UNMARK_STRING, STRING_MARKED_P): Expand non-union-type
Ken Raeburn <raeburn@raeburn.org>
parents:
28411
diff
changeset
|
1546 #endif |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
1547 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1548 /*********************************************************************** |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1549 String Allocation |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1550 ***********************************************************************/ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1551 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1552 /* 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
|
1553 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
|
1554 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
|
1555 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
|
1556 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
|
1557 we keep. |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1558 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1559 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
|
1560 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
|
1561 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
|
1562 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1563 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
|
1564 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
|
1565 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
|
1566 its sdata structure. |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1567 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1568 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
|
1569 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
|
1570 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
|
1571 `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
|
1572 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
|
1573 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
|
1574 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1575 /* 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
|
1576 is 8192 minus malloc overhead. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1577 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1578 #define SBLOCK_SIZE 8188 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1579 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1580 /* 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
|
1581 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
|
1582 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1583 #define LARGE_STRING_BYTES 1024 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1584 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1585 /* 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
|
1586 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
|
1587 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1588 struct sdata |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1589 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1590 /* 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
|
1591 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
|
1592 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
|
1593 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
|
1594 (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
|
1595 contents. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1596 struct Lisp_String *string; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1597 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1598 #ifdef GC_CHECK_STRING_BYTES |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1599 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1600 EMACS_INT nbytes; |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1601 unsigned char data[1]; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1602 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1603 #define SDATA_NBYTES(S) (S)->nbytes |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1604 #define SDATA_DATA(S) (S)->data |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1605 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1606 #else /* not GC_CHECK_STRING_BYTES */ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1607 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1608 union |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1609 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1610 /* When STRING in non-null. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1611 unsigned char data[1]; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1612 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1613 /* When STRING is null. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1614 EMACS_INT nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1615 } u; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1616 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1617 |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1618 #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
|
1619 #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
|
1620 |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1621 #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
|
1622 }; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1623 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1624 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1625 /* 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
|
1626 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
|
1627 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
|
1628 as large as needed. */ |
|
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 struct sblock |
|
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 /* Next in list. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1633 struct sblock *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1634 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1635 /* 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
|
1636 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
|
1637 struct sdata *next_free; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1638 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1639 /* Start of data. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1640 struct sdata first_data; |
|
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 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1643 /* 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
|
1644 1024 minus malloc overhead. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1645 |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1646 #define STRING_BLOCK_SIZE \ |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1647 ((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
|
1648 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1649 /* 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
|
1650 are allocated. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1651 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1652 struct string_block |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1653 { |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1654 /* Place `strings' first, to preserve alignment. */ |
|
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
1655 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
|
1656 struct string_block *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1657 }; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1658 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1659 /* 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
|
1660 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
|
1661 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
|
1662 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1663 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
|
1664 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1665 /* List of sblocks for large strings. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1666 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1667 static struct sblock *large_sblocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1668 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1669 /* 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
|
1670 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1671 static struct string_block *string_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1672 static int n_string_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1673 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1674 /* Free-list of Lisp_Strings. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1675 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1676 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
|
1677 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1678 /* 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
|
1679 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1680 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
|
1681 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1682 /* 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
|
1683 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1684 static int total_string_size; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1685 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1686 /* 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
|
1687 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
|
1688 free-list. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1689 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1690 #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
|
1691 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1692 /* 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
|
1693 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
|
1694 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
|
1695 structure starts at a constant offset in front of that. */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1696 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1697 #ifdef GC_CHECK_STRING_BYTES |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1698 |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1699 #define SDATA_OF_STRING(S) \ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1700 ((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
|
1701 - sizeof (EMACS_INT))) |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1702 |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1703 #else /* not GC_CHECK_STRING_BYTES */ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1704 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1705 #define SDATA_OF_STRING(S) \ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1706 ((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
|
1707 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1708 #endif /* not GC_CHECK_STRING_BYTES */ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1709 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1710 |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1711 #ifdef GC_CHECK_STRING_OVERRUN |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1712 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1713 /* 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
|
1714 "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
|
1715 presence of this cookie during GC. */ |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1716 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1717 #define GC_STRING_OVERRUN_COOKIE_SIZE 4 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1718 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
|
1719 { 0xde, 0xad, 0xbe, 0xef }; |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1720 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1721 #else |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1722 #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
|
1723 #endif |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1724 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1725 /* 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
|
1726 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
|
1727 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
|
1728 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1729 #ifdef GC_CHECK_STRING_BYTES |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1730 |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1731 #define SDATA_SIZE(NBYTES) \ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1732 ((sizeof (struct Lisp_String *) \ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1733 + (NBYTES) + 1 \ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1734 + sizeof (EMACS_INT) \ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1735 + sizeof (EMACS_INT) - 1) \ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1736 & ~(sizeof (EMACS_INT) - 1)) |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1737 |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1738 #else /* not GC_CHECK_STRING_BYTES */ |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1739 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1740 #define SDATA_SIZE(NBYTES) \ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1741 ((sizeof (struct Lisp_String *) \ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1742 + (NBYTES) + 1 \ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1743 + sizeof (EMACS_INT) - 1) \ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1744 & ~(sizeof (EMACS_INT) - 1)) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1745 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
1746 #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
|
1747 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1748 /* Extra bytes to allocate for each string. */ |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1749 |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1750 #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
|
1751 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1752 /* 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
|
1753 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1754 void |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1755 init_strings () |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1756 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1757 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
|
1758 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
|
1759 string_blocks = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1760 n_string_blocks = 0; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1761 string_free_list = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1762 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1763 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1764 |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1765 #ifdef GC_CHECK_STRING_BYTES |
|
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1766 |
|
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1767 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
|
1768 |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1769 void check_string_bytes P_ ((int)); |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1770 void check_sblock P_ ((struct sblock *)); |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1771 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1772 #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
|
1773 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1774 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1775 /* 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
|
1776 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1777 int |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1778 string_bytes (s) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1779 struct Lisp_String *s; |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1780 { |
|
51985
b52e88c3d6d0
(MARK_STRING, UNMARK_STRING, STRING_MARKED_P)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51974
diff
changeset
|
1781 int nbytes = (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte); |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1782 if (!PURE_POINTER_P (s) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1783 && s->data |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1784 && 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
|
1785 abort (); |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1786 return nbytes; |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1787 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1788 |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
1789 /* 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
|
1790 |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1791 void |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1792 check_sblock (b) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1793 struct sblock *b; |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1794 { |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1795 struct sdata *from, *end, *from_end; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1796 |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1797 end = b->next_free; |
|
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 (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
|
1800 { |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1801 /* 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
|
1802 overwrite data we need to compute it. */ |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1803 int nbytes; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1804 |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1805 /* 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
|
1806 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
|
1807 if (from->string) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1808 CHECK_STRING_BYTES (from->string); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1809 |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1810 if (from->string) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1811 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
|
1812 else |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1813 nbytes = SDATA_NBYTES (from); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1814 |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1815 nbytes = SDATA_SIZE (nbytes); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1816 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
|
1817 } |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1818 } |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1819 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1820 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1821 /* 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
|
1822 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
|
1823 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
|
1824 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1825 void |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1826 check_string_bytes (all_p) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1827 int all_p; |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1828 { |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1829 if (all_p) |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1830 { |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1831 struct sblock *b; |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1832 |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1833 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
|
1834 { |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1835 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
|
1836 if (s) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1837 CHECK_STRING_BYTES (s); |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1838 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1839 |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1840 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
|
1841 check_sblock (b); |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1842 } |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1843 else |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1844 check_sblock (current_sblock); |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1845 } |
|
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1846 |
|
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1847 #endif /* GC_CHECK_STRING_BYTES */ |
|
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1848 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1849 #ifdef GC_CHECK_STRING_FREE_LIST |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1850 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1851 /* 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
|
1852 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
|
1853 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1854 static void |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1855 check_string_free_list () |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1856 { |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1857 struct Lisp_String *s; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1858 |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1859 /* 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
|
1860 s = string_free_list; |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1861 while (s != NULL) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1862 { |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1863 if ((unsigned)s < 1024) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1864 abort(); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1865 s = NEXT_FREE_LISP_STRING (s); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1866 } |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1867 } |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1868 #else |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1869 #define check_string_free_list() |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1870 #endif |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1871 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1872 /* Return a new Lisp_String. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1873 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1874 static struct Lisp_String * |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1875 allocate_string () |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1876 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1877 struct Lisp_String *s; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1878 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1879 /* eassert (!handling_signal); */ |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1880 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1881 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1882 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1883 #endif |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
1884 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1885 /* 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
|
1886 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
|
1887 if (string_free_list == NULL) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1888 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1889 struct string_block *b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1890 int i; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1891 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1892 b = (struct string_block *) lisp_malloc (sizeof *b, MEM_TYPE_STRING); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1893 bzero (b, sizeof *b); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1894 b->next = string_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1895 string_blocks = b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1896 ++n_string_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1897 |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1898 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
|
1899 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1900 s = b->strings + i; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1901 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
|
1902 string_free_list = s; |
|
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 |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
1905 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
|
1906 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1907 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
1908 check_string_free_list (); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1909 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1910 /* 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
|
1911 s = string_free_list; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1912 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
|
1913 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1914 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1915 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1916 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1917 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1918 /* Probably not strictly necessary, but play it safe. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1919 bzero (s, sizeof *s); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1920 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1921 --total_free_strings; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1922 ++total_strings; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1923 ++strings_consed; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1924 consing_since_gc += sizeof *s; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1925 |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1926 #ifdef GC_CHECK_STRING_BYTES |
|
35660
b9366f467430
* alloc.c (allocate_string) [macintosh]: Call check_string_bytes
Andrew Choi <akochoi@shaw.ca>
parents:
35183
diff
changeset
|
1927 if (!noninteractive |
|
44890
01b93e5e53a7
Patch for building Emacs on Mac OS X. April 26, 2002. See ChangeLog,
Andrew Choi <akochoi@shaw.ca>
parents:
44149
diff
changeset
|
1928 #ifdef MAC_OS8 |
|
35660
b9366f467430
* alloc.c (allocate_string) [macintosh]: Call check_string_bytes
Andrew Choi <akochoi@shaw.ca>
parents:
35183
diff
changeset
|
1929 && current_sblock |
|
b9366f467430
* alloc.c (allocate_string) [macintosh]: Call check_string_bytes
Andrew Choi <akochoi@shaw.ca>
parents:
35183
diff
changeset
|
1930 #endif |
|
b9366f467430
* alloc.c (allocate_string) [macintosh]: Call check_string_bytes
Andrew Choi <akochoi@shaw.ca>
parents:
35183
diff
changeset
|
1931 ) |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1932 { |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1933 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
|
1934 { |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1935 check_string_bytes_count = 0; |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1936 check_string_bytes (1); |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1937 } |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1938 else |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1939 check_string_bytes (0); |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
1940 } |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
1941 #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
|
1942 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1943 return s; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1944 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1945 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1946 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1947 /* 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
|
1948 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
|
1949 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
|
1950 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
|
1951 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
|
1952 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1953 void |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1954 allocate_string_data (s, nchars, nbytes) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1955 struct Lisp_String *s; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1956 int nchars, nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1957 { |
|
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1958 struct sdata *data, *old_data; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1959 struct sblock *b; |
|
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
1960 int needed, old_nbytes; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1961 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1962 /* 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
|
1963 of string data. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1964 needed = SDATA_SIZE (nbytes); |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1965 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
|
1966 old_nbytes = GC_STRING_BYTES (s); |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1967 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1968 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1969 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
1970 #endif |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1971 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1972 if (nbytes > LARGE_STRING_BYTES) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1973 { |
|
30557
5056adb52e97
(lisp_malloc, lisp_free): Use size_t and POINTER_TYPE.
Gerd Moellmann <gerd@gnu.org>
parents:
30317
diff
changeset
|
1974 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
|
1975 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1976 #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
|
1977 /* 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
|
1978 because mapped region contents are not preserved in |
| 51318 | 1979 a dumped Emacs. |
| 1980 | |
| 1981 In case you think of allowing it in a dumped Emacs at the | |
| 1982 cost of not being able to re-dump, there's another reason: | |
| 1983 mmap'ed data typically have an address towards the top of the | |
| 1984 address space, which won't fit into an EMACS_INT (at least on | |
| 1985 32-bit systems with the current tagging scheme). --fx */ | |
|
61225
1e515cc6ca0c
* alloc.c (allocate_string_data): Call BLOCK_INPUT before calling
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
60896
diff
changeset
|
1986 BLOCK_INPUT; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1987 mallopt (M_MMAP_MAX, 0); |
|
61225
1e515cc6ca0c
* alloc.c (allocate_string_data): Call BLOCK_INPUT before calling
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
60896
diff
changeset
|
1988 UNBLOCK_INPUT; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1989 #endif |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1990 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
1991 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
|
1992 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1993 #ifdef DOUG_LEA_MALLOC |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1994 /* Back to a reasonable maximum of mmap'ed areas. */ |
|
61225
1e515cc6ca0c
* alloc.c (allocate_string_data): Call BLOCK_INPUT before calling
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
60896
diff
changeset
|
1995 BLOCK_INPUT; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1996 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); |
|
61225
1e515cc6ca0c
* alloc.c (allocate_string_data): Call BLOCK_INPUT before calling
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
60896
diff
changeset
|
1997 UNBLOCK_INPUT; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
1998 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
1999 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2000 b->next_free = &b->first_data; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2001 b->first_data.string = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2002 b->next = large_sblocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2003 large_sblocks = b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2004 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2005 else if (current_sblock == NULL |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2006 || (((char *) current_sblock + SBLOCK_SIZE |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2007 - (char *) current_sblock->next_free) |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2008 < (needed + GC_STRING_EXTRA))) |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2009 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2010 /* 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
|
2011 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
|
2012 b->next_free = &b->first_data; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2013 b->first_data.string = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2014 b->next = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2015 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2016 if (current_sblock) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2017 current_sblock->next = b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2018 else |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2019 oldest_sblock = b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2020 current_sblock = b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2021 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2022 else |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2023 b = current_sblock; |
|
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
2024 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2025 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
|
2026 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
|
2027 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2028 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2029 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2030 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2031 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2032 data->string = s; |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2033 s->data = SDATA_DATA (data); |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2034 #ifdef GC_CHECK_STRING_BYTES |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2035 SDATA_NBYTES (data) = nbytes; |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2036 #endif |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2037 s->size = nchars; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2038 s->size_byte = nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2039 s->data[nbytes] = '\0'; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2040 #ifdef GC_CHECK_STRING_OVERRUN |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2041 bcopy (string_overrun_cookie, (char *) data + needed, |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2042 GC_STRING_OVERRUN_COOKIE_SIZE); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2043 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2044 |
|
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
2045 /* 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
|
2046 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
|
2047 in it. */ |
|
30293
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
2048 if (old_data) |
|
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
2049 { |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2050 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
|
2051 old_data->string = NULL; |
|
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
2052 } |
|
4a27d6a88c43
(allocate_string_data): If string had already data
Gerd Moellmann <gerd@gnu.org>
parents:
29781
diff
changeset
|
2053 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2054 consing_since_gc += needed; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2055 } |
|
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 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2058 /* Sweep and compact strings. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2059 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2060 static void |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2061 sweep_strings () |
|
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 struct string_block *b, *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2064 struct string_block *live_blocks = NULL; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2065 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2066 string_free_list = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2067 total_strings = total_free_strings = 0; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2068 total_string_size = 0; |
|
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 /* 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
|
2071 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
|
2072 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2073 int i, nfree = 0; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2074 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
|
2075 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2076 next = b->next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2077 |
|
51907
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
2078 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
|
2079 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2080 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
|
2081 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2082 if (s->data) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2083 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2084 /* 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
|
2085 if (STRING_MARKED_P (s)) |
|
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 /* 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
|
2088 UNMARK_STRING (s); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2089 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2090 if (!NULL_INTERVAL_P (s->intervals)) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2091 UNMARK_BALANCE_INTERVALS (s->intervals); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2092 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2093 ++total_strings; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2094 total_string_size += STRING_BYTES (s); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2095 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2096 else |
|
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 /* 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
|
2099 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
|
2100 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2101 /* 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
|
2102 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
|
2103 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
|
2104 #ifdef GC_CHECK_STRING_BYTES |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2105 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
|
2106 abort (); |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2107 #else |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2108 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
|
2109 #endif |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2110 data->string = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2111 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2112 /* 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
|
2113 know it's free. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2114 s->data = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2115 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2116 /* 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
|
2117 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
|
2118 string_free_list = s; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2119 ++nfree; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2120 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2121 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2122 else |
|
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 /* 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
|
2125 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
|
2126 string_free_list = s; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2127 ++nfree; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2128 } |
|
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 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2131 /* 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
|
2132 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
|
2133 if (nfree == STRING_BLOCK_SIZE |
|
4073a8ee4fc0
(BLOCK_PADDING): Rename from ABLOCKS_PADDING. Update users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51843
diff
changeset
|
2134 && 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
|
2135 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2136 lisp_free (b); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2137 --n_string_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2138 string_free_list = free_list_before; |
|
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 else |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2141 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2142 total_free_strings += nfree; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2143 b->next = live_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2144 live_blocks = b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2145 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2146 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2147 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2148 check_string_free_list (); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2149 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2150 string_blocks = live_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2151 free_large_strings (); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2152 compact_small_strings (); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2153 |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2154 check_string_free_list (); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2155 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2156 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2157 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2158 /* Free dead large strings. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2159 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2160 static void |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2161 free_large_strings () |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2162 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2163 struct sblock *b, *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2164 struct sblock *live_blocks = NULL; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2165 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2166 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
|
2167 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2168 next = b->next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2169 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2170 if (b->first_data.string == NULL) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2171 lisp_free (b); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2172 else |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2173 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2174 b->next = live_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2175 live_blocks = b; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2176 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2177 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2178 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2179 large_sblocks = live_blocks; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2180 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2181 |
|
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 /* 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
|
2184 data of live strings after compaction. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2185 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2186 static void |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2187 compact_small_strings () |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2188 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2189 struct sblock *b, *tb, *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2190 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
|
2191 struct sdata *to_end, *from_end; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2192 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2193 /* 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
|
2194 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
|
2195 tb = oldest_sblock; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2196 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
|
2197 to = &tb->first_data; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2198 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2199 /* 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
|
2200 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
|
2201 copying will happen this way. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2202 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
|
2203 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2204 end = b->next_free; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2205 xassert ((char *) end <= (char *) b + SBLOCK_SIZE); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2206 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2207 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
|
2208 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2209 /* 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
|
2210 overwrite data we need to compute it. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2211 int nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2212 |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2213 #ifdef GC_CHECK_STRING_BYTES |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2214 /* 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
|
2215 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
|
2216 if (from->string |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2217 && 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
|
2218 abort (); |
|
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2219 #endif /* GC_CHECK_STRING_BYTES */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2220 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2221 if (from->string) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2222 nbytes = GC_STRING_BYTES (from->string); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2223 else |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2224 nbytes = SDATA_NBYTES (from); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2225 |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2226 if (nbytes > LARGE_STRING_BYTES) |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2227 abort (); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2228 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2229 nbytes = SDATA_SIZE (nbytes); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2230 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
|
2231 |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2232 #ifdef GC_CHECK_STRING_OVERRUN |
|
58707
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2233 if (bcmp (string_overrun_cookie, |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2234 ((char *) from_end) - GC_STRING_OVERRUN_COOKIE_SIZE, |
|
57741ce4cd6b
Add commentary for last change.
Kim F. Storm <storm@cua.dk>
parents:
58631
diff
changeset
|
2235 GC_STRING_OVERRUN_COOKIE_SIZE)) |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2236 abort (); |
|
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2237 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2238 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2239 /* 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
|
2240 if (from->string) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2241 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2242 /* 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
|
2243 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
|
2244 if (to_end > tb_end) |
|
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 tb->next_free = to; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2247 tb = tb->next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2248 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
|
2249 to = &tb->first_data; |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2250 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
|
2251 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2252 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2253 /* 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
|
2254 if (from != to) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2255 { |
|
30823
8ee3740aaf60
(compact_small_strings): Use safe_bcopy, add an
Gerd Moellmann <gerd@gnu.org>
parents:
30784
diff
changeset
|
2256 xassert (tb != b || to <= from); |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2257 safe_bcopy ((char *) from, (char *) to, nbytes + GC_STRING_EXTRA); |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
2258 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
|
2259 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2260 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2261 /* 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
|
2262 to = to_end; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2263 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2264 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2265 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2266 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2267 /* 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
|
2268 we can free them. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2269 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
|
2270 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2271 next = b->next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2272 lisp_free (b); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2273 } |
|
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 tb->next_free = to; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2276 tb->next = NULL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2277 current_sblock = tb; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2278 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2279 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2280 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2281 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
|
2282 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
|
2283 LENGTH must be an integer. |
|
1c3b8ce97c63
(Fmake_string): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
55720
diff
changeset
|
2284 INIT must be an integer that represents a character. */) |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
2285 (length, init) |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2286 Lisp_Object length, init; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2287 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2288 register Lisp_Object val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2289 register unsigned char *p, *end; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2290 int c, nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2291 |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2292 CHECK_NATNUM (length); |
|
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2293 CHECK_NUMBER (init); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2294 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2295 c = XINT (init); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2296 if (SINGLE_BYTE_CHAR_P (c)) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2297 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2298 nbytes = XINT (length); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2299 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
|
2300 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
|
2301 end = p + SCHARS (val); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2302 while (p != end) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2303 *p++ = c; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2304 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2305 else |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2306 { |
|
33800
7f148cfbd1f7
(Fmake_string): Use MAX_MULTIBYTE_LENGTH, instead of hard coded `4'.
Kenichi Handa <handa@m17n.org>
parents:
33764
diff
changeset
|
2307 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
|
2308 int len = CHAR_STRING (c, str); |
|
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 nbytes = len * XINT (length); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2311 val = make_uninit_multibyte_string (XINT (length), nbytes); |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
2312 p = SDATA (val); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2313 end = p + nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2314 while (p != end) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2315 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2316 bcopy (str, p, len); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2317 p += len; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2318 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2319 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2320 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2321 *p = 0; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2322 return val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2323 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2324 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2325 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2326 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
|
2327 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
|
2328 LENGTH must be a number. INIT matters only in whether it is t or nil. */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
2329 (length, init) |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2330 Lisp_Object length, init; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2331 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2332 register Lisp_Object val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2333 struct Lisp_Bool_Vector *p; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2334 int real_init, i; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2335 int length_in_chars, length_in_elts, bits_per_value; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2336 |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2337 CHECK_NATNUM (length); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2338 |
|
55159
e4e9ec547c6f
(Fmake_bool_vector): Use BOOL_VECTOR_BITS_PER_CHAR instead of
Andreas Schwab <schwab@suse.de>
parents:
53705
diff
changeset
|
2339 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
|
2340 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2341 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
|
2342 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
|
2343 / BOOL_VECTOR_BITS_PER_CHAR); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2344 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2345 /* 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
|
2346 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
|
2347 val = Fmake_vector (make_number (length_in_elts + 1), Qnil); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2348 p = XBOOL_VECTOR (val); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2349 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2350 /* Get rid of any bits that would cause confusion. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2351 p->vector_size = 0; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2352 XSETBOOL_VECTOR (val, p); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2353 p->size = XFASTINT (length); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2354 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2355 real_init = (NILP (init) ? 0 : -1); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2356 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
|
2357 p->data[i] = real_init; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2358 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2359 /* 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
|
2360 if (XINT (length) != length_in_chars * BOOL_VECTOR_BITS_PER_CHAR) |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2361 XBOOL_VECTOR (val)->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
|
2362 &= (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
|
2363 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2364 return val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2365 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2366 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2367 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2368 /* 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
|
2369 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
|
2370 multibyte, depending on the contents. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2371 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2372 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2373 make_string (contents, nbytes) |
|
46459
0a9cbcbdbe45
(xstrdup, make_string, make_unibyte_string)
Ken Raeburn <raeburn@raeburn.org>
parents:
46418
diff
changeset
|
2374 const char *contents; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2375 int nbytes; |
|
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 register Lisp_Object val; |
|
28997
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
2378 int nchars, multibyte_nbytes; |
|
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
2379 |
|
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
2380 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
|
2381 if (nbytes == nchars || nbytes != multibyte_nbytes) |
|
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
2382 /* 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
|
2383 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
|
2384 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
|
2385 else |
|
dda5cbf94928
(make_string): Fix previous change. Be sure to make
Kenichi Handa <handa@m17n.org>
parents:
32776
diff
changeset
|
2386 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
|
2387 return val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2388 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2389 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2390 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2391 /* 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
|
2392 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2393 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2394 make_unibyte_string (contents, length) |
|
46459
0a9cbcbdbe45
(xstrdup, make_string, make_unibyte_string)
Ken Raeburn <raeburn@raeburn.org>
parents:
46418
diff
changeset
|
2395 const char *contents; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2396 int length; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2397 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2398 register Lisp_Object val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2399 val = make_uninit_string (length); |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
2400 bcopy (contents, SDATA (val), length); |
|
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
2401 STRING_SET_UNIBYTE (val); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2402 return val; |
|
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 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2405 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2406 /* 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
|
2407 bytes at CONTENTS. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2408 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2409 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2410 make_multibyte_string (contents, nchars, nbytes) |
|
46459
0a9cbcbdbe45
(xstrdup, make_string, make_unibyte_string)
Ken Raeburn <raeburn@raeburn.org>
parents:
46418
diff
changeset
|
2411 const char *contents; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2412 int nchars, nbytes; |
|
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 register Lisp_Object val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2415 val = make_uninit_multibyte_string (nchars, nbytes); |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
2416 bcopy (contents, SDATA (val), nbytes); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2417 return val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2418 } |
|
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 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2421 /* 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
|
2422 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
|
2423 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2424 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2425 make_string_from_bytes (contents, nchars, nbytes) |
|
50274
a617ca0d5d85
(make_string_from_bytes): Add `const' for the arg
Kenichi Handa <handa@m17n.org>
parents:
50200
diff
changeset
|
2426 const char *contents; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2427 int nchars, nbytes; |
|
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 register Lisp_Object val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2430 val = make_uninit_multibyte_string (nchars, nbytes); |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
2431 bcopy (contents, SDATA (val), nbytes); |
|
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
2432 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
|
2433 STRING_SET_UNIBYTE (val); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2434 return val; |
|
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 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2437 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2438 /* 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
|
2439 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
|
2440 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
|
2441 characters by itself. */ |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2442 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2443 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2444 make_specified_string (contents, nchars, nbytes, multibyte) |
|
50274
a617ca0d5d85
(make_string_from_bytes): Add `const' for the arg
Kenichi Handa <handa@m17n.org>
parents:
50200
diff
changeset
|
2445 const char *contents; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2446 int nchars, nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2447 int multibyte; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2448 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2449 register Lisp_Object val; |
|
50200
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2450 |
|
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2451 if (nchars < 0) |
|
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2452 { |
|
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2453 if (multibyte) |
|
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2454 nchars = multibyte_chars_in_text (contents, nbytes); |
|
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2455 else |
|
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2456 nchars = nbytes; |
|
fdeb795fc0ec
(make_specified_string): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
49911
diff
changeset
|
2457 } |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2458 val = make_uninit_multibyte_string (nchars, nbytes); |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
2459 bcopy (contents, SDATA (val), nbytes); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2460 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
|
2461 STRING_SET_UNIBYTE (val); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2462 return val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2463 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2464 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2465 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2466 /* 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
|
2467 data warrants. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2468 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2469 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2470 build_string (str) |
|
46459
0a9cbcbdbe45
(xstrdup, make_string, make_unibyte_string)
Ken Raeburn <raeburn@raeburn.org>
parents:
46418
diff
changeset
|
2471 const char *str; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2472 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2473 return make_string (str, strlen (str)); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2474 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2475 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2476 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2477 /* 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
|
2478 occupying LENGTH bytes. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2479 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2480 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2481 make_uninit_string (length) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2482 int length; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2483 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2484 Lisp_Object val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2485 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
|
2486 STRING_SET_UNIBYTE (val); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2487 return val; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2488 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2489 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2490 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2491 /* 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
|
2492 which occupy NBYTES bytes. */ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2493 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2494 Lisp_Object |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2495 make_uninit_multibyte_string (nchars, nbytes) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2496 int nchars, nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2497 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2498 Lisp_Object string; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2499 struct Lisp_String *s; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2500 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2501 if (nchars < 0) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2502 abort (); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2503 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2504 s = allocate_string (); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2505 allocate_string_data (s, nchars, nbytes); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2506 XSETSTRING (string, s); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2507 string_chars_consed += nbytes; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2508 return string; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2509 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2510 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2511 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2512 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2513 /*********************************************************************** |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2514 Float Allocation |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2515 ***********************************************************************/ |
|
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
2516 |
| 300 | 2517 /* 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
|
2518 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
|
2519 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
|
2520 any new float cells from the latest float_block. */ |
| 300 | 2521 |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
2522 #define FLOAT_BLOCK_SIZE \ |
|
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
2523 (((BLOCK_BYTES - sizeof (struct float_block *) \ |
|
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
2524 /* 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
|
2525 - (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
|
2526 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1)) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2527 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2528 #define GETMARKBIT(block,n) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2529 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2530 >> ((n) % (sizeof(int) * CHAR_BIT))) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2531 & 1) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2532 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2533 #define SETMARKBIT(block,n) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2534 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2535 |= 1 << ((n) % (sizeof(int) * CHAR_BIT)) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2536 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2537 #define UNSETMARKBIT(block,n) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2538 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2539 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT))) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2540 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2541 #define FLOAT_BLOCK(fptr) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2542 ((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
|
2543 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2544 #define FLOAT_INDEX(fptr) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2545 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float)) |
| 300 | 2546 |
| 2547 struct float_block | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2548 { |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2549 /* 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
|
2550 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
|
2551 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
|
2552 struct float_block *next; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2553 }; |
| 300 | 2554 |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2555 #define FLOAT_MARKED_P(fptr) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2556 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2557 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2558 #define FLOAT_MARK(fptr) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2559 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2560 |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2561 #define FLOAT_UNMARK(fptr) \ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2562 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2563 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2564 /* Current float_block. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2565 |
| 300 | 2566 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
|
2567 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2568 /* 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
|
2569 |
| 300 | 2570 int float_block_index; |
| 2571 | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2572 /* 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
|
2573 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2574 int n_float_blocks; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2575 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2576 /* 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
|
2577 |
| 300 | 2578 struct Lisp_Float *float_free_list; |
| 2579 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2580 |
|
39297
aff361cfdccb
Fix a typo in a comment. From Pavel Janik.
Eli Zaretskii <eliz@gnu.org>
parents:
39228
diff
changeset
|
2581 /* Initialize float allocation. */ |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2582 |
| 300 | 2583 void |
| 2584 init_float () | |
| 2585 { | |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2586 float_block = NULL; |
|
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2587 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */ |
| 300 | 2588 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
|
2589 n_float_blocks = 0; |
| 300 | 2590 } |
| 2591 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2592 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2593 /* Explicitly free a float cell by putting it on the free-list. */ |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2594 |
| 21514 | 2595 void |
| 300 | 2596 free_float (ptr) |
| 2597 struct Lisp_Float *ptr; | |
| 2598 { | |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2599 ptr->u.chain = float_free_list; |
| 300 | 2600 float_free_list = ptr; |
| 2601 } | |
| 2602 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2603 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2604 /* 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
|
2605 |
| 300 | 2606 Lisp_Object |
| 2607 make_float (float_value) | |
| 2608 double float_value; | |
| 2609 { | |
| 2610 register Lisp_Object val; | |
| 2611 | |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2612 /* eassert (!handling_signal); */ |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2613 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2614 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2615 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2616 #endif |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2617 |
| 300 | 2618 if (float_free_list) |
| 2619 { | |
|
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
|
2620 /* 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
|
2621 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
|
2622 XSETFLOAT (val, float_free_list); |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2623 float_free_list = float_free_list->u.chain; |
| 300 | 2624 } |
| 2625 else | |
| 2626 { | |
| 2627 if (float_block_index == FLOAT_BLOCK_SIZE) | |
| 2628 { | |
| 12529 | 2629 register struct float_block *new; |
| 2630 | |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
2631 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
|
2632 MEM_TYPE_FLOAT); |
| 300 | 2633 new->next = float_block; |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2634 bzero ((char *) new->gcmarkbits, sizeof new->gcmarkbits); |
| 300 | 2635 float_block = new; |
| 2636 float_block_index = 0; | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2637 n_float_blocks++; |
| 300 | 2638 } |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2639 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
|
2640 float_block_index++; |
| 300 | 2641 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2642 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2643 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2644 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2645 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2646 |
|
25645
a14111a2a100
Use XCAR, XCDR, XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25544
diff
changeset
|
2647 XFLOAT_DATA (val) = float_value; |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2648 eassert (!FLOAT_MARKED_P (XFLOAT (val))); |
| 300 | 2649 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
|
2650 floats_consed++; |
| 300 | 2651 return val; |
| 2652 } | |
| 2653 | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2654 |
| 300 | 2655 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2656 /*********************************************************************** |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2657 Cons Allocation |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2658 ***********************************************************************/ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2659 |
| 300 | 2660 /* We store cons cells inside of cons_blocks, allocating a new |
| 2661 cons_block with malloc whenever necessary. Cons cells reclaimed by | |
| 2662 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
|
2663 any new cons cells from the latest cons_block. */ |
| 300 | 2664 |
| 2665 #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
|
2666 (((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
|
2667 / (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
|
2668 |
|
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2669 #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
|
2670 ((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
|
2671 |
|
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2672 #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
|
2673 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Cons)) |
| 300 | 2674 |
| 2675 struct cons_block | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2676 { |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2677 /* 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
|
2678 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
|
2679 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
|
2680 struct cons_block *next; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2681 }; |
| 300 | 2682 |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2683 #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
|
2684 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
|
2685 |
|
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2686 #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
|
2687 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
|
2688 |
|
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2689 #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
|
2690 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
|
2691 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2692 /* Current cons_block. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2693 |
| 300 | 2694 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
|
2695 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2696 /* 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
|
2697 |
| 300 | 2698 int cons_block_index; |
| 2699 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2700 /* 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
|
2701 |
| 300 | 2702 struct Lisp_Cons *cons_free_list; |
| 2703 | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2704 /* 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
|
2705 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2706 int n_cons_blocks; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2707 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2708 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2709 /* Initialize cons allocation. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2710 |
| 300 | 2711 void |
| 2712 init_cons () | |
| 2713 { | |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2714 cons_block = NULL; |
|
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
2715 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */ |
| 300 | 2716 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
|
2717 n_cons_blocks = 0; |
| 300 | 2718 } |
| 2719 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2720 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2721 /* 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
|
2722 |
|
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
2723 void |
| 300 | 2724 free_cons (ptr) |
| 2725 struct Lisp_Cons *ptr; | |
| 2726 { | |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2727 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
|
2728 #if GC_MARK_STACK |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2729 ptr->car = Vdead; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2730 #endif |
| 300 | 2731 cons_free_list = ptr; |
| 2732 } | |
| 2733 | |
| 2734 DEFUN ("cons", Fcons, Scons, 2, 2, 0, | |
|
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Jan?k <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
2735 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */) |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
2736 (car, cdr) |
| 300 | 2737 Lisp_Object car, cdr; |
| 2738 { | |
| 2739 register Lisp_Object val; | |
| 2740 | |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2741 /* eassert (!handling_signal); */ |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2742 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2743 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2744 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2745 #endif |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2746 |
| 300 | 2747 if (cons_free_list) |
| 2748 { | |
|
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
|
2749 /* 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
|
2750 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
|
2751 XSETCONS (val, cons_free_list); |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2752 cons_free_list = cons_free_list->u.chain; |
| 300 | 2753 } |
| 2754 else | |
| 2755 { | |
| 2756 if (cons_block_index == CONS_BLOCK_SIZE) | |
| 2757 { | |
| 12529 | 2758 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
|
2759 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
|
2760 MEM_TYPE_CONS); |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2761 bzero ((char *) new->gcmarkbits, sizeof new->gcmarkbits); |
| 300 | 2762 new->next = cons_block; |
| 2763 cons_block = new; | |
| 2764 cons_block_index = 0; | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2765 n_cons_blocks++; |
| 300 | 2766 } |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2767 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
|
2768 cons_block_index++; |
| 300 | 2769 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2770 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2771 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2772 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2773 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2774 |
|
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39914
diff
changeset
|
2775 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
|
2776 XSETCDR (val, cdr); |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
2777 eassert (!CONS_MARKED_P (XCONS (val))); |
| 300 | 2778 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
|
2779 cons_cells_consed++; |
| 300 | 2780 return val; |
| 2781 } | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2782 |
|
56539
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2783 /* 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
|
2784 void |
|
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2785 check_cons_list () |
|
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2786 { |
|
58631
7c469d30a12d
Add more checks for buffer overruns.
Kim F. Storm <storm@cua.dk>
parents:
58593
diff
changeset
|
2787 #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
|
2788 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
|
2789 |
|
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2790 while (tail) |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
2791 tail = tail->u.chain; |
|
56539
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2792 #endif |
|
9fc5aae4053e
(check_cons_list): New function (contents commented out).
Richard M. Stallman <rms@gnu.org>
parents:
56401
diff
changeset
|
2793 } |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2794 |
|
71967
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2795 /* 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
|
2796 |
|
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2797 Lisp_Object |
|
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2798 list1 (arg1) |
|
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2799 Lisp_Object arg1; |
|
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2800 { |
|
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2801 return Fcons (arg1, Qnil); |
|
3254b987edcb
(buffer_memory_full, memory_full): Use xsignal. Remove loop.
Kim F. Storm <storm@cua.dk>
parents:
69876
diff
changeset
|
2802 } |
|
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2803 |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2804 Lisp_Object |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2805 list2 (arg1, arg2) |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2806 Lisp_Object arg1, arg2; |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2807 { |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2808 return Fcons (arg1, Fcons (arg2, Qnil)); |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2809 } |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2810 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2811 |
|
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2812 Lisp_Object |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2813 list3 (arg1, arg2, arg3) |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2814 Lisp_Object arg1, arg2, arg3; |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2815 { |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2816 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
|
2817 } |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2818 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2819 |
|
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2820 Lisp_Object |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2821 list4 (arg1, arg2, arg3, arg4) |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2822 Lisp_Object arg1, arg2, arg3, arg4; |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2823 { |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2824 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
|
2825 } |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2826 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2827 |
|
20849
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2828 Lisp_Object |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2829 list5 (arg1, arg2, arg3, arg4, arg5) |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2830 Lisp_Object arg1, arg2, arg3, arg4, arg5; |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2831 { |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2832 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
|
2833 Fcons (arg5, Qnil))))); |
|
3b2f72ed135c
(list2, list3, list4, list5): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
20768
diff
changeset
|
2834 } |
| 300 | 2835 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2836 |
| 300 | 2837 DEFUN ("list", Flist, Slist, 0, MANY, 0, |
| 40977 | 2838 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
|
2839 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
|
2840 usage: (list &rest OBJECTS) */) |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
2841 (nargs, args) |
| 300 | 2842 int nargs; |
| 2843 register Lisp_Object *args; | |
| 2844 { | |
|
13610
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2845 register Lisp_Object val; |
|
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2846 val = Qnil; |
| 300 | 2847 |
|
13610
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2848 while (nargs > 0) |
|
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2849 { |
|
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2850 nargs--; |
|
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2851 val = Fcons (args[nargs], val); |
|
8e82e46aa77b
(Flist): Avoid using -- in while condition.
Richard M. Stallman <rms@gnu.org>
parents:
13553
diff
changeset
|
2852 } |
| 300 | 2853 return val; |
| 2854 } | |
| 2855 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2856 |
| 300 | 2857 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
|
2858 doc: /* Return a newly created list 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
|
2859 (length, init) |
| 300 | 2860 register Lisp_Object length, init; |
| 2861 { | |
| 2862 register Lisp_Object val; | |
| 2863 register int size; | |
| 2864 | |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
2865 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
|
2866 size = XFASTINT (length); |
| 300 | 2867 |
| 2868 val = Qnil; | |
|
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2869 while (size > 0) |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2870 { |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2871 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
|
2872 --size; |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2873 |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2874 if (size > 0) |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2875 { |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2876 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
|
2877 --size; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2878 |
|
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2879 if (size > 0) |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2880 { |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2881 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
|
2882 --size; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2883 |
|
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2884 if (size > 0) |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2885 { |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2886 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
|
2887 --size; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2888 |
|
35762
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2889 if (size > 0) |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2890 { |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2891 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
|
2892 --size; |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2893 } |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2894 } |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2895 } |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2896 } |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2897 |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2898 QUIT; |
|
e197a82c3286
(Fmake_list): Add a QUIT in the loop; unroll the loop.
Gerd Moellmann <gerd@gnu.org>
parents:
35660
diff
changeset
|
2899 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2900 |
| 300 | 2901 return val; |
| 2902 } | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2903 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2904 |
| 300 | 2905 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2906 /*********************************************************************** |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2907 Vector Allocation |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2908 ***********************************************************************/ |
| 300 | 2909 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2910 /* 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
|
2911 |
| 300 | 2912 struct Lisp_Vector *all_vectors; |
| 2913 | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
2914 /* 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
|
2915 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2916 int n_vectors; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
2917 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2918 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2919 /* 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
|
2920 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
|
2921 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2922 static struct Lisp_Vector * |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2923 allocate_vectorlike (len, type) |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2924 EMACS_INT len; |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2925 enum mem_type type; |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2926 { |
|
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2927 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
|
2928 size_t nbytes; |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2929 |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2930 #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
|
2931 /* 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
|
2932 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
|
2933 a dumped Emacs. */ |
|
53555
72ce38380ab3
* alloc.c (allocate_vectorlike): Surround calls to mallopt with
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
53093
diff
changeset
|
2934 BLOCK_INPUT; |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2935 mallopt (M_MMAP_MAX, 0); |
|
53555
72ce38380ab3
* alloc.c (allocate_vectorlike): Surround calls to mallopt with
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
53093
diff
changeset
|
2936 UNBLOCK_INPUT; |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2937 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2938 |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2939 /* 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
|
2940 /* eassert (!handling_signal); */ |
|
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
2941 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2942 nbytes = sizeof *p + (len - 1) * sizeof p->contents[0]; |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2943 p = (struct Lisp_Vector *) lisp_malloc (nbytes, type); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2944 |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2945 #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
|
2946 /* Back to a reasonable maximum of mmap'ed areas. */ |
|
53555
72ce38380ab3
* alloc.c (allocate_vectorlike): Surround calls to mallopt with
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
53093
diff
changeset
|
2947 BLOCK_INPUT; |
|
23973
2eb9e2f5aa33
(MMAP_MAX_AREAS): New macro.
Richard M. Stallman <rms@gnu.org>
parents:
23958
diff
changeset
|
2948 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); |
|
53555
72ce38380ab3
* alloc.c (allocate_vectorlike): Surround calls to mallopt with
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
53093
diff
changeset
|
2949 UNBLOCK_INPUT; |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
2950 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2951 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2952 consing_since_gc += nbytes; |
|
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
2953 vector_cells_consed += len; |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2954 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2955 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2956 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2957 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2958 |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2959 p->next = all_vectors; |
|
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2960 all_vectors = p; |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2961 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2962 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2963 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2964 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
2965 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2966 ++n_vectors; |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2967 return p; |
|
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2968 } |
|
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
2969 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2970 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2971 /* Allocate a vector with NSLOTS slots. */ |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2972 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2973 struct Lisp_Vector * |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2974 allocate_vector (nslots) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2975 EMACS_INT nslots; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2976 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2977 struct Lisp_Vector *v = allocate_vectorlike (nslots, MEM_TYPE_VECTOR); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2978 v->size = nslots; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2979 return v; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2980 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2981 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2982 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2983 /* Allocate other vector-like structures. */ |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2984 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2985 struct Lisp_Hash_Table * |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2986 allocate_hash_table () |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2987 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2988 EMACS_INT len = VECSIZE (struct Lisp_Hash_Table); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2989 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_HASH_TABLE); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2990 EMACS_INT i; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2991 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2992 v->size = len; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2993 for (i = 0; i < len; ++i) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2994 v->contents[i] = Qnil; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
2995 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2996 return (struct Lisp_Hash_Table *) v; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2997 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2998 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
2999 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3000 struct window * |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3001 allocate_window () |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3002 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3003 EMACS_INT len = VECSIZE (struct window); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3004 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_WINDOW); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3005 EMACS_INT i; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3006 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3007 for (i = 0; i < len; ++i) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3008 v->contents[i] = Qnil; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3009 v->size = len; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3010 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3011 return (struct window *) v; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3012 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3013 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3014 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3015 struct frame * |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3016 allocate_frame () |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3017 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3018 EMACS_INT len = VECSIZE (struct frame); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3019 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_FRAME); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3020 EMACS_INT i; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3021 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3022 for (i = 0; i < len; ++i) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3023 v->contents[i] = make_number (0); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3024 v->size = len; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3025 return (struct frame *) v; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3026 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3027 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3028 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3029 struct Lisp_Process * |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3030 allocate_process () |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3031 { |
|
69873
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3032 /* Memory-footprint of the object in nb of Lisp_Object fields. */ |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3033 EMACS_INT memlen = VECSIZE (struct Lisp_Process); |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3034 /* Size if we only count the actual Lisp_Object fields (which need to be |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3035 traced by the GC). */ |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3036 EMACS_INT lisplen = PSEUDOVECSIZE (struct Lisp_Process, pid); |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3037 struct Lisp_Vector *v = allocate_vectorlike (memlen, MEM_TYPE_PROCESS); |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3038 EMACS_INT i; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3039 |
|
69873
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3040 for (i = 0; i < lisplen; ++i) |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3041 v->contents[i] = Qnil; |
|
69873
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
3042 v->size = lisplen; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3043 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3044 return (struct Lisp_Process *) v; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3045 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3046 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3047 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3048 struct Lisp_Vector * |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3049 allocate_other_vector (len) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3050 EMACS_INT len; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3051 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3052 struct Lisp_Vector *v = allocate_vectorlike (len, MEM_TYPE_VECTOR); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3053 EMACS_INT i; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3054 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3055 for (i = 0; i < len; ++i) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3056 v->contents[i] = Qnil; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3057 v->size = len; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3058 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3059 return v; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3060 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3061 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3062 |
| 300 | 3063 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
|
3064 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
|
3065 See also the function `vector'. */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
3066 (length, init) |
| 300 | 3067 register Lisp_Object length, init; |
| 3068 { | |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
3069 Lisp_Object vector; |
|
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
3070 register EMACS_INT sizei; |
|
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
3071 register int index; |
| 300 | 3072 register struct Lisp_Vector *p; |
| 3073 | |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
3074 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
|
3075 sizei = XFASTINT (length); |
| 300 | 3076 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3077 p = allocate_vector (sizei); |
| 300 | 3078 for (index = 0; index < sizei; index++) |
| 3079 p->contents[index] = init; | |
| 3080 | |
|
9968
943a61c764a5
(Fmake_vector): Call allocate_vectorlike.
Karl Heuer <kwzh@gnu.org>
parents:
9953
diff
changeset
|
3081 XSETVECTOR (vector, p); |
| 300 | 3082 return vector; |
| 3083 } | |
| 3084 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3085 |
|
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
3086 DEFUN ("make-char-table", Fmake_char_table, Smake_char_table, 1, 2, 0, |
|
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Jan?k <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
3087 doc: /* Return a newly created char-table, with purpose PURPOSE. |
|
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
3088 Each element is initialized to INIT, which defaults to nil. |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
3089 PURPOSE should be a symbol which has a `char-table-extra-slots' property. |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
3090 The property's value should be an integer between 0 and 10. */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
3091 (purpose, init) |
|
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
3092 register Lisp_Object purpose, init; |
|
13141
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3093 { |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3094 Lisp_Object vector; |
|
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
3095 Lisp_Object n; |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
3096 CHECK_SYMBOL (purpose); |
|
17328
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3097 n = Fget (purpose, Qchar_table_extra_slots); |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
3098 CHECK_NUMBER (n); |
|
13141
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3099 if (XINT (n) < 0 || XINT (n) > 10) |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3100 args_out_of_range (n, Qnil); |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3101 /* Add 2 to the size for the defalt and parent slots. */ |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3102 vector = Fmake_vector (make_number (CHAR_TABLE_STANDARD_SLOTS + XINT (n)), |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3103 init); |
|
17328
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3104 XCHAR_TABLE (vector)->top = Qt; |
|
13150
3778c95adca9
(Fmake_char_table): Initialize parent to nil.
Erik Naggum <erik@naggum.no>
parents:
13141
diff
changeset
|
3105 XCHAR_TABLE (vector)->parent = Qnil; |
|
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
3106 XCHAR_TABLE (vector)->purpose = purpose; |
|
13141
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3107 XSETCHAR_TABLE (vector, XCHAR_TABLE (vector)); |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3108 return vector; |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3109 } |
|
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
3110 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3111 |
|
61685
832617c86aa7
(make_sub_char_table): Argument changed to initial
Kenichi Handa <handa@m17n.org>
parents:
61252
diff
changeset
|
3112 /* Return a newly created sub char table with slots initialized by INIT. |
|
17328
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3113 Since a sub char table does not appear as a top level Emacs Lisp |
|
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3114 object, we don't need a Lisp interface to make it. */ |
|
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3115 |
|
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3116 Lisp_Object |
|
61685
832617c86aa7
(make_sub_char_table): Argument changed to initial
Kenichi Handa <handa@m17n.org>
parents:
61252
diff
changeset
|
3117 make_sub_char_table (init) |
|
832617c86aa7
(make_sub_char_table): Argument changed to initial
Kenichi Handa <handa@m17n.org>
parents:
61252
diff
changeset
|
3118 Lisp_Object init; |
|
17328
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3119 { |
|
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3120 Lisp_Object vector |
|
61685
832617c86aa7
(make_sub_char_table): Argument changed to initial
Kenichi Handa <handa@m17n.org>
parents:
61252
diff
changeset
|
3121 = Fmake_vector (make_number (SUB_CHAR_TABLE_STANDARD_SLOTS), init); |
|
17328
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3122 XCHAR_TABLE (vector)->top = Qnil; |
|
61685
832617c86aa7
(make_sub_char_table): Argument changed to initial
Kenichi Handa <handa@m17n.org>
parents:
61252
diff
changeset
|
3123 XCHAR_TABLE (vector)->defalt = Qnil; |
|
17328
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3124 XSETCHAR_TABLE (vector, XCHAR_TABLE (vector)); |
|
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3125 return vector; |
|
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3126 } |
|
e2a6f31ee014
(Fmake_char_table): Adjusted for the new structure of
Kenichi Handa <handa@m17n.org>
parents:
17217
diff
changeset
|
3127 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3128 |
| 300 | 3129 DEFUN ("vector", Fvector, Svector, 0, MANY, 0, |
| 40977 | 3130 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
|
3131 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
|
3132 usage: (vector &rest OBJECTS) */) |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
3133 (nargs, args) |
| 300 | 3134 register int nargs; |
| 3135 Lisp_Object *args; | |
| 3136 { | |
| 3137 register Lisp_Object len, val; | |
| 3138 register int index; | |
| 3139 register struct Lisp_Vector *p; | |
| 3140 | |
|
9295
17d393a8eed6
(free_float, make_float, free_cons, Flist, Fvector, Fmake_byte_code,
Karl Heuer <kwzh@gnu.org>
parents:
9261
diff
changeset
|
3141 XSETFASTINT (len, nargs); |
| 300 | 3142 val = Fmake_vector (len, Qnil); |
| 3143 p = XVECTOR (val); | |
| 3144 for (index = 0; index < nargs; index++) | |
| 3145 p->contents[index] = args[index]; | |
| 3146 return val; | |
| 3147 } | |
| 3148 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3149 |
| 300 | 3150 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
|
3151 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
|
3152 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
|
3153 stack size, (optional) doc string, and (optional) interactive spec. |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
3154 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
|
3155 significance. |
|
50626
a5a77c7717cb
(Fmake_byte_code): Improve the `usage' string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50468
diff
changeset
|
3156 usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */) |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
3157 (nargs, args) |
| 300 | 3158 register int nargs; |
| 3159 Lisp_Object *args; | |
| 3160 { | |
| 3161 register Lisp_Object len, val; | |
| 3162 register int index; | |
| 3163 register struct Lisp_Vector *p; | |
| 3164 | |
|
9295
17d393a8eed6
(free_float, make_float, free_cons, Flist, Fvector, Fmake_byte_code,
Karl Heuer <kwzh@gnu.org>
parents:
9261
diff
changeset
|
3165 XSETFASTINT (len, nargs); |
| 485 | 3166 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
|
3167 val = make_pure_vector ((EMACS_INT) nargs); |
| 300 | 3168 else |
| 3169 val = Fmake_vector (len, Qnil); | |
|
28997
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
3170 |
|
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
3171 if (STRINGP (args[1]) && STRING_MULTIBYTE (args[1])) |
|
fc8d42f77d4f
(Fmake_byte_code): If BYTECODE-STRING is multibyte,
Kenichi Handa <handa@m17n.org>
parents:
28469
diff
changeset
|
3172 /* 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
|
3173 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
|
3174 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
|
3175 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
|
3176 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
|
3177 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
|
3178 |
| 300 | 3179 p = XVECTOR (val); |
| 3180 for (index = 0; index < nargs; index++) | |
| 3181 { | |
| 485 | 3182 if (!NILP (Vpurify_flag)) |
| 300 | 3183 args[index] = Fpurecopy (args[index]); |
| 3184 p->contents[index] = args[index]; | |
| 3185 } | |
|
18104
b2a669ef69b1
(Fmake_byte_code): Set val from p, not from val.
Richard M. Stallman <rms@gnu.org>
parents:
18010
diff
changeset
|
3186 XSETCOMPILED (val, p); |
| 300 | 3187 return val; |
| 3188 } | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3189 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3190 |
| 300 | 3191 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3192 /*********************************************************************** |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3193 Symbol Allocation |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3194 ***********************************************************************/ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3195 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3196 /* 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
|
3197 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
|
3198 own overhead. */ |
| 300 | 3199 |
| 3200 #define SYMBOL_BLOCK_SIZE \ | |
| 3201 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol)) | |
| 3202 | |
| 3203 struct symbol_block | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3204 { |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3205 /* Place `symbols' first, to preserve alignment. */ |
|
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3206 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
|
3207 struct symbol_block *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3208 }; |
| 300 | 3209 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3210 /* 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
|
3211 structure in it. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3212 |
| 300 | 3213 struct symbol_block *symbol_block; |
| 3214 int symbol_block_index; | |
| 3215 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3216 /* List of free symbols. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3217 |
| 300 | 3218 struct Lisp_Symbol *symbol_free_list; |
| 3219 | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3220 /* 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
|
3221 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3222 int n_symbol_blocks; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3223 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3224 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3225 /* Initialize symbol allocation. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3226 |
| 300 | 3227 void |
| 3228 init_symbol () | |
| 3229 { | |
|
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3230 symbol_block = NULL; |
|
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3231 symbol_block_index = SYMBOL_BLOCK_SIZE; |
| 300 | 3232 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
|
3233 n_symbol_blocks = 0; |
| 300 | 3234 } |
| 3235 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3236 |
| 300 | 3237 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
|
3238 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
|
3239 Its value and function definition are void, and its property list is nil. */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
3240 (name) |
|
14093
338f645e6b9a
(Fmake_symbol): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
3241 Lisp_Object name; |
| 300 | 3242 { |
| 3243 register Lisp_Object val; | |
| 3244 register struct Lisp_Symbol *p; | |
| 3245 | |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
40113
diff
changeset
|
3246 CHECK_STRING (name); |
| 300 | 3247 |
|
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
|
3248 /* eassert (!handling_signal); */ |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
3249 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3250 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3251 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3252 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3253 |
| 300 | 3254 if (symbol_free_list) |
| 3255 { | |
|
9261
e5ba7993d378
(VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents:
9144
diff
changeset
|
3256 XSETSYMBOL (val, symbol_free_list); |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
3257 symbol_free_list = symbol_free_list->next; |
| 300 | 3258 } |
| 3259 else | |
| 3260 { | |
| 3261 if (symbol_block_index == SYMBOL_BLOCK_SIZE) | |
| 3262 { | |
| 12529 | 3263 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
|
3264 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
|
3265 MEM_TYPE_SYMBOL); |
| 300 | 3266 new->next = symbol_block; |
| 3267 symbol_block = new; | |
| 3268 symbol_block_index = 0; | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3269 n_symbol_blocks++; |
| 300 | 3270 } |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
3271 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
|
3272 symbol_block_index++; |
| 300 | 3273 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3274 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3275 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3276 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3277 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3278 |
| 300 | 3279 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
|
3280 p->xname = name; |
| 300 | 3281 p->plist = Qnil; |
| 3282 p->value = Qunbound; | |
| 3283 p->function = Qunbound; | |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
3284 p->next = NULL; |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
3285 p->gcmarkbit = 0; |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
3286 p->interned = SYMBOL_UNINTERNED; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
3287 p->constant = 0; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
3288 p->indirect_variable = 0; |
| 300 | 3289 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
|
3290 symbols_consed++; |
| 300 | 3291 return val; |
| 3292 } | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3293 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3294 |
| 300 | 3295 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3296 /*********************************************************************** |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3297 Marker (Misc) Allocation |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3298 ***********************************************************************/ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3299 |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3300 /* Allocation of markers and other objects that share that structure. |
| 300 | 3301 Works like allocation of conses. */ |
| 3302 | |
| 3303 #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
|
3304 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc)) |
| 300 | 3305 |
| 3306 struct marker_block | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3307 { |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3308 /* Place `markers' first, to preserve alignment. */ |
|
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3309 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
|
3310 struct marker_block *next; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3311 }; |
| 300 | 3312 |
| 3313 struct marker_block *marker_block; | |
| 3314 int marker_block_index; | |
| 3315 | |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3316 union Lisp_Misc *marker_free_list; |
| 300 | 3317 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3318 /* 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
|
3319 |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3320 int n_marker_blocks; |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3321 |
| 300 | 3322 void |
| 3323 init_marker () | |
| 3324 { | |
|
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3325 marker_block = NULL; |
|
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
3326 marker_block_index = MARKER_BLOCK_SIZE; |
| 300 | 3327 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
|
3328 n_marker_blocks = 0; |
| 300 | 3329 } |
| 3330 | |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3331 /* 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
|
3332 |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3333 Lisp_Object |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3334 allocate_misc () |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3335 { |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3336 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
|
3337 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3338 /* eassert (!handling_signal); */ |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3339 |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3340 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3341 BLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3342 #endif |
|
68350
263a4edafafa
(lisp_align_free): Add an assertion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
67494
diff
changeset
|
3343 |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3344 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
|
3345 { |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3346 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
|
3347 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
|
3348 } |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3349 else |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3350 { |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3351 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
|
3352 { |
| 12529 | 3353 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
|
3354 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
|
3355 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
|
3356 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
|
3357 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
|
3358 marker_block_index = 0; |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
3359 n_marker_blocks++; |
|
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3360 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
|
3361 } |
|
53093
e8f5463f3d5b
(make_float, Fcons): Clear the markbit at init time.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52837
diff
changeset
|
3362 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
|
3363 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
|
3364 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3365 |
|
68430
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3366 #ifndef SYNC_INPUT |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3367 UNBLOCK_INPUT; |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3368 #endif |
|
47782d80f30b
* alloc.c (make_interval, allocate_string)
Chong Yidong <cyd@stupidchicken.com>
parents:
68398
diff
changeset
|
3369 |
|
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3370 --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
|
3371 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
|
3372 misc_objects_consed++; |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
3373 XMARKER (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
|
3374 return val; |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3375 } |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3376 |
|
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3377 /* Free a Lisp_Misc object */ |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3378 |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3379 void |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3380 free_misc (misc) |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3381 Lisp_Object misc; |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3382 { |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3383 XMISC (misc)->u_marker.type = Lisp_Misc_Free; |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3384 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
|
3385 marker_free_list = XMISC (misc); |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3386 |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3387 total_free_markers++; |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3388 } |
|
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3389 |
|
49055
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3390 /* 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
|
3391 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
|
3392 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
|
3393 |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3394 Lisp_Object |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3395 make_save_value (pointer, integer) |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3396 void *pointer; |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3397 int integer; |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3398 { |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3399 register Lisp_Object val; |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3400 register struct Lisp_Save_Value *p; |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3401 |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3402 val = allocate_misc (); |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3403 XMISCTYPE (val) = Lisp_Misc_Save_Value; |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3404 p = XSAVE_VALUE (val); |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3405 p->pointer = pointer; |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3406 p->integer = integer; |
|
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
3407 p->dogc = 0; |
|
49055
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3408 return val; |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3409 } |
|
cea2e52c7ca5
(make_save_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
48907
diff
changeset
|
3410 |
| 300 | 3411 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
|
3412 doc: /* Return a newly allocated marker which does not point at any place. */) |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
3413 () |
| 300 | 3414 { |
| 3415 register Lisp_Object val; | |
| 3416 register struct Lisp_Marker *p; | |
| 638 | 3417 |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
3418 val = allocate_misc (); |
|
11243
054ecfce1820
(Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents:
11048
diff
changeset
|
3419 XMISCTYPE (val) = Lisp_Misc_Marker; |
| 300 | 3420 p = XMARKER (val); |
| 3421 p->buffer = 0; | |
|
20565
aa9b7c5f0f62
(Fmake_marker): Initialize marker's bytepos and charpos.
Richard M. Stallman <rms@gnu.org>
parents:
20495
diff
changeset
|
3422 p->bytepos = 0; |
|
aa9b7c5f0f62
(Fmake_marker): Initialize marker's bytepos and charpos.
Richard M. Stallman <rms@gnu.org>
parents:
20495
diff
changeset
|
3423 p->charpos = 0; |
|
51668
0f333fd92a1d
(survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51658
diff
changeset
|
3424 p->next = NULL; |
|
13008
f042ef632b22
(Fmake_marker): Initialize insertion_type to 0.
Richard M. Stallman <rms@gnu.org>
parents:
12748
diff
changeset
|
3425 p->insertion_type = 0; |
| 300 | 3426 return val; |
| 3427 } | |
|
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3428 |
|
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3429 /* 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
|
3430 |
|
20375
1dd0bd0749b5
(malloc_warning, display_malloc_warning): Return void.
Andreas Schwab <schwab@suse.de>
parents:
20057
diff
changeset
|
3431 void |
|
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3432 free_marker (marker) |
|
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3433 Lisp_Object marker; |
|
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3434 { |
|
51668
0f333fd92a1d
(survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51658
diff
changeset
|
3435 unchain_marker (XMARKER (marker)); |
|
56239
a446552d2240
(allocate_misc): Update total_free_markers.
Kim F. Storm <storm@cua.dk>
parents:
56202
diff
changeset
|
3436 free_misc (marker); |
|
19332
58f14958f5d5
(free_marker): New function.
Richard M. Stallman <rms@gnu.org>
parents:
18621
diff
changeset
|
3437 } |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3438 |
|
21258
693573ac0944
(make_specified_string): New function.
Richard M. Stallman <rms@gnu.org>
parents:
21244
diff
changeset
|
3439 |
| 300 | 3440 /* 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
|
3441 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
|
3442 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
|
3443 |
|
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3444 Any number of arguments, even zero arguments, are allowed. */ |
| 300 | 3445 |
| 3446 Lisp_Object | |
|
2013
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3447 make_event_array (nargs, args) |
| 300 | 3448 register int nargs; |
| 3449 Lisp_Object *args; | |
| 3450 { | |
| 3451 int i; | |
| 3452 | |
| 3453 for (i = 0; i < nargs; i++) | |
|
2013
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3454 /* 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
|
3455 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
|
3456 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
|
3457 if (!INTEGERP (args[i]) |
|
3536
58d5ee6ec253
(make_event_array): Ignore bits above CHAR_META.
Richard M. Stallman <rms@gnu.org>
parents:
3181
diff
changeset
|
3458 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200) |
| 300 | 3459 return Fvector (nargs, args); |
| 3460 | |
| 3461 /* Since the loop exited, we know that all the things in it are | |
| 3462 characters, so we can make a string. */ | |
| 3463 { | |
|
6492
8372dce85f8a
(make_event_array): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6227
diff
changeset
|
3464 Lisp_Object result; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3465 |
|
18104
b2a669ef69b1
(Fmake_byte_code): Set val from p, not from val.
Richard M. Stallman <rms@gnu.org>
parents:
18010
diff
changeset
|
3466 result = Fmake_string (make_number (nargs), make_number (0)); |
| 300 | 3467 for (i = 0; i < nargs; i++) |
|
2013
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3468 { |
|
46418
b12a32662433
* alloc.c (make_event_array): Use SSET for storing into a string.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
3469 SSET (result, i, XINT (args[i])); |
|
2013
e2a164ac4088
(Fmake_rope, Frope_elt): Fns deleted.
Richard M. Stallman <rms@gnu.org>
parents:
1994
diff
changeset
|
3470 /* 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
|
3471 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
|
3472 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
|
3473 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3474 |
| 300 | 3475 return result; |
| 3476 } | |
| 3477 } | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3478 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
3479 |
| 300 | 3480 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3481 /************************************************************************ |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3482 Memory Full Handling |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3483 ************************************************************************/ |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3484 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3485 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3486 /* Called if malloc returns zero. */ |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3487 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3488 void |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3489 memory_full () |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3490 { |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3491 int i; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3492 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3493 Vmemory_full = Qt; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3494 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3495 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
|
3496 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3497 /* 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
|
3498 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
|
3499 if (spare_memory[i]) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3500 { |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3501 if (i == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3502 free (spare_memory[i]); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3503 else if (i >= 1 && i <= 4) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3504 lisp_align_free (spare_memory[i]); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3505 else |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3506 lisp_free (spare_memory[i]); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3507 spare_memory[i] = 0; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3508 } |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3509 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3510 /* 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
|
3511 we can refill the memory reserve. */ |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3512 #ifndef SYSTEM_MALLOC |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3513 bytes_used_when_full = BYTES_USED; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3514 #endif |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3515 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3516 /* 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
|
3517 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
|
3518 xsignal (Qnil, Vmemory_signal_data); |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3519 } |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3520 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3521 /* 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
|
3522 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
|
3523 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
|
3524 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3525 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
|
3526 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
|
3527 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3528 void |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3529 refill_memory_reserve () |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3530 { |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3531 #ifndef SYSTEM_MALLOC |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3532 if (spare_memory[0] == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3533 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
|
3534 if (spare_memory[1] == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3535 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
|
3536 MEM_TYPE_CONS); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3537 if (spare_memory[2] == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3538 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
|
3539 MEM_TYPE_CONS); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3540 if (spare_memory[3] == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3541 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
|
3542 MEM_TYPE_CONS); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3543 if (spare_memory[4] == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3544 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
|
3545 MEM_TYPE_CONS); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3546 if (spare_memory[5] == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3547 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
|
3548 MEM_TYPE_STRING); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3549 if (spare_memory[6] == 0) |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3550 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
|
3551 MEM_TYPE_STRING); |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3552 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
|
3553 Vmemory_full = Qnil; |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3554 #endif |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3555 } |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3556 |
|
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
3557 /************************************************************************ |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3558 C Stack Marking |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3559 ************************************************************************/ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3560 |
|
32700
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3561 #if GC_MARK_STACK || defined GC_MALLOC_CHECK |
|
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
3562 |
| 42403 | 3563 /* Conservative C stack marking requires a method to identify possibly |
| 3564 live Lisp objects given a pointer value. We do this by keeping | |
| 3565 track of blocks of Lisp data that are allocated in a red-black tree | |
| 3566 (see also the comment of mem_node which is the type of nodes in | |
| 3567 that tree). Function lisp_malloc adds information for an allocated | |
| 3568 block to the red-black tree with calls to mem_insert, and function | |
| 3569 lisp_free removes it with mem_delete. Functions live_string_p etc | |
| 3570 call mem_find to lookup information about a given pointer in the | |
| 3571 tree, and use that to determine if the pointer points to a Lisp | |
| 3572 object or not. */ | |
| 3573 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3574 /* 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
|
3575 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3576 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3577 mem_init () |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3578 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3579 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
|
3580 mem_z.parent = NULL; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3581 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
|
3582 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
|
3583 mem_root = MEM_NIL; |
|
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 |
|
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 /* 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
|
3588 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
|
3589 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3590 static INLINE struct mem_node * |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3591 mem_find (start) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3592 void *start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3593 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3594 struct mem_node *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3595 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3596 if (start < min_heap_address || start > max_heap_address) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3597 return MEM_NIL; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3598 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3599 /* 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
|
3600 mem_z.start = start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3601 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
|
3602 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3603 p = mem_root; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3604 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
|
3605 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
|
3606 return p; |
|
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 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3609 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3610 /* 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
|
3611 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
|
3612 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
|
3613 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3614 static struct mem_node * |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3615 mem_insert (start, end, type) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3616 void *start, *end; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3617 enum mem_type type; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3618 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3619 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
|
3620 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3621 if (start < min_heap_address) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3622 min_heap_address = start; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3623 if (end > max_heap_address) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3624 max_heap_address = end; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
3625 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3626 /* 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
|
3627 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
|
3628 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
|
3629 c = mem_root; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3630 parent = NULL; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3631 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3632 #if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3633 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3634 while (c != MEM_NIL) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3635 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3636 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
|
3637 abort (); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3638 parent = c; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3639 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
|
3640 } |
|
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 #else /* GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3643 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3644 while (c != MEM_NIL) |
|
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 parent = c; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3647 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
|
3648 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3649 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3650 #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
|
3651 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3652 /* Create a new node. */ |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3653 #ifdef GC_MALLOC_CHECK |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3654 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
|
3655 if (x == NULL) |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3656 abort (); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3657 #else |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3658 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
|
3659 #endif |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3660 x->start = start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3661 x->end = end; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3662 x->type = type; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3663 x->parent = parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3664 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
|
3665 x->color = MEM_RED; |
|
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 /* 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
|
3668 if (parent) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3669 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3670 if (start < parent->start) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3671 parent->left = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3672 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3673 parent->right = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3674 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3675 else |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3676 mem_root = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3677 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3678 /* 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
|
3679 mem_insert_fixup (x); |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3680 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3681 return 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 |
|
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 /* 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
|
3686 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
|
3687 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3688 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3689 mem_insert_fixup (x) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3690 struct mem_node *x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3691 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3692 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
|
3693 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3694 /* 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
|
3695 red-black tree property #3. */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3696 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3697 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
|
3698 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3699 /* 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
|
3700 "uncle". */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3701 struct mem_node *y = x->parent->parent->right; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3702 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3703 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
|
3704 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3705 /* 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
|
3706 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
|
3707 with the grandparent. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3708 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
|
3709 y->color = MEM_BLACK; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3710 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
|
3711 x = x->parent->parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3712 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3713 else |
|
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 /* 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
|
3716 red, uncle is black. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3717 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
|
3718 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3719 x = x->parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3720 mem_rotate_left (x); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3721 } |
|
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 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
|
3724 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
|
3725 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
|
3726 } |
|
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 else |
|
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 /* 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
|
3731 struct mem_node *y = x->parent->parent->left; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3732 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3733 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
|
3734 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3735 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
|
3736 y->color = MEM_BLACK; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3737 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
|
3738 x = x->parent->parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3739 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3740 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3741 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3742 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
|
3743 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3744 x = x->parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3745 mem_rotate_right (x); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3746 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3747 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3748 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
|
3749 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
|
3750 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
|
3751 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3752 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3753 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3754 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3755 /* 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
|
3756 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
|
3757 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
|
3758 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3759 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3760 |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3761 /* (x) (y) |
|
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3762 / \ / \ |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3763 a (y) ===> (x) c |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3764 / \ / \ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3765 b c a b */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3766 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3767 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3768 mem_rotate_left (x) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3769 struct mem_node *x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3770 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3771 struct mem_node *y; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3772 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3773 /* 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
|
3774 y = x->right; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3775 x->right = y->left; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3776 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
|
3777 y->left->parent = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3778 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3779 /* 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
|
3780 if (y != MEM_NIL) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3781 y->parent = x->parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3782 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3783 /* 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
|
3784 if (x->parent) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3785 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3786 if (x == x->parent->left) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3787 x->parent->left = y; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3788 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3789 x->parent->right = y; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3790 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3791 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3792 mem_root = y; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3793 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3794 /* 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
|
3795 y->left = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3796 if (x != MEM_NIL) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3797 x->parent = y; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3798 } |
|
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 |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3801 /* (x) (Y) |
|
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3802 / \ / \ |
|
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3803 (y) c ===> a (x) |
|
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3804 / \ / \ |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3805 a b b c */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3806 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3807 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3808 mem_rotate_right (x) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3809 struct mem_node *x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3810 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3811 struct 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
|
3812 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3813 x->left = y->right; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3814 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
|
3815 y->right->parent = x; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3816 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3817 if (y != MEM_NIL) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3818 y->parent = x->parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3819 if (x->parent) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3820 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3821 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
|
3822 x->parent->right = y; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3823 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3824 x->parent->left = y; |
|
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 mem_root = y; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3828 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3829 y->right = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3830 if (x != MEM_NIL) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3831 x->parent = y; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3832 } |
|
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 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3835 /* 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
|
3836 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3837 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3838 mem_delete (z) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3839 struct mem_node *z; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3840 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3841 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
|
3842 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3843 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
|
3844 return; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3845 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3846 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
|
3847 y = z; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3848 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3849 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3850 y = z->right; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3851 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
|
3852 y = y->left; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3853 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3854 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3855 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
|
3856 x = y->left; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3857 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3858 x = y->right; |
|
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 x->parent = y->parent; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3861 if (y->parent) |
|
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 (y == y->parent->left) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3864 y->parent->left = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3865 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3866 y->parent->right = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3867 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3868 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3869 mem_root = x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3870 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3871 if (y != z) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3872 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3873 z->start = y->start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3874 z->end = y->end; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3875 z->type = y->type; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3876 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3877 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3878 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
|
3879 mem_delete_fixup (x); |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3880 |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3881 #ifdef GC_MALLOC_CHECK |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3882 _free_internal (y); |
|
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3883 #else |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3884 xfree (y); |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
3885 #endif |
|
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 |
|
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 /* 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
|
3890 deletion. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3891 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3892 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3893 mem_delete_fixup (x) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3894 struct mem_node *x; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3895 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3896 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
|
3897 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3898 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
|
3899 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3900 struct mem_node *w = x->parent->right; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3901 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3902 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
|
3903 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3904 w->color = MEM_BLACK; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3905 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
|
3906 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
|
3907 w = x->parent->right; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3908 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3909 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3910 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
|
3911 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3912 w->color = MEM_RED; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3913 x = x->parent; |
|
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 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3916 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3917 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
|
3918 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3919 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
|
3920 w->color = MEM_RED; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3921 mem_rotate_right (w); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3922 w = x->parent->right; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3923 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3924 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
|
3925 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
|
3926 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
|
3927 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
|
3928 x = mem_root; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3929 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3930 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3931 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3932 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3933 struct mem_node *w = x->parent->left; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3934 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3935 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
|
3936 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3937 w->color = MEM_BLACK; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3938 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
|
3939 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
|
3940 w = x->parent->left; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3941 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3942 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3943 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
|
3944 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3945 w->color = MEM_RED; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3946 x = x->parent; |
|
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 else |
|
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 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
|
3951 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3952 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
|
3953 w->color = MEM_RED; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3954 mem_rotate_left (w); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3955 w = x->parent->left; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3956 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3957 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3958 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
|
3959 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
|
3960 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
|
3961 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
|
3962 x = mem_root; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3963 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3964 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3965 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
3966 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3967 x->color = MEM_BLACK; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3968 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3969 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3970 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3971 /* 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
|
3972 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
|
3973 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3974 static INLINE int |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3975 live_string_p (m, p) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3976 struct mem_node *m; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3977 void *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3978 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3979 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
|
3980 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3981 struct string_block *b = (struct string_block *) m->start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3982 int offset = (char *) p - (char *) &b->strings[0]; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3983 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3984 /* 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
|
3985 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
|
3986 return (offset >= 0 |
|
184d1fb71cc1
(live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents:
36487
diff
changeset
|
3987 && offset % sizeof b->strings[0] == 0 |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
3988 && 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
|
3989 && ((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
|
3990 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3991 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3992 return 0; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3993 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3994 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3995 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3996 /* 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
|
3997 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
|
3998 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3999 static INLINE int |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4000 live_cons_p (m, p) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4001 struct mem_node *m; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4002 void *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4003 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4004 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
|
4005 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4006 struct cons_block *b = (struct cons_block *) m->start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4007 int offset = (char *) p - (char *) &b->conses[0]; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4008 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4009 /* 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
|
4010 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
|
4011 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
|
4012 return (offset >= 0 |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
4013 && 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
|
4014 && 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
|
4015 && (b != cons_block |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4016 || 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
|
4017 && !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
|
4018 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4019 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4020 return 0; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4021 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4022 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4023 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4024 /* 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
|
4025 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
|
4026 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4027 static INLINE int |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4028 live_symbol_p (m, p) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4029 struct mem_node *m; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4030 void *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4031 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4032 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
|
4033 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4034 struct symbol_block *b = (struct symbol_block *) m->start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4035 int offset = (char *) p - (char *) &b->symbols[0]; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4036 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4037 /* 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
|
4038 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
|
4039 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
|
4040 return (offset >= 0 |
|
184d1fb71cc1
(live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents:
36487
diff
changeset
|
4041 && offset % sizeof b->symbols[0] == 0 |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
4042 && 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
|
4043 && (b != symbol_block |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4044 || 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
|
4045 && !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
|
4046 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4047 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4048 return 0; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4049 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4050 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4051 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4052 /* 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
|
4053 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
|
4054 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4055 static INLINE int |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4056 live_float_p (m, p) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4057 struct mem_node *m; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4058 void *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4059 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4060 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
|
4061 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4062 struct float_block *b = (struct float_block *) m->start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4063 int offset = (char *) p - (char *) &b->floats[0]; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4064 |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
4065 /* 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
|
4066 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
|
4067 return (offset >= 0 |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
4068 && 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
|
4069 && 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
|
4070 && (b != float_block |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
4071 || 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
|
4072 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4073 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4074 return 0; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4075 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4076 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4077 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4078 /* 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
|
4079 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
|
4080 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4081 static INLINE int |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4082 live_misc_p (m, p) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4083 struct mem_node *m; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4084 void *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4085 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4086 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
|
4087 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4088 struct marker_block *b = (struct marker_block *) m->start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4089 int offset = (char *) p - (char *) &b->markers[0]; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4090 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4091 /* 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
|
4092 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
|
4093 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
|
4094 return (offset >= 0 |
|
184d1fb71cc1
(live_string_p, live_cons_p, live_symbol_p)
Gerd Moellmann <gerd@gnu.org>
parents:
36487
diff
changeset
|
4095 && offset % sizeof b->markers[0] == 0 |
|
53582
b4eef5adebbf
(struct interval_block, struct string_block)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53555
diff
changeset
|
4096 && 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
|
4097 && (b != marker_block |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4098 || offset / sizeof b->markers[0] < marker_block_index) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4099 && ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4100 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4101 else |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4102 return 0; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4103 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4104 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4105 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4106 /* 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
|
4107 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
|
4108 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4109 static INLINE int |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4110 live_vector_p (m, p) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4111 struct mem_node *m; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4112 void *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4113 { |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4114 return (p == m->start |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4115 && m->type >= MEM_TYPE_VECTOR |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4116 && m->type <= MEM_TYPE_WINDOW); |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4117 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4118 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4119 |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4120 /* 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
|
4121 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
|
4122 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4123 static INLINE int |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4124 live_buffer_p (m, p) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4125 struct mem_node *m; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4126 void *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4127 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4128 /* 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
|
4129 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
|
4130 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
|
4131 && p == m->start |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4132 && !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
|
4133 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4134 |
|
32700
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
4135 #endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */ |
|
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
4136 |
|
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
4137 #if GC_MARK_STACK |
|
25c6c2562e31
(toplevel): Conditionalize compilation of mem_*
Gerd Moellmann <gerd@gnu.org>
parents:
32699
diff
changeset
|
4138 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4139 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4140 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4141 /* 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
|
4142 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
|
4143 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4144 #define MAX_ZOMBIES 10 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4145 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
|
4146 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4147 /* Number of zombie objects. */ |
|
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 static int nzombies; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4150 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4151 /* Number of garbage collections. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4152 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4153 static int ngcs; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4154 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4155 /* 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
|
4156 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4157 static double avg_zombies; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4158 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4159 /* 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
|
4160 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4161 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
|
4162 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4163 /* 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
|
4164 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4165 static double avg_live; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4166 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4167 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
|
4168 doc: /* Show information about live and zombie objects. */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
4169 () |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4170 { |
| 49357 | 4171 Lisp_Object args[8], zombie_list = Qnil; |
| 4172 int i; | |
| 4173 for (i = 0; i < nzombies; i++) | |
| 4174 zombie_list = Fcons (zombies[i], zombie_list); | |
| 4175 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
|
4176 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
|
4177 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
|
4178 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
|
4179 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
|
4180 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
|
4181 args[6] = make_number (max_zombies); |
| 49357 | 4182 args[7] = zombie_list; |
| 4183 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
|
4184 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4185 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4186 #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
|
4187 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4188 |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4189 /* 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
|
4190 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4191 static INLINE void |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4192 mark_maybe_object (obj) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4193 Lisp_Object obj; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4194 { |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4195 void *po = (void *) XPNTR (obj); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4196 struct mem_node *m = mem_find (po); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4197 |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4198 if (m != MEM_NIL) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4199 { |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4200 int mark_p = 0; |
|
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 switch (XGCTYPE (obj)) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4203 { |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4204 case Lisp_String: |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4205 mark_p = (live_string_p (m, po) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4206 && !STRING_MARKED_P ((struct Lisp_String *) po)); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4207 break; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4208 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4209 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
|
4210 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
|
4211 break; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4212 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4213 case Lisp_Symbol: |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4214 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
|
4215 break; |
|
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 case Lisp_Float: |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
4218 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
|
4219 break; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4220 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4221 case Lisp_Vectorlike: |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4222 /* Note: can't check GC_BUFFERP before we know it's a |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4223 buffer because checking that dereferences the pointer |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4224 PO which might point anywhere. */ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4225 if (live_vector_p (m, po)) |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
4226 mark_p = !GC_SUBRP (obj) && !VECTOR_MARKED_P (XVECTOR (obj)); |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4227 else if (live_buffer_p (m, po)) |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
4228 mark_p = GC_BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj)); |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4229 break; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4230 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4231 case Lisp_Misc: |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4232 mark_p = (live_misc_p (m, po) && !XMARKER (obj)->gcmarkbit); |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4233 break; |
|
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4234 |
|
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4235 case Lisp_Int: |
|
31897
a292cc13911a
(GC_CHECK_STRING_BYTES): Temporarily define, for bug
Gerd Moellmann <gerd@gnu.org>
parents:
31892
diff
changeset
|
4236 case Lisp_Type_Limit: |
|
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4237 break; |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4238 } |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4239 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4240 if (mark_p) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4241 { |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4242 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4243 if (nzombies < MAX_ZOMBIES) |
| 49357 | 4244 zombies[nzombies] = obj; |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4245 ++nzombies; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4246 #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
|
4247 mark_object (obj); |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4248 } |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4249 } |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4250 } |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4251 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4252 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4253 /* 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
|
4254 marked. */ |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4255 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4256 static INLINE void |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4257 mark_maybe_pointer (p) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4258 void *p; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4259 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4260 struct mem_node *m; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4261 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4262 /* Quickly rule out some values which can't point to Lisp data. We |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4263 assume that Lisp data is aligned on even addresses. */ |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4264 if ((EMACS_INT) p & 1) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4265 return; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4266 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4267 m = mem_find (p); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4268 if (m != MEM_NIL) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4269 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4270 Lisp_Object obj = Qnil; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4271 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4272 switch (m->type) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4273 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4274 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
|
4275 /* Nothing to do; not a pointer to Lisp memory. */ |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4276 break; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4277 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4278 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
|
4279 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
|
4280 XSETVECTOR (obj, p); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4281 break; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4282 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4283 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
|
4284 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
|
4285 XSETCONS (obj, p); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4286 break; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4287 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4288 case MEM_TYPE_STRING: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4289 if (live_string_p (m, p) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4290 && !STRING_MARKED_P ((struct Lisp_String *) p)) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4291 XSETSTRING (obj, p); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4292 break; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4293 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4294 case MEM_TYPE_MISC: |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4295 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
|
4296 XSETMISC (obj, p); |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4297 break; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4298 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4299 case MEM_TYPE_SYMBOL: |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
4300 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
|
4301 XSETSYMBOL (obj, p); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4302 break; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4303 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4304 case MEM_TYPE_FLOAT: |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
4305 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
|
4306 XSETFLOAT (obj, p); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4307 break; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4308 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4309 case MEM_TYPE_VECTOR: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4310 case MEM_TYPE_PROCESS: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4311 case MEM_TYPE_HASH_TABLE: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4312 case MEM_TYPE_FRAME: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4313 case MEM_TYPE_WINDOW: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4314 if (live_vector_p (m, p)) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4315 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4316 Lisp_Object tem; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4317 XSETVECTOR (tem, p); |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
4318 if (!GC_SUBRP (tem) && !VECTOR_MARKED_P (XVECTOR (tem))) |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4319 obj = tem; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4320 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4321 break; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4322 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4323 default: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4324 abort (); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4325 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4326 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4327 if (!GC_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
|
4328 mark_object (obj); |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4329 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4330 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4331 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4332 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4333 /* Mark Lisp objects referenced from the address range START..END. */ |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4334 |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4335 static void |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4336 mark_memory (start, end) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4337 void *start, *end; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4338 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4339 Lisp_Object *p; |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4340 void **pp; |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4341 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4342 #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
|
4343 nzombies = 0; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4344 #endif |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4345 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4346 /* 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
|
4347 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
|
4348 if (end < start) |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4349 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4350 void *tem = start; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4351 start = end; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4352 end = tem; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4353 } |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4354 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4355 /* Mark Lisp_Objects. */ |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4356 for (p = (Lisp_Object *) start; (void *) p < end; ++p) |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4357 mark_maybe_object (*p); |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4358 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4359 /* 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
|
4360 situations, the C compiler optimizes Lisp objects away, so that |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4361 only a pointer to them remains. Example: |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4362 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4363 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
|
4364 () |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4365 { |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4366 Lisp_Object obj = build_string ("test"); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4367 struct Lisp_String *s = XSTRING (obj); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4368 Fgarbage_collect (); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4369 fprintf (stderr, "test `%s'\n", s->data); |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4370 return Qnil; |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4371 } |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4372 |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4373 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
|
4374 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
|
4375 pointer `s'. */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4376 |
|
36435
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4377 for (pp = (void **) start; (void *) pp < end; ++pp) |
|
5a989d353a68
(toplevel): Include process.h.
Gerd Moellmann <gerd@gnu.org>
parents:
35762
diff
changeset
|
4378 mark_maybe_pointer (*pp); |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4379 } |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4380 |
| 48316 | 4381 /* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in |
| 4382 the GCC system configuration. In gcc 3.2, the only systems for | |
| 4383 which this is so are i386-sco5 non-ELF, i386-sysv3 (maybe included | |
| 4384 by others?) and ns32k-pc532-min. */ | |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4385 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4386 #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
|
4387 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4388 static int setjmp_tested_p, longjmps_done; |
|
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 #define SETJMP_WILL_LIKELY_WORK "\ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4391 \n\ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4392 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
|
4393 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
|
4394 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
|
4395 \n\ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4396 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
|
4397 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
|
4398 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
|
4399 \n\ |
|
43200
4082674ce69b
(SETJMP_WILL_LIKELY_WORK, SETJMP_WILL_NOT_WORK):
Kim F. Storm <storm@cua.dk>
parents:
43161
diff
changeset
|
4400 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
|
4401 " |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4402 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4403 #define SETJMP_WILL_NOT_WORK "\ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4404 \n\ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4405 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
|
4406 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
|
4407 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
|
4408 solution for your system.\n\ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4409 \n\ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4410 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
|
4411 try to find a way to make it work on your system.\n\ |
| 48316 | 4412 \n\ |
| 4413 Note that you may get false negatives, depending on the compiler.\n\ | |
| 4414 In particular, you need to use -O with GCC for this test.\n\ | |
| 4415 \n\ | |
|
43200
4082674ce69b
(SETJMP_WILL_LIKELY_WORK, SETJMP_WILL_NOT_WORK):
Kim F. Storm <storm@cua.dk>
parents:
43161
diff
changeset
|
4416 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
|
4417 " |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4418 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4419 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4420 /* 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
|
4421 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
|
4422 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
|
4423 conservative stack marking. Only the sources or a disassembly |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4424 can prove that. */ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4425 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4426 static void |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4427 test_setjmp () |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4428 { |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4429 char buf[10]; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4430 register int x; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4431 jmp_buf jbuf; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4432 int result = 0; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4433 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4434 /* Arrange for X to be put in a register. */ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4435 sprintf (buf, "1"); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4436 x = strlen (buf); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4437 x = 2 * x - 1; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4438 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4439 setjmp (jbuf); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4440 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
|
4441 { |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4442 /* 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
|
4443 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4444 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
|
4445 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
|
4446 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
|
4447 isn't sure. |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4448 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4449 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
|
4450 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
|
4451 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4452 if (x == 1) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4453 fprintf (stderr, SETJMP_WILL_LIKELY_WORK); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4454 else |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4455 { |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4456 fprintf (stderr, SETJMP_WILL_NOT_WORK); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4457 exit (1); |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4458 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4459 } |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4460 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4461 ++longjmps_done; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4462 x = 2; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4463 if (longjmps_done == 1) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4464 longjmp (jbuf, 1); |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4465 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4466 |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4467 #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
|
4468 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4469 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4470 #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
|
4471 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4472 /* 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
|
4473 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4474 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4475 check_gcpros () |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4476 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4477 struct gcpro *p; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4478 int i; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4479 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4480 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
|
4481 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
|
4482 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
|
4483 /* 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
|
4484 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
|
4485 abort (); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4486 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4487 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4488 #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
|
4489 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4490 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4491 dump_zombies () |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4492 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4493 int i; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4494 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4495 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
|
4496 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
|
4497 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4498 fprintf (stderr, " %d = ", i); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4499 debug_print (zombies[i]); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4500 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4501 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4502 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4503 #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
|
4504 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4505 |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4506 /* Mark live Lisp objects on the C stack. |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4507 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4508 There are several system-dependent problems to consider when |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4509 porting this to new architectures: |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4510 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4511 Processor Registers |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4512 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4513 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
|
4514 variables or are used to pass parameters. |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4515 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4516 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
|
4517 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
|
4518 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
|
4519 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4520 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
|
4521 implementation assumes that calling setjmp saves registers we need |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4522 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
|
4523 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
|
4524 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
|
4525 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4526 Stack Layout |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4527 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4528 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
|
4529 For example, the stack might look like this |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4530 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4531 +----------------+ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4532 | Lisp_Object | size = 4 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4533 +----------------+ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4534 | something else | size = 2 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4535 +----------------+ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4536 | Lisp_Object | size = 4 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4537 +----------------+ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4538 | ... | |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4539 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4540 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
|
4541 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
|
4542 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
|
4543 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
|
4544 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
|
4545 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
|
4546 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
|
4547 from the stack start. |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4548 |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4549 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
|
4550 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
|
4551 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4552 static void |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4553 mark_stack () |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4554 { |
|
43160
630c8b6deafd
(mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents:
43005
diff
changeset
|
4555 int i; |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4556 jmp_buf j; |
|
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4557 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
|
4558 void *end; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4559 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4560 /* 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
|
4561 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
|
4562 /* 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
|
4563 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
|
4564 assembler doesn't work with relevant proprietary compilers. */ |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4565 #ifdef sparc |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4566 asm ("ta 3"); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4567 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4568 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4569 /* 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
|
4570 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
|
4571 pass parameters. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4572 #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
|
4573 GC_SAVE_REGISTERS_ON_STACK (end); |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4574 #else /* not GC_SAVE_REGISTERS_ON_STACK */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4575 |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4576 #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
|
4577 setjmp will definitely work, test it |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4578 and print a message with the result |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4579 of the test. */ |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4580 if (!setjmp_tested_p) |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4581 { |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4582 setjmp_tested_p = 1; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4583 test_setjmp (); |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4584 } |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4585 #endif /* GC_SETJMP_WORKS */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
4586 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4587 setjmp (j); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4588 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
|
4589 #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
|
4590 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4591 /* 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
|
4592 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
|
4593 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
|
4594 #ifndef GC_LISP_OBJECT_ALIGNMENT |
|
49414
668c96afa702
(mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents:
49357
diff
changeset
|
4595 #ifdef __GNUC__ |
|
668c96afa702
(mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents:
49357
diff
changeset
|
4596 #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
|
4597 #else |
|
43160
630c8b6deafd
(mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents:
43005
diff
changeset
|
4598 #define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object) |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
4599 #endif |
|
49414
668c96afa702
(mark_stack) [!GC_LISP_OBJECT_ALIGNMENT && __GNUC__]:
Dave Love <fx@gnu.org>
parents:
49357
diff
changeset
|
4600 #endif |
|
43161
8a549ab185a2
Fix thinko in last change.
Andreas Schwab <schwab@suse.de>
parents:
43160
diff
changeset
|
4601 for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT) |
|
43160
630c8b6deafd
(mark_stack): Don't assume sizeof (Lisp_Object) is 4.
Andreas Schwab <schwab@suse.de>
parents:
43005
diff
changeset
|
4602 mark_memory ((char *) stack_base + i, end); |
|
58593
ff0c144203a1
(mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents:
57137
diff
changeset
|
4603 /* 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
|
4604 ia64. */ |
|
ff0c144203a1
(mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents:
57137
diff
changeset
|
4605 #ifdef GC_MARK_SECONDARY_STACK |
|
ff0c144203a1
(mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents:
57137
diff
changeset
|
4606 GC_MARK_SECONDARY_STACK (); |
|
ff0c144203a1
(mark_stack): Call GC_MARK_SECONDARY_STACK if defined.
Andreas Schwab <schwab@suse.de>
parents:
57137
diff
changeset
|
4607 #endif |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4608 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4609 #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
|
4610 check_gcpros (); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4611 #endif |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4612 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4613 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4614 #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
|
4615 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4616 |
|
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4617 /* Determine whether it is safe to access memory at address P. */ |
| 72167 | 4618 int |
| 4619 valid_pointer_p (p) | |
|
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4620 void *p; |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4621 { |
| 72288 | 4622 #ifdef WINDOWSNT |
| 4623 return w32_valid_pointer_p (p, 16); | |
| 4624 #else | |
|
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4625 int fd; |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4626 |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4627 /* 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
|
4628 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
|
4629 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
|
4630 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
|
4631 |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4632 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
|
4633 { |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4634 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
|
4635 emacs_close (fd); |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4636 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
|
4637 return valid; |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4638 } |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4639 |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4640 return -1; |
| 72288 | 4641 #endif |
|
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4642 } |
|
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4643 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4644 /* 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
|
4645 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
|
4646 Return -1 if we cannot validate OBJ. |
|
67494
28fd92314a04
Comment and whitespace changes.
Richard M. Stallman <rms@gnu.org>
parents:
67216
diff
changeset
|
4647 This function can be quite slow, |
|
28fd92314a04
Comment and whitespace changes.
Richard M. Stallman <rms@gnu.org>
parents:
67216
diff
changeset
|
4648 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
|
4649 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4650 int |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4651 valid_lisp_object_p (obj) |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4652 Lisp_Object obj; |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4653 { |
|
67216
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
4654 void *p; |
|
72156
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4655 #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
|
4656 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
|
4657 #endif |
|
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4658 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4659 if (INTEGERP (obj)) |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4660 return 1; |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4661 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4662 p = (void *) XPNTR (obj); |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4663 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
|
4664 return 1; |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4665 |
|
67216
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
4666 #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
|
4667 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
|
4668 #else |
|
fc58516afccd
Include fcntl.h. Define O_WRONLY if not defined.
Kim F. Storm <storm@cua.dk>
parents:
66889
diff
changeset
|
4669 |
|
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4670 m = mem_find (p); |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4671 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4672 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
|
4673 { |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4674 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
|
4675 if (valid <= 0) |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4676 return valid; |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4677 |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4678 if (SUBRP (obj)) |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4679 return 1; |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4680 |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4681 return 0; |
|
b4ec5a95c687
(valid_pointer_p): New function (from valid_lisp_object_p).
Kim F. Storm <storm@cua.dk>
parents:
72114
diff
changeset
|
4682 } |
|
66777
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4683 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4684 switch (m->type) |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4685 { |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4686 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
|
4687 return 0; |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4688 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4689 case MEM_TYPE_BUFFER: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4690 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
|
4691 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4692 case MEM_TYPE_CONS: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4693 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
|
4694 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4695 case MEM_TYPE_STRING: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4696 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
|
4697 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4698 case MEM_TYPE_MISC: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4699 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
|
4700 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4701 case MEM_TYPE_SYMBOL: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4702 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
|
4703 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4704 case MEM_TYPE_FLOAT: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4705 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
|
4706 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4707 case MEM_TYPE_VECTOR: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4708 case MEM_TYPE_PROCESS: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4709 case MEM_TYPE_HASH_TABLE: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4710 case MEM_TYPE_FRAME: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4711 case MEM_TYPE_WINDOW: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4712 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
|
4713 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4714 default: |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4715 break; |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4716 } |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4717 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4718 return 0; |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4719 #endif |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4720 } |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4721 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4722 |
|
25bf8ea82843
(valid_lisp_object_p): New function to validate that
Kim F. Storm <storm@cua.dk>
parents:
66662
diff
changeset
|
4723 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4724 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4725 /*********************************************************************** |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4726 Pure Storage Management |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4727 ***********************************************************************/ |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4728 |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4729 /* 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
|
4730 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
|
4731 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
|
4732 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4733 static POINTER_TYPE * |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4734 pure_alloc (size, type) |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4735 size_t size; |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4736 int type; |
|
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 POINTER_TYPE *result; |
|
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4739 #ifdef USE_LSB_TAG |
|
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4740 size_t alignment = (1 << GCTYPEBITS); |
|
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4741 #else |
|
49159
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4742 size_t alignment = sizeof (EMACS_INT); |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4743 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4744 /* Give Lisp_Floats an extra alignment. */ |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4745 if (type == Lisp_Float) |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4746 { |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4747 #if defined __GNUC__ && __GNUC__ >= 2 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4748 alignment = __alignof (struct Lisp_Float); |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4749 #else |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4750 alignment = sizeof (struct Lisp_Float); |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4751 #endif |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4752 } |
|
53650
5558449888ec
(lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53582
diff
changeset
|
4753 #endif |
|
49159
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4754 |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4755 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
|
4756 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
|
4757 { |
|
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
|
4758 /* 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
|
4759 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
|
4760 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
|
4761 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
|
4762 } |
|
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
|
4763 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
|
4764 { |
|
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
|
4765 /* 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
|
4766 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
|
4767 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
|
4768 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
|
4769 } |
|
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
|
4770 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
|
4771 |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4772 if (pure_bytes_used <= pure_size) |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4773 return result; |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4774 |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4775 /* Don't allocate a large amount here, |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4776 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
|
4777 might not be usable. */ |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4778 purebeg = (char *) xmalloc (10000); |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4779 pure_size = 10000; |
|
bc82a79251b5
(pure_alloc): Rewritten and simplified.
Kim F. Storm <storm@cua.dk>
parents:
49158
diff
changeset
|
4780 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
|
4781 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
|
4782 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
|
4783 goto again; |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4784 } |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4785 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4786 |
|
44149
a3e6cfa20afd
(check_pure_size): Update the comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
44100
diff
changeset
|
4787 /* 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
|
4788 |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4789 void |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4790 check_pure_size () |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4791 { |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4792 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
|
4793 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
|
4794 (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
|
4795 } |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4796 |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
4797 |
|
72114
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4798 /* 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
|
4799 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
|
4800 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
|
4801 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4802 static char * |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4803 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
|
4804 char *data; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4805 int nbytes; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4806 { |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4807 int i, skip, bm_skip[256], last_char_skip, infinity, start, start_max; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4808 unsigned char *p; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4809 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
|
4810 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4811 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
|
4812 return NULL; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4813 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4814 /* 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
|
4815 skip = nbytes + 1; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4816 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
|
4817 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
|
4818 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4819 p = (unsigned char *) data; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4820 while (--skip > 0) |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4821 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
|
4822 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4823 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
|
4824 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4825 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
|
4826 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
|
4827 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4828 /* 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
|
4829 use of `infinity'. */ |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4830 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
|
4831 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
|
4832 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4833 p = (unsigned char *) non_lisp_beg + nbytes; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4834 start = 0; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4835 do |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4836 { |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4837 /* 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
|
4838 do |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4839 { |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4840 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
|
4841 } |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4842 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
|
4843 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4844 if (start < infinity) |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4845 /* 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
|
4846 return NULL; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4847 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4848 /* 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
|
4849 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
|
4850 start -= infinity; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4851 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4852 /* 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
|
4853 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
|
4854 /* Found. */ |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4855 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
|
4856 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4857 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
|
4858 } |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4859 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
|
4860 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4861 return NULL; |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4862 } |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4863 |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4864 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4865 /* 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
|
4866 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
|
4867 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
|
4868 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4869 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
|
4870 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
|
4871 string; then the string is not protected from gc. */ |
| 300 | 4872 |
| 4873 Lisp_Object | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4874 make_pure_string (data, nchars, nbytes, multibyte) |
| 300 | 4875 char *data; |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4876 int nchars, nbytes; |
|
21258
693573ac0944
(make_specified_string): New function.
Richard M. Stallman <rms@gnu.org>
parents:
21244
diff
changeset
|
4877 int multibyte; |
| 300 | 4878 { |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4879 Lisp_Object string; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4880 struct Lisp_String *s; |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4881 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4882 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
|
4883 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
|
4884 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
|
4885 { |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4886 s->data = (unsigned char *) pure_alloc (nbytes + 1, -1); |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4887 bcopy (data, s->data, nbytes); |
|
fe7f8d2385f8
(find_string_data_in_pure): New function.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
72027
diff
changeset
|
4888 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
|
4889 } |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4890 s->size = nchars; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4891 s->size_byte = multibyte ? nbytes : -1; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4892 s->intervals = NULL_INTERVAL; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4893 XSETSTRING (string, s); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4894 return string; |
| 300 | 4895 } |
| 4896 | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4897 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4898 /* 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
|
4899 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
|
4900 |
| 300 | 4901 Lisp_Object |
| 4902 pure_cons (car, cdr) | |
| 4903 Lisp_Object car, cdr; | |
| 4904 { | |
| 4905 register Lisp_Object new; | |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4906 struct Lisp_Cons *p; |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4907 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4908 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
|
4909 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
|
4910 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
|
4911 XSETCDR (new, Fpurecopy (cdr)); |
| 300 | 4912 return new; |
| 4913 } | |
| 4914 | |
| 4915 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4916 /* 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
|
4917 |
| 300 | 4918 Lisp_Object |
| 4919 make_pure_float (num) | |
| 4920 double num; | |
| 4921 { | |
| 4922 register Lisp_Object new; | |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4923 struct Lisp_Float *p; |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4924 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4925 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
|
4926 XSETFLOAT (new, p); |
|
25645
a14111a2a100
Use XCAR, XCDR, XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25544
diff
changeset
|
4927 XFLOAT_DATA (new) = num; |
| 300 | 4928 return new; |
| 4929 } | |
| 4930 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4931 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4932 /* 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
|
4933 pure space. */ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4934 |
| 300 | 4935 Lisp_Object |
| 4936 make_pure_vector (len) | |
|
8817
48ff00bebef6
(pure, pure_size): Use EMACS_INT.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
4937 EMACS_INT len; |
| 300 | 4938 { |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4939 Lisp_Object new; |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4940 struct Lisp_Vector *p; |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4941 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
|
4942 |
|
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4943 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
|
4944 XSETVECTOR (new, p); |
| 300 | 4945 XVECTOR (new)->size = len; |
| 4946 return new; | |
| 4947 } | |
| 4948 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4949 |
| 300 | 4950 DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0, |
|
68741
2892a36e596e
(Fmake_bool_vector, Fpurecopy): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents:
68430
diff
changeset
|
4951 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
|
4952 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
|
4953 Does not copy symbols. Copies strings without text properties. */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
4954 (obj) |
| 300 | 4955 register Lisp_Object obj; |
| 4956 { | |
| 485 | 4957 if (NILP (Vpurify_flag)) |
| 300 | 4958 return obj; |
| 4959 | |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
4960 if (PURE_POINTER_P (XPNTR (obj))) |
| 300 | 4961 return obj; |
| 4962 | |
|
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4963 if (CONSP (obj)) |
|
25645
a14111a2a100
Use XCAR, XCDR, XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25544
diff
changeset
|
4964 return pure_cons (XCAR (obj), XCDR (obj)); |
|
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4965 else if (FLOATP (obj)) |
|
25645
a14111a2a100
Use XCAR, XCDR, XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25544
diff
changeset
|
4966 return make_pure_float (XFLOAT_DATA (obj)); |
|
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4967 else if (STRINGP (obj)) |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
4968 return make_pure_string (SDATA (obj), SCHARS (obj), |
|
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46305
diff
changeset
|
4969 SBYTES (obj), |
|
21258
693573ac0944
(make_specified_string): New function.
Richard M. Stallman <rms@gnu.org>
parents:
21244
diff
changeset
|
4970 STRING_MULTIBYTE (obj)); |
|
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4971 else if (COMPILEDP (obj) || VECTORP (obj)) |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4972 { |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4973 register struct Lisp_Vector *vec; |
|
53705
db8cbe59ee5c
(Fpurecopy): Declare size as EMACS_INT to not lose bits.
Andreas Schwab <schwab@suse.de>
parents:
53650
diff
changeset
|
4974 register int i; |
|
db8cbe59ee5c
(Fpurecopy): Declare size as EMACS_INT to not lose bits.
Andreas Schwab <schwab@suse.de>
parents:
53650
diff
changeset
|
4975 EMACS_INT size; |
| 300 | 4976 |
|
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4977 size = XVECTOR (obj)->size; |
|
10427
5faba1b094d5
(Fpurecopy): Mask size field when copying pseudovector.
Karl Heuer <kwzh@gnu.org>
parents:
10414
diff
changeset
|
4978 if (size & PSEUDOVECTOR_FLAG) |
|
5faba1b094d5
(Fpurecopy): Mask size field when copying pseudovector.
Karl Heuer <kwzh@gnu.org>
parents:
10414
diff
changeset
|
4979 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
|
4980 vec = XVECTOR (make_pure_vector (size)); |
|
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4981 for (i = 0; i < size; i++) |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4982 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]); |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4983 if (COMPILEDP (obj)) |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4984 XSETCOMPILED (obj, vec); |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4985 else |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4986 XSETVECTOR (obj, vec); |
| 300 | 4987 return obj; |
| 4988 } | |
|
10004
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4989 else if (MARKERP (obj)) |
|
2c57cb7eba5f
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9968
diff
changeset
|
4990 error ("Attempt to copy a marker to pure storage"); |
|
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4991 |
|
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31576
diff
changeset
|
4992 return obj; |
| 300 | 4993 } |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
4994 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4995 |
| 300 | 4996 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4997 /*********************************************************************** |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4998 Protection from GC |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
4999 ***********************************************************************/ |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5000 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5001 /* 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
|
5002 VARADDRESS. */ |
| 300 | 5003 |
| 5004 void | |
| 5005 staticpro (varaddress) | |
| 5006 Lisp_Object *varaddress; | |
| 5007 { | |
| 5008 staticvec[staticidx++] = varaddress; | |
| 5009 if (staticidx >= NSTATICS) | |
| 5010 abort (); | |
| 5011 } | |
| 5012 | |
| 5013 struct catchtag | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5014 { |
| 300 | 5015 Lisp_Object tag; |
| 5016 Lisp_Object val; | |
| 5017 struct catchtag *next; | |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5018 }; |
| 300 | 5019 |
| 5020 | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5021 /*********************************************************************** |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5022 Protection from GC |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5023 ***********************************************************************/ |
|
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
5024 |
|
11374
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
5025 /* Temporarily prevent garbage collection. */ |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
5026 |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
5027 int |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
5028 inhibit_garbage_collection () |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
5029 { |
|
46293
1fb8f75062c6
Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
46285
diff
changeset
|
5030 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
|
5031 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
|
5032 |
|
a555c6419185
(inhibit_garbage_collection): Don't exceed value an int can hold.
Andreas Schwab <schwab@suse.de>
parents:
41831
diff
changeset
|
5033 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
|
5034 return count; |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
5035 } |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
5036 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5037 |
| 300 | 5038 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
|
5039 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
|
5040 Garbage collection happens automatically if you cons more than |
|
43d663a05e2d
(Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
51779
diff
changeset
|
5041 `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
|
5042 `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
|
5043 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS) |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
5044 (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
|
5045 (USED-FLOATS . FREE-FLOATS) (USED-INTERVALS . FREE-INTERVALS) |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
5046 (USED-STRINGS . FREE-STRINGS)) |
|
51788
43d663a05e2d
(Fgarbage_collect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
51779
diff
changeset
|
5047 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
|
5048 returns nil, because real GC can't be done. */) |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
5049 () |
| 300 | 5050 { |
| 5051 register struct specbinding *bind; | |
| 5052 struct catchtag *catch; | |
| 5053 struct handler *handler; | |
| 5054 char stack_top_variable; | |
| 5055 register int i; | |
|
25343
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
5056 int message_p; |
|
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5057 Lisp_Object total[8]; |
|
46285
3f111801efb4
Rename BINDING_STACK_SIZE to SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
45392
diff
changeset
|
5058 int count = SPECPDL_INDEX (); |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5059 EMACS_TIME t1, t2, t3; |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5060 |
|
50745
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
5061 if (abort_on_gc) |
|
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
5062 abort (); |
|
fedd03de0f46
(abort_on_gc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
50626
diff
changeset
|
5063 |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5064 /* 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
|
5065 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
|
5066 if (pure_bytes_used_before_overflow) |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5067 return Qnil; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5068 |
|
61252
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
5069 CHECK_CONS_LIST (); |
|
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
5070 |
|
59047
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5071 /* 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
|
5072 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
|
5073 { |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5074 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
|
5075 |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5076 while (nextb) |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5077 { |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5078 /* 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
|
5079 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
|
5080 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
|
5081 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
|
5082 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
|
5083 truncate_undo_list (nextb); |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5084 |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5085 /* Shrink buffer gaps, but skip indirect and dead buffers. */ |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5086 if (nextb->base_buffer == 0 && !NILP (nextb->name)) |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5087 { |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5088 /* 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
|
5089 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
|
5090 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
|
5091 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
|
5092 |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5093 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
|
5094 { |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5095 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
|
5096 current_buffer = nextb; |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5097 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
|
5098 current_buffer = save_current; |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5099 } |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5100 } |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5101 |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5102 nextb = nextb->next; |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5103 } |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5104 } |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5105 |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5106 EMACS_GET_TIME (t1); |
|
0d2678a6add0
(Fgarbage_collect): Update call to truncate_undo_list.
Richard M. Stallman <rms@gnu.org>
parents:
58986
diff
changeset
|
5107 |
|
11892
6be0b7a0ac44
(Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents:
11727
diff
changeset
|
5108 /* 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
|
5109 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
|
5110 consing_since_gc = 0; |
|
6be0b7a0ac44
(Fgarbage_collect): Clear consing_since_gc first thing.
Karl Heuer <kwzh@gnu.org>
parents:
11727
diff
changeset
|
5111 |
|
25343
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
5112 /* 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
|
5113 message_p = push_message (); |
|
47391
1afd007f814f
(Fgarbage_collect): Use pop_message_unwind.
Richard M. Stallman <rms@gnu.org>
parents:
47185
diff
changeset
|
5114 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
|
5115 |
| 300 | 5116 /* Save a copy of the contents of the stack, for debugging. */ |
| 5117 #if MAX_SAVE_STACK > 0 | |
| 485 | 5118 if (NILP (Vpurify_flag)) |
| 300 | 5119 { |
| 5120 i = &stack_top_variable - stack_bottom; | |
| 5121 if (i < 0) i = -i; | |
| 5122 if (i < MAX_SAVE_STACK) | |
| 5123 { | |
| 5124 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
|
5125 stack_copy = (char *) xmalloc (stack_copy_size = i); |
| 300 | 5126 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
|
5127 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i)); |
| 300 | 5128 if (stack_copy) |
| 5129 { | |
|
8817
48ff00bebef6
(pure, pure_size): Use EMACS_INT.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
5130 if ((EMACS_INT) (&stack_top_variable - stack_bottom) > 0) |
| 300 | 5131 bcopy (stack_bottom, stack_copy, i); |
| 5132 else | |
| 5133 bcopy (&stack_top_variable, stack_copy, i); | |
| 5134 } | |
| 5135 } | |
| 5136 } | |
| 5137 #endif /* MAX_SAVE_STACK > 0 */ | |
| 5138 | |
|
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5139 if (garbage_collection_messages) |
|
10395
c121703d35c7
(Fgarbage_collect): Don't log the GC message.
Karl Heuer <kwzh@gnu.org>
parents:
10389
diff
changeset
|
5140 message1_nolog ("Garbage collecting..."); |
| 300 | 5141 |
|
23534
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
5142 BLOCK_INPUT; |
|
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
5143 |
|
22220
a0cd311af6e3
(Fgarbage_collect): Call shrink_regexp_cache.
Richard M. Stallman <rms@gnu.org>
parents:
21948
diff
changeset
|
5144 shrink_regexp_cache (); |
|
a0cd311af6e3
(Fgarbage_collect): Call shrink_regexp_cache.
Richard M. Stallman <rms@gnu.org>
parents:
21948
diff
changeset
|
5145 |
| 300 | 5146 gc_in_progress = 1; |
| 5147 | |
| 16231 | 5148 /* clear_marks (); */ |
| 300 | 5149 |
|
52473
a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
52453
diff
changeset
|
5150 /* Mark all the special slots that serve as the roots of accessibility. */ |
| 300 | 5151 |
| 5152 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
|
5153 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
|
5154 |
|
57098
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5155 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
|
5156 { |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5157 mark_object (bind->symbol); |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5158 mark_object (bind->old_value); |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5159 } |
|
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83420
diff
changeset
|
5160 mark_terminals (); |
|
57098
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5161 mark_kboards (); |
| 83206 | 5162 mark_ttys (); |
|
57098
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5163 |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5164 #ifdef USE_GTK |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5165 { |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5166 extern void xg_mark_data (); |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5167 xg_mark_data (); |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5168 } |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5169 #endif |
|
0487c26b96ee
(Fgarbage_collect): Mark keyboards, gtk data, and specpdl
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
56539
diff
changeset
|
5170 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5171 #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
|
5172 || 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
|
5173 mark_stack (); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5174 #else |
|
51228
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
5175 { |
|
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
5176 register struct gcpro *tail; |
|
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
5177 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
|
5178 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
|
5179 mark_object (tail->var[i]); |
|
51228
42d9bef83464
(Fgarbage_collect): Remove `unused var tail' warning.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51029
diff
changeset
|
5180 } |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5181 #endif |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5182 |
|
26364
7b0217d9259c
(Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
5183 mark_byte_stack (); |
| 300 | 5184 for (catch = catchlist; catch; catch = catch->next) |
| 5185 { | |
|
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
|
5186 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
|
5187 mark_object (catch->val); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5188 } |
| 300 | 5189 for (handler = handlerlist; handler; handler = handler->next) |
| 5190 { | |
|
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
|
5191 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
|
5192 mark_object (handler->var); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5193 } |
|
55798
a1bb695e9a0c
(struct backtrace): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55767
diff
changeset
|
5194 mark_backtrace (); |
| 300 | 5195 |
|
59400
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5196 #ifdef HAVE_WINDOW_SYSTEM |
|
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5197 mark_fringe_data (); |
|
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5198 #endif |
|
eeb8b96d077d
(mark_fringe_data): Declare extern.
Kim F. Storm <storm@cua.dk>
parents:
59359
diff
changeset
|
5199 |
|
55667
57f4a242e8f4
(Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55635
diff
changeset
|
5200 #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
|
5201 mark_stack (); |
|
57f4a242e8f4
(Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55635
diff
changeset
|
5202 #endif |
|
57f4a242e8f4
(Fgarbage_collect): Do all the marking before flushing
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55635
diff
changeset
|
5203 |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5204 /* 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
|
5205 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
|
5206 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
|
5207 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
|
5208 and delete them. */ |
|
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5209 { |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5210 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
|
5211 |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5212 while (nextb) |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5213 { |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5214 /* 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
|
5215 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
|
5216 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
|
5217 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
|
5218 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
|
5219 { |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5220 Lisp_Object tail, prev; |
|
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5221 tail = nextb->undo_list; |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5222 prev = Qnil; |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5223 while (CONSP (tail)) |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5224 { |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5225 if (GC_CONSP (XCAR (tail)) |
|
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5226 && GC_MARKERP (XCAR (XCAR (tail))) |
|
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5227 && !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
|
5228 { |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5229 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
|
5230 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
|
5231 else |
|
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39914
diff
changeset
|
5232 { |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5233 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
|
5234 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
|
5235 } |
|
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5236 } |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5237 else |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5238 { |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5239 prev = tail; |
|
25645
a14111a2a100
Use XCAR, XCDR, XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25544
diff
changeset
|
5240 tail = XCDR (tail); |
|
21306
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5241 } |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5242 } |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5243 } |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5244 /* 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
|
5245 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
|
5246 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
|
5247 |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5248 nextb = nextb->next; |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5249 } |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5250 } |
|
dc2cbd40703c
(mark_buffer): Mark the undo_list slot specially;
Richard M. Stallman <rms@gnu.org>
parents:
21258
diff
changeset
|
5251 |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5252 gc_sweep (); |
|
55767
ee3a30045908
(marker_blocks_pending_free): New var.
Kim F. Storm <storm@cua.dk>
parents:
55745
diff
changeset
|
5253 |
| 300 | 5254 /* Clear the mark bits that we set in certain root slots. */ |
| 5255 | |
|
26378
cbf297593a79
(Fgarbage_collect): Call unmark_byte_stack.
Gerd Moellmann <gerd@gnu.org>
parents:
26372
diff
changeset
|
5256 unmark_byte_stack (); |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5257 VECTOR_UNMARK (&buffer_defaults); |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5258 VECTOR_UNMARK (&buffer_local_symbols); |
| 300 | 5259 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5260 #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
|
5261 dump_zombies (); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5262 #endif |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5263 |
|
23534
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
5264 UNBLOCK_INPUT; |
|
6f9c70db3a58
(Fgarbage_collect): Block input around most of the function.
Richard M. Stallman <rms@gnu.org>
parents:
22382
diff
changeset
|
5265 |
|
61252
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
5266 CHECK_CONS_LIST (); |
|
d24c6e8f9add
(Fgarbage_collect): Call CHECK_CONS_LIST before and after gc.
Kim F. Storm <storm@cua.dk>
parents:
61225
diff
changeset
|
5267 |
| 16231 | 5268 /* clear_marks (); */ |
| 300 | 5269 gc_in_progress = 0; |
| 5270 | |
| 5271 consing_since_gc = 0; | |
| 5272 if (gc_cons_threshold < 10000) | |
| 5273 gc_cons_threshold = 10000; | |
| 5274 | |
|
64267
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
5275 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
|
5276 { /* 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
|
5277 EMACS_INT total = 0; |
|
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5278 |
|
64267
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
5279 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
|
5280 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
|
5281 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
|
5282 total += total_string_size; |
|
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
5283 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
|
5284 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
|
5285 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
|
5286 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
|
5287 |
|
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5288 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
|
5289 } |
|
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5290 else |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
5291 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
|
5292 |
|
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5293 if (garbage_collection_messages) |
|
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5294 { |
|
25343
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
5295 if (message_p || minibuf_level > 0) |
|
fe92158a9e83
(Fgarbage_collect): Use push_message, restore_message,
Gerd Moellmann <gerd@gnu.org>
parents:
25133
diff
changeset
|
5296 restore_message (); |
|
14959
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5297 else |
|
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5298 message1_nolog ("Garbage collecting...done"); |
|
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
5299 } |
| 300 | 5300 |
|
35170
a9b677239421
(Fgarbage_collect): Use a record_unwind_protect to
Gerd Moellmann <gerd@gnu.org>
parents:
34325
diff
changeset
|
5301 unbind_to (count, Qnil); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5302 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5303 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
|
5304 make_number (total_free_conses)); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5305 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
|
5306 make_number (total_free_symbols)); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5307 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
|
5308 make_number (total_free_markers)); |
|
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5309 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
|
5310 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
|
5311 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
|
5312 make_number (total_free_floats)); |
|
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5313 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
|
5314 make_number (total_free_intervals)); |
|
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5315 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
|
5316 make_number (total_free_strings)); |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5317 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5318 #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
|
5319 { |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5320 /* 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
|
5321 double nlive = 0; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5322 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5323 for (i = 0; i < 7; ++i) |
| 49357 | 5324 if (CONSP (total[i])) |
| 5325 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
|
5326 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5327 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
|
5328 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
|
5329 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
|
5330 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
|
5331 ++ngcs; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5332 } |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5333 #endif |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5334 |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5335 if (!NILP (Vpost_gc_hook)) |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5336 { |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5337 int count = inhibit_garbage_collection (); |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5338 safe_run_hooks (Qpost_gc_hook); |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5339 unbind_to (count, Qnil); |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
5340 } |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5341 |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5342 /* Accumulate statistics. */ |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5343 EMACS_GET_TIME (t2); |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5344 EMACS_SUB_TIME (t3, t2, t1); |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5345 if (FLOATP (Vgc_elapsed)) |
|
49911
d9ade23e09df
(Fgarbage_collect): Don't use XSETFLOAT.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49600
diff
changeset
|
5346 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
|
5347 EMACS_SECS (t3) + |
|
d9ade23e09df
(Fgarbage_collect): Don't use XSETFLOAT.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49600
diff
changeset
|
5348 EMACS_USECS (t3) * 1.0e-6); |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5349 gcs_done++; |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
5350 |
|
34270
773e6aa2ec38
(Fgarbage_collect): Dox fix. Return a list as
Gerd Moellmann <gerd@gnu.org>
parents:
33800
diff
changeset
|
5351 return Flist (sizeof total / sizeof *total, total); |
| 300 | 5352 } |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5353 |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5354 |
|
25367
823e14641544
(mark_glyph_matrix): Mark strings only.
Gerd Moellmann <gerd@gnu.org>
parents:
25343
diff
changeset
|
5355 /* 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
|
5356 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
|
5357 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5358 static void |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5359 mark_glyph_matrix (matrix) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5360 struct glyph_matrix *matrix; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5361 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5362 struct glyph_row *row = matrix->rows; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5363 struct glyph_row *end = row + matrix->nrows; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5364 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5365 for (; row < end; ++row) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5366 if (row->enabled_p) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5367 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5368 int area; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5369 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
|
5370 { |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5371 struct glyph *glyph = row->glyphs[area]; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5372 struct glyph *end_glyph = glyph + row->used[area]; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5373 |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5374 for (; glyph < end_glyph; ++glyph) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5375 if (GC_STRINGP (glyph->object) |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5376 && !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
|
5377 mark_object (glyph->object); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5378 } |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5379 } |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5380 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5381 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5382 |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5383 /* 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
|
5384 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5385 static void |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5386 mark_face_cache (c) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5387 struct face_cache *c; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5388 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5389 if (c) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5390 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5391 int i, j; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5392 for (i = 0; i < c->used; ++i) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5393 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5394 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
|
5395 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5396 if (face) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5397 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5398 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
|
5399 mark_object (face->lface[j]); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5400 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5401 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5402 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5403 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5404 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5405 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5406 #ifdef HAVE_WINDOW_SYSTEM |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5407 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5408 /* Mark Lisp objects in image IMG. */ |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5409 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5410 static void |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5411 mark_image (img) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5412 struct image *img; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5413 { |
|
51770
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5414 mark_object (img->spec); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5415 |
|
31892
2f3d88ac2b38
(__malloc_size_t) [DOUG_LEA_MALLOC]: Don't redefine it.
Dave Love <fx@gnu.org>
parents:
31889
diff
changeset
|
5416 if (!NILP (img->data.lisp_val)) |
|
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
|
5417 mark_object (img->data.lisp_val); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5418 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5419 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5420 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5421 /* Mark Lisp objects in image cache of frame F. It's done this way so |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5422 that we don't have to include xterm.h here. */ |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5423 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5424 static void |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5425 mark_image_cache (f) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5426 struct frame *f; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5427 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5428 forall_images_in_image_cache (f, mark_image); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5429 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5430 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5431 #endif /* HAVE_X_WINDOWS */ |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5432 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5433 |
| 300 | 5434 |
|
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
5435 /* 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
|
5436 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
|
5437 all the references contained in it. */ |
| 300 | 5438 |
|
1168
2b07af77d7ec
(mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents:
1114
diff
changeset
|
5439 #define LAST_MARKED_SIZE 500 |
|
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
|
5440 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
|
5441 int last_marked_index; |
|
2b07af77d7ec
(mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents:
1114
diff
changeset
|
5442 |
|
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5443 /* 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
|
5444 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
|
5445 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
|
5446 Normally this is zero and the check never goes off. */ |
|
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5447 int mark_object_loop_halt; |
|
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5448 |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5449 void |
|
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
|
5450 mark_object (arg) |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5451 Lisp_Object arg; |
| 300 | 5452 { |
|
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
|
5453 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
|
5454 #ifdef GC_CHECK_MARKED_OBJECTS |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5455 void *po; |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5456 struct mem_node *m; |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5457 #endif |
|
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5458 int cdr_count = 0; |
| 300 | 5459 |
|
5868
a7bd57a60cb8
(mark_object): Fetch obj from *objptr at loop, not at the gotos.
Karl Heuer <kwzh@gnu.org>
parents:
5353
diff
changeset
|
5460 loop: |
| 300 | 5461 |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
5462 if (PURE_POINTER_P (XPNTR (obj))) |
| 300 | 5463 return; |
| 5464 | |
|
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
|
5465 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
|
5466 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
|
5467 last_marked_index = 0; |
|
2b07af77d7ec
(mark_object): Save last 500 values of objptr.
Richard M. Stallman <rms@gnu.org>
parents:
1114
diff
changeset
|
5468 |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5469 /* 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
|
5470 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
|
5471 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
|
5472 #ifdef GC_CHECK_MARKED_OBJECTS |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5473 |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5474 po = (void *) XPNTR (obj); |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5475 |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5476 /* 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
|
5477 structure allocated from the heap. */ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5478 #define CHECK_ALLOCATED() \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5479 do { \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5480 m = mem_find (po); \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5481 if (m == MEM_NIL) \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5482 abort (); \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5483 } while (0) |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5484 |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5485 /* 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
|
5486 function LIVEP. */ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5487 #define CHECK_LIVE(LIVEP) \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5488 do { \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5489 if (!LIVEP (m, po)) \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5490 abort (); \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5491 } while (0) |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5492 |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5493 /* 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
|
5494 #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
|
5495 do { \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5496 CHECK_ALLOCATED (); \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5497 CHECK_LIVE (LIVEP); \ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5498 } while (0) \ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5499 |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5500 #else /* not GC_CHECK_MARKED_OBJECTS */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5501 |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5502 #define CHECK_ALLOCATED() (void) 0 |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5503 #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
|
5504 #define CHECK_ALLOCATED_AND_LIVE(LIVEP) (void) 0 |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5505 |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5506 #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
|
5507 |
|
10457
2ab3bd0288a9
Change all occurences of SWITCH_ENUM_BUG to use SWITCH_ENUM_CAST instead.
Karl Heuer <kwzh@gnu.org>
parents:
10427
diff
changeset
|
5508 switch (SWITCH_ENUM_CAST (XGCTYPE (obj))) |
| 300 | 5509 { |
| 5510 case Lisp_String: | |
| 5511 { | |
| 5512 register struct Lisp_String *ptr = XSTRING (obj); | |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5513 CHECK_ALLOCATED_AND_LIVE (live_string_p); |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5514 MARK_INTERVAL_TREE (ptr->intervals); |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5515 MARK_STRING (ptr); |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
5516 #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
|
5517 /* 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
|
5518 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
|
5519 CHECK_STRING_BYTES (ptr); |
|
32587
b3918817f15f
(mark_object) [GC_CHECK_STRING_BYTES]: Check validity of
Gerd Moellmann <gerd@gnu.org>
parents:
32360
diff
changeset
|
5520 #endif /* GC_CHECK_STRING_BYTES */ |
| 300 | 5521 } |
| 5522 break; | |
| 5523 | |
|
10009
82f3daf76995
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
10004
diff
changeset
|
5524 case Lisp_Vectorlike: |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5525 #ifdef GC_CHECK_MARKED_OBJECTS |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5526 m = mem_find (po); |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5527 if (m == MEM_NIL && !GC_SUBRP (obj) |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5528 && po != &buffer_defaults |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5529 && po != &buffer_local_symbols) |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5530 abort (); |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5531 #endif /* GC_CHECK_MARKED_OBJECTS */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5532 |
|
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5533 if (GC_BUFFERP (obj)) |
|
10340
ef58c7a5a4d6
(mark_object, mark_buffer): Don't mark buffer twice.
Karl Heuer <kwzh@gnu.org>
parents:
10320
diff
changeset
|
5534 { |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5535 if (!VECTOR_MARKED_P (XBUFFER (obj))) |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5536 { |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5537 #ifdef GC_CHECK_MARKED_OBJECTS |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5538 if (po != &buffer_defaults && po != &buffer_local_symbols) |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5539 { |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5540 struct buffer *b; |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5541 for (b = all_buffers; b && b != po; b = b->next) |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5542 ; |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5543 if (b == NULL) |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5544 abort (); |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5545 } |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5546 #endif /* GC_CHECK_MARKED_OBJECTS */ |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5547 mark_buffer (obj); |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5548 } |
|
10340
ef58c7a5a4d6
(mark_object, mark_buffer): Don't mark buffer twice.
Karl Heuer <kwzh@gnu.org>
parents:
10320
diff
changeset
|
5549 } |
|
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5550 else if (GC_SUBRP (obj)) |
|
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5551 break; |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5552 else if (GC_COMPILEDP (obj)) |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
5553 /* 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
|
5554 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
|
5555 recursion there. */ |
|
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5556 { |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5557 register struct Lisp_Vector *ptr = XVECTOR (obj); |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5558 register EMACS_INT size = ptr->size; |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5559 register int i; |
| 300 | 5560 |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5561 if (VECTOR_MARKED_P (ptr)) |
|
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5562 break; /* Already marked */ |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5563 |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5564 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
|
5565 VECTOR_MARK (ptr); /* Else mark it */ |
|
10009
82f3daf76995
(Fpurecopy): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
10004
diff
changeset
|
5566 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
|
5567 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
|
5568 { |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5569 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
|
5570 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
|
5571 } |
|
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
|
5572 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
|
5573 goto loop; |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5574 } |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5575 else if (GC_FRAMEP (obj)) |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5576 { |
|
32360
d8b668a486d7
(mark_object): Remove all workarounds installed on
Andreas Schwab <schwab@suse.de>
parents:
32099
diff
changeset
|
5577 register struct frame *ptr = XFRAME (obj); |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5578 |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5579 if (VECTOR_MARKED_P (ptr)) break; /* Already marked */ |
|
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5580 VECTOR_MARK (ptr); /* Else mark it */ |
|
1295
a9241dc503ab
(mark_object): Avoid car recursion on cons with nil in cdr.
Richard M. Stallman <rms@gnu.org>
parents:
1168
diff
changeset
|
5581 |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5582 CHECK_LIVE (live_vector_p); |
|
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
|
5583 mark_object (ptr->name); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5584 mark_object (ptr->icon_name); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5585 mark_object (ptr->title); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5586 mark_object (ptr->focus_frame); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5587 mark_object (ptr->selected_window); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5588 mark_object (ptr->minibuffer_window); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5589 mark_object (ptr->param_alist); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5590 mark_object (ptr->scroll_bars); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5591 mark_object (ptr->condemned_scroll_bars); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5592 mark_object (ptr->menu_bar_items); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5593 mark_object (ptr->face_alist); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5594 mark_object (ptr->menu_bar_vector); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5595 mark_object (ptr->buffer_predicate); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5596 mark_object (ptr->buffer_list); |
|
83415
d2c799f58129
Implement full support for frame-local `next-buffer' and `previous-buffer'.
Karoly Lorentey <lorentey@elte.hu>
parents:
83414
diff
changeset
|
5597 mark_object (ptr->buried_buffer_list); |
|
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
|
5598 mark_object (ptr->menu_bar_window); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5599 mark_object (ptr->tool_bar_window); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5600 mark_face_cache (ptr->face_cache); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5601 #ifdef HAVE_WINDOW_SYSTEM |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5602 mark_image_cache (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
|
5603 mark_object (ptr->tool_bar_items); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5604 mark_object (ptr->desired_tool_bar_string); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5605 mark_object (ptr->current_tool_bar_string); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5606 #endif /* HAVE_WINDOW_SYSTEM */ |
|
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5607 } |
|
13141
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
5608 else if (GC_BOOL_VECTOR_P (obj)) |
|
15379
5cd52d4838f8
(mark_object): Do set ARRAY_MARK_FLAG for bool-vectors.
Richard M. Stallman <rms@gnu.org>
parents:
14959
diff
changeset
|
5609 { |
|
5cd52d4838f8
(mark_object): Do set ARRAY_MARK_FLAG for bool-vectors.
Richard M. Stallman <rms@gnu.org>
parents:
14959
diff
changeset
|
5610 register struct Lisp_Vector *ptr = XVECTOR (obj); |
|
5cd52d4838f8
(mark_object): Do set ARRAY_MARK_FLAG for bool-vectors.
Richard M. Stallman <rms@gnu.org>
parents:
14959
diff
changeset
|
5611 |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5612 if (VECTOR_MARKED_P (ptr)) |
|
15379
5cd52d4838f8
(mark_object): Do set ARRAY_MARK_FLAG for bool-vectors.
Richard M. Stallman <rms@gnu.org>
parents:
14959
diff
changeset
|
5613 break; /* Already marked */ |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5614 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
|
5615 VECTOR_MARK (ptr); /* Else mark it */ |
|
15379
5cd52d4838f8
(mark_object): Do set ARRAY_MARK_FLAG for bool-vectors.
Richard M. Stallman <rms@gnu.org>
parents:
14959
diff
changeset
|
5616 } |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5617 else if (GC_WINDOWP (obj)) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5618 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5619 register struct Lisp_Vector *ptr = XVECTOR (obj); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5620 struct window *w = XWINDOW (obj); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5621 register int i; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5622 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5623 /* Stop if already marked. */ |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5624 if (VECTOR_MARKED_P (ptr)) |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5625 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5626 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5627 /* Mark it. */ |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5628 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
|
5629 VECTOR_MARK (ptr); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5630 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5631 /* There is no Lisp data above The member CURRENT_MATRIX in |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5632 struct WINDOW. Stop marking when that slot is reached. */ |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5633 for (i = 0; |
|
32360
d8b668a486d7
(mark_object): Remove all workarounds installed on
Andreas Schwab <schwab@suse.de>
parents:
32099
diff
changeset
|
5634 (char *) &ptr->contents[i] < (char *) &w->current_matrix; |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5635 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
|
5636 mark_object (ptr->contents[i]); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5637 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5638 /* Mark glyphs for leaf windows. Marking window matrices is |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5639 sufficient because frame matrices use the same glyph |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5640 memory. */ |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5641 if (NILP (w->hchild) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5642 && NILP (w->vchild) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5643 && w->current_matrix) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5644 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5645 mark_glyph_matrix (w->current_matrix); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5646 mark_glyph_matrix (w->desired_matrix); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5647 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5648 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5649 else if (GC_HASH_TABLE_P (obj)) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5650 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5651 struct Lisp_Hash_Table *h = XHASH_TABLE (obj); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5652 |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5653 /* Stop if already marked. */ |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5654 if (VECTOR_MARKED_P (h)) |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5655 break; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5656 |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5657 /* Mark it. */ |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5658 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
|
5659 VECTOR_MARK (h); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5660 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5661 /* Mark contents. */ |
| 43005 | 5662 /* Do not mark next_free or next_weak. |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5663 Being in the next_weak chain |
| 43005 | 5664 should not keep the hash table alive. |
| 5665 No need to mark `count' since it is an integer. */ | |
|
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
|
5666 mark_object (h->test); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5667 mark_object (h->weak); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5668 mark_object (h->rehash_size); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5669 mark_object (h->rehash_threshold); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5670 mark_object (h->hash); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5671 mark_object (h->next); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5672 mark_object (h->index); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5673 mark_object (h->user_hash_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
|
5674 mark_object (h->user_cmp_function); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5675 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5676 /* If hash table is not weak, mark all keys and values. |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5677 For weak tables, mark only the vector. */ |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5678 if (GC_NILP (h->weak)) |
|
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
|
5679 mark_object (h->key_and_value); |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5680 else |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5681 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
|
5682 } |
|
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5683 else |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5684 { |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5685 register struct Lisp_Vector *ptr = XVECTOR (obj); |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5686 register EMACS_INT size = ptr->size; |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5687 register int i; |
| 300 | 5688 |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5689 if (VECTOR_MARKED_P (ptr)) break; /* Already marked */ |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5690 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
|
5691 VECTOR_MARK (ptr); /* Else mark it */ |
|
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5692 if (size & PSEUDOVECTOR_FLAG) |
|
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5693 size &= PSEUDOVECTOR_SIZE_MASK; |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5694 |
|
69873
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
5695 /* Note that this size is not the memory-footprint size, but only |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
5696 the number of Lisp_Object fields that we should trace. |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
5697 The distinction is used e.g. by Lisp_Process which places extra |
|
2d844bbbccd4
* process.h (struct Lisp_Process): Replace Lisp_Objects `pid',
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
69355
diff
changeset
|
5698 non-Lisp_Object fields at the end of the structure. */ |
|
10291
96273a6ec492
(mark_object): Don't use Lisp_Process, Lisp_Window.
Richard M. Stallman <rms@gnu.org>
parents:
10206
diff
changeset
|
5699 for (i = 0; i < size; i++) /* and then mark its elements */ |
|
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
|
5700 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
|
5701 } |
| 300 | 5702 break; |
| 5703 | |
| 5704 case Lisp_Symbol: | |
| 5705 { | |
|
32360
d8b668a486d7
(mark_object): Remove all workarounds installed on
Andreas Schwab <schwab@suse.de>
parents:
32099
diff
changeset
|
5706 register struct Lisp_Symbol *ptr = XSYMBOL (obj); |
| 300 | 5707 struct Lisp_Symbol *ptrx; |
| 5708 | |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5709 if (ptr->gcmarkbit) break; |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5710 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
|
5711 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
|
5712 mark_object (ptr->value); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5713 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
|
5714 mark_object (ptr->plist); |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5715 |
|
45392
f3d7ab65641f
* alloc.c (Fmake_symbol): Set symbol xname field instead of name.
Ken Raeburn <raeburn@raeburn.org>
parents:
44890
diff
changeset
|
5716 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
|
5717 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
|
5718 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname)); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5719 |
| 20768 | 5720 /* Note that we do not mark the obarray of the symbol. |
| 5721 It is safe not to do so because nothing accesses that | |
| 5722 slot except to check whether it is nil. */ | |
| 300 | 5723 ptr = ptr->next; |
| 5724 if (ptr) | |
| 5725 { | |
|
2507
7ba4316ae840
* alloc.c (__malloc_hook, __realloc_hook, __free_hook): Declare
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
5726 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */ |
| 300 | 5727 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
|
5728 goto loop; |
| 300 | 5729 } |
| 5730 } | |
| 5731 break; | |
| 5732 | |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5733 case Lisp_Misc: |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5734 CHECK_ALLOCATED_AND_LIVE (live_misc_p); |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5735 if (XMARKER (obj)->gcmarkbit) |
|
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5736 break; |
|
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5737 XMARKER (obj)->gcmarkbit = 1; |
|
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5738 |
|
11243
054ecfce1820
(Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents:
11048
diff
changeset
|
5739 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
|
5740 { |
|
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5741 case Lisp_Misc_Buffer_Local_Value: |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5742 case Lisp_Misc_Some_Buffer_Local_Value: |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5743 { |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5744 register struct Lisp_Buffer_Local_Value *ptr |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5745 = XBUFFER_LOCAL_VALUE (obj); |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5746 /* If the cdr is nil, avoid recursion for the car. */ |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5747 if (EQ (ptr->cdr, Qnil)) |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5748 { |
|
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
|
5749 obj = ptr->realvalue; |
|
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5750 goto loop; |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5751 } |
|
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
|
5752 mark_object (ptr->realvalue); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5753 mark_object (ptr->buffer); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5754 mark_object (ptr->frame); |
|
ad47aa3ee2d7
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51758
diff
changeset
|
5755 obj = ptr->cdr; |
|
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5756 goto loop; |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5757 } |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
5758 |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5759 case Lisp_Misc_Marker: |
|
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5760 /* 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
|
5761 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
|
5762 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
|
5763 break; |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5764 |
|
9463
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5765 case Lisp_Misc_Intfwd: |
|
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5766 case Lisp_Misc_Boolfwd: |
|
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5767 case Lisp_Misc_Objfwd: |
|
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5768 case Lisp_Misc_Buffer_Objfwd: |
|
11018
2d9bdf1ba3d1
(mark_kboards): Renamed from mark_perdisplays.
Karl Heuer <kwzh@gnu.org>
parents:
10936
diff
changeset
|
5769 case Lisp_Misc_Kboard_Objfwd: |
|
9463
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5770 /* Don't bother with Lisp_Buffer_Objfwd, |
|
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5771 since all markable slots in current buffer marked anyway. */ |
|
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5772 /* Don't need to do Lisp_Objfwd, since the places they point |
|
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5773 are protected with staticpro. */ |
|
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5774 break; |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5775 |
|
52166
25f780eb3fd8
(mark_object): Handle Lisp_Misc_Save_Value.
Andreas Schwab <schwab@suse.de>
parents:
51985
diff
changeset
|
5776 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
|
5777 #if GC_MARK_STACK |
|
56202
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5778 { |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5779 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
|
5780 /* 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
|
5781 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
|
5782 if (ptr->dogc) |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5783 { |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5784 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
|
5785 int nelt; |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5786 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
|
5787 mark_maybe_object (*p); |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5788 } |
|
db1817b88294
(safe_alloca_unwind): Clear dogc and pointer members.
Kim F. Storm <storm@cua.dk>
parents:
56187
diff
changeset
|
5789 } |
|
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
|
5790 #endif |
|
9463
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5791 break; |
|
a40af805e036
(mark_object): Use the new substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9437
diff
changeset
|
5792 |
|
9926
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5793 case Lisp_Misc_Overlay: |
|
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5794 { |
|
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5795 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
|
5796 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
|
5797 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
|
5798 mark_object (ptr->plist); |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5799 if (ptr->next) |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5800 { |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5801 XSETMISC (obj, ptr->next); |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5802 goto loop; |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5803 } |
|
9926
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5804 } |
|
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5805 break; |
|
2a9f99682f82
(mark_object, gc_sweep): Use new overlay substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9893
diff
changeset
|
5806 |
|
9437
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5807 default: |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5808 abort (); |
|
c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
Karl Heuer <kwzh@gnu.org>
parents:
9367
diff
changeset
|
5809 } |
| 300 | 5810 break; |
| 5811 | |
| 5812 case Lisp_Cons: | |
| 5813 { | |
| 5814 register struct Lisp_Cons *ptr = XCONS (obj); | |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
5815 if (CONS_MARKED_P (ptr)) break; |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5816 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
|
5817 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
|
5818 /* 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
|
5819 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
|
5820 { |
|
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
|
5821 obj = ptr->car; |
|
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5822 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
|
5823 goto loop; |
|
a9241dc503ab
(mark_object): Avoid car recursion on cons with nil in cdr.
Richard M. Stallman <rms@gnu.org>
parents:
1168
diff
changeset
|
5824 } |
|
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
|
5825 mark_object (ptr->car); |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5826 obj = ptr->u.cdr; |
|
46833
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5827 cdr_count++; |
|
b80760a75295
(mark_object): Detect long lists for debugging.
Richard M. Stallman <rms@gnu.org>
parents:
46459
diff
changeset
|
5828 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
|
5829 abort (); |
| 300 | 5830 goto loop; |
| 5831 } | |
| 5832 | |
| 5833 case Lisp_Float: | |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5834 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
|
5835 FLOAT_MARK (XFLOAT (obj)); |
| 300 | 5836 break; |
| 5837 | |
| 5838 case Lisp_Int: | |
| 5839 break; | |
| 5840 | |
| 5841 default: | |
| 5842 abort (); | |
| 5843 } | |
|
29743
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5844 |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5845 #undef CHECK_LIVE |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5846 #undef CHECK_ALLOCATED |
|
1d802b332e0d
(mark_object) [GC_CHECK_MARKED_OBJECTS]: Check that no
Gerd Moellmann <gerd@gnu.org>
parents:
28997
diff
changeset
|
5847 #undef CHECK_ALLOCATED_AND_LIVE |
| 300 | 5848 } |
| 5849 | |
| 5850 /* Mark the pointers in a buffer structure. */ | |
| 5851 | |
| 5852 static void | |
| 5853 mark_buffer (buf) | |
| 5854 Lisp_Object buf; | |
| 5855 { | |
| 5856 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
|
5857 register Lisp_Object *ptr, tmp; |
|
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5858 Lisp_Object base_buffer; |
| 300 | 5859 |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5860 VECTOR_MARK (buffer); |
| 300 | 5861 |
|
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5862 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
5863 |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5864 /* 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
|
5865 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
|
5866 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
|
5867 |
|
51843
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5868 if (buffer->overlays_before) |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5869 { |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5870 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
|
5871 mark_object (tmp); |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5872 } |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5873 if (buffer->overlays_after) |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5874 { |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5875 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
|
5876 mark_object (tmp); |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5877 } |
|
65772ad7d4e1
(mark_object): Mark the new `next' field of overlays.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51788
diff
changeset
|
5878 |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
5879 for (ptr = &buffer->name; |
| 300 | 5880 (char *)ptr < (char *)buffer + sizeof (struct buffer); |
| 5881 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
|
5882 mark_object (*ptr); |
|
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5883 |
|
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5884 /* 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
|
5885 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
|
5886 { |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5887 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
|
5888 mark_buffer (base_buffer); |
|
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
5889 } |
| 300 | 5890 } |
|
10649
52cdd8cc8d3e
(mark_perdisplays): New function.
Karl Heuer <kwzh@gnu.org>
parents:
10581
diff
changeset
|
5891 |
|
52cdd8cc8d3e
(mark_perdisplays): New function.
Karl Heuer <kwzh@gnu.org>
parents:
10581
diff
changeset
|
5892 |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5893 /* 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
|
5894 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
|
5895 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5896 int |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5897 survives_gc_p (obj) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5898 Lisp_Object obj; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5899 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5900 int survives_p; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5901 |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5902 switch (XGCTYPE (obj)) |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5903 { |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5904 case Lisp_Int: |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5905 survives_p = 1; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5906 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5907 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5908 case Lisp_Symbol: |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
5909 survives_p = XSYMBOL (obj)->gcmarkbit; |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5910 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5911 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5912 case Lisp_Misc: |
|
51668
0f333fd92a1d
(survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51658
diff
changeset
|
5913 survives_p = XMARKER (obj)->gcmarkbit; |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5914 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5915 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5916 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
|
5917 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
|
5918 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5919 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5920 case Lisp_Vectorlike: |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
5921 survives_p = GC_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
|
5922 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5923 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5924 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
|
5925 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
|
5926 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5927 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5928 case Lisp_Float: |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
5929 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
|
5930 break; |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5931 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5932 default: |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5933 abort (); |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5934 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5935 |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5936 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
|
5937 } |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5938 |
|
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
5939 |
| 300 | 5940 |
|
1908
d649f2179d67
* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
Jim Blandy <jimb@redhat.com>
parents:
1893
diff
changeset
|
5941 /* Sweep: find all structures not marked, and free them. */ |
| 300 | 5942 |
| 5943 static void | |
| 5944 gc_sweep () | |
| 5945 { | |
|
55816
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5946 /* 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
|
5947 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
|
5948 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
|
5949 |
|
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5950 sweep_strings (); |
|
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5951 #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
|
5952 if (!noninteractive) |
|
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5953 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
|
5954 #endif |
|
a4fe04f4d9c2
Undo Kim's recent changes and fix the same bug differently.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55798
diff
changeset
|
5955 |
| 300 | 5956 /* Put all unmarked conses on free list */ |
| 5957 { | |
| 5958 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
|
5959 struct cons_block **cprev = &cons_block; |
| 300 | 5960 register int lim = cons_block_index; |
| 5961 register int num_free = 0, num_used = 0; | |
| 5962 | |
| 5963 cons_free_list = 0; | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
5964 |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5965 for (cblk = cons_block; cblk; cblk = *cprev) |
| 300 | 5966 { |
| 5967 register int i; | |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5968 int this_free = 0; |
| 300 | 5969 for (i = 0; i < lim; i++) |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
5970 if (!CONS_MARKED_P (&cblk->conses[i])) |
| 300 | 5971 { |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5972 this_free++; |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5973 cblk->conses[i].u.chain = cons_free_list; |
| 300 | 5974 cons_free_list = &cblk->conses[i]; |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5975 #if GC_MARK_STACK |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5976 cons_free_list->car = Vdead; |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
5977 #endif |
| 300 | 5978 } |
| 5979 else | |
| 5980 { | |
| 5981 num_used++; | |
|
51938
20d4eb1de9b0
Use bitmaps for cons cells, as was done for floats.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51908
diff
changeset
|
5982 CONS_UNMARK (&cblk->conses[i]); |
| 300 | 5983 } |
| 5984 lim = CONS_BLOCK_SIZE; | |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5985 /* 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
|
5986 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
|
5987 this block. */ |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5988 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
|
5989 { |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5990 *cprev = cblk->next; |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5991 /* Unhook from the free list. */ |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
5992 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
|
5993 lisp_align_free (cblk); |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
5994 n_cons_blocks--; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5995 } |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
5996 else |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5997 { |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5998 num_free += this_free; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
5999 cprev = &cblk->next; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6000 } |
| 300 | 6001 } |
| 6002 total_conses = num_used; | |
| 6003 total_free_conses = num_free; | |
| 6004 } | |
| 6005 | |
| 6006 /* Put all unmarked floats on free list */ | |
| 6007 { | |
| 6008 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
|
6009 struct float_block **fprev = &float_block; |
| 300 | 6010 register int lim = float_block_index; |
| 6011 register int num_free = 0, num_used = 0; | |
| 6012 | |
| 6013 float_free_list = 0; | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
6014 |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6015 for (fblk = float_block; fblk; fblk = *fprev) |
| 300 | 6016 { |
| 6017 register int i; | |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6018 int this_free = 0; |
| 300 | 6019 for (i = 0; i < lim; i++) |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6020 if (!FLOAT_MARKED_P (&fblk->floats[i])) |
| 300 | 6021 { |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6022 this_free++; |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
6023 fblk->floats[i].u.chain = float_free_list; |
| 300 | 6024 float_free_list = &fblk->floats[i]; |
| 6025 } | |
| 6026 else | |
| 6027 { | |
| 6028 num_used++; | |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6029 FLOAT_UNMARK (&fblk->floats[i]); |
| 300 | 6030 } |
| 6031 lim = FLOAT_BLOCK_SIZE; | |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6032 /* 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
|
6033 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
|
6034 this block. */ |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6035 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
|
6036 { |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6037 *fprev = fblk->next; |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6038 /* Unhook from the free list. */ |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
6039 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
|
6040 lisp_align_free (fblk); |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6041 n_float_blocks--; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6042 } |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6043 else |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6044 { |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6045 num_free += this_free; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6046 fprev = &fblk->next; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6047 } |
| 300 | 6048 } |
| 6049 total_floats = num_used; | |
| 6050 total_free_floats = num_free; | |
| 6051 } | |
| 6052 | |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6053 /* Put all unmarked intervals on free list */ |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6054 { |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6055 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
|
6056 struct interval_block **iprev = &interval_block; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6057 register int lim = interval_block_index; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6058 register int num_free = 0, num_used = 0; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6059 |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6060 interval_free_list = 0; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6061 |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6062 for (iblk = interval_block; iblk; iblk = *iprev) |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6063 { |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6064 register int i; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6065 int this_free = 0; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6066 |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6067 for (i = 0; i < lim; i++) |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6068 { |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
6069 if (!iblk->intervals[i].gcmarkbit) |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6070 { |
|
28269
fd13be8ae190
Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents:
28220
diff
changeset
|
6071 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
|
6072 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
|
6073 this_free++; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6074 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6075 else |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6076 { |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6077 num_used++; |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
6078 iblk->intervals[i].gcmarkbit = 0; |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6079 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6080 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6081 lim = INTERVAL_BLOCK_SIZE; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6082 /* 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
|
6083 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
|
6084 deallocate this block. */ |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6085 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
|
6086 { |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6087 *iprev = iblk->next; |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6088 /* Unhook from the free list. */ |
|
28269
fd13be8ae190
Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents:
28220
diff
changeset
|
6089 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
|
6090 lisp_free (iblk); |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6091 n_interval_blocks--; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6092 } |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6093 else |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6094 { |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6095 num_free += this_free; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6096 iprev = &iblk->next; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6097 } |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6098 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6099 total_intervals = num_used; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6100 total_free_intervals = num_free; |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6101 } |
|
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6102 |
| 300 | 6103 /* Put all unmarked symbols on free list */ |
| 6104 { | |
| 6105 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
|
6106 struct symbol_block **sprev = &symbol_block; |
| 300 | 6107 register int lim = symbol_block_index; |
| 6108 register int num_free = 0, num_used = 0; | |
| 6109 | |
|
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6110 symbol_free_list = NULL; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
6111 |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6112 for (sblk = symbol_block; sblk; sblk = *sprev) |
| 300 | 6113 { |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6114 int this_free = 0; |
|
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6115 struct Lisp_Symbol *sym = sblk->symbols; |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6116 struct Lisp_Symbol *end = sym + lim; |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6117 |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6118 for (; sym < end; ++sym) |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6119 { |
|
34325
a65d8c29442a
(gc_sweep): Add comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34308
diff
changeset
|
6120 /* 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
|
6121 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
|
6122 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
|
6123 int pure_p = PURE_POINTER_P (XSTRING (sym->xname)); |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
6124 |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
6125 if (!sym->gcmarkbit && !pure_p) |
|
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6126 { |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
6127 sym->next = symbol_free_list; |
|
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6128 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
|
6129 #if GC_MARK_STACK |
|
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6130 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
|
6131 #endif |
|
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6132 ++this_free; |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6133 } |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6134 else |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6135 { |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6136 ++num_used; |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6137 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
|
6138 UNMARK_STRING (XSTRING (sym->xname)); |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
6139 sym->gcmarkbit = 0; |
|
34308
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6140 } |
|
6d490e8ef117
(gc_sweep): Prevent symbols read during loadup
Gerd Moellmann <gerd@gnu.org>
parents:
34270
diff
changeset
|
6141 } |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
6142 |
| 300 | 6143 lim = SYMBOL_BLOCK_SIZE; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6144 /* 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
|
6145 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
|
6146 this block. */ |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6147 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
|
6148 { |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6149 *sprev = sblk->next; |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6150 /* Unhook from the free list. */ |
|
66889
e485868e3caf
(free_float): Make free list chaining aliasing-safe.
Andreas Schwab <schwab@suse.de>
parents:
66777
diff
changeset
|
6151 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
|
6152 lisp_free (sblk); |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6153 n_symbol_blocks--; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6154 } |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6155 else |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6156 { |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6157 num_free += this_free; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6158 sprev = &sblk->next; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6159 } |
| 300 | 6160 } |
| 6161 total_symbols = num_used; | |
| 6162 total_free_symbols = num_free; | |
| 6163 } | |
| 6164 | |
|
21143
ce12eac1ee45
(gc_sweep, mark_object): Handle new data structure
Richard M. Stallman <rms@gnu.org>
parents:
21084
diff
changeset
|
6165 /* 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
|
6166 For a marker, first unchain it from the buffer it points into. */ |
| 300 | 6167 { |
| 6168 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
|
6169 struct marker_block **mprev = &marker_block; |
| 300 | 6170 register int lim = marker_block_index; |
| 6171 register int num_free = 0, num_used = 0; | |
| 6172 | |
| 6173 marker_free_list = 0; | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
6174 |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6175 for (mblk = marker_block; mblk; mblk = *mprev) |
| 300 | 6176 { |
| 6177 register int i; | |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6178 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
|
6179 |
| 300 | 6180 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
|
6181 { |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
6182 if (!mblk->markers[i].u_marker.gcmarkbit) |
|
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
6183 { |
|
11243
054ecfce1820
(Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents:
11048
diff
changeset
|
6184 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) |
|
51668
0f333fd92a1d
(survives_gc_p): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51658
diff
changeset
|
6185 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
|
6186 /* 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
|
6187 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
|
6188 but this might catch bugs faster. */ |
|
11243
054ecfce1820
(Fmake_marker, mark_object): Use XMISCTYPE.
Richard M. Stallman <rms@gnu.org>
parents:
11048
diff
changeset
|
6189 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
|
6190 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
|
6191 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
|
6192 this_free++; |
|
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
6193 } |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
6194 else |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
6195 { |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
6196 num_used++; |
|
51658
00b3e009b3f5
(make_interval, Fmake_symbol, allocate_misc):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51578
diff
changeset
|
6197 mblk->markers[i].u_marker.gcmarkbit = 0; |
|
9893
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
6198 } |
|
8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
Karl Heuer <kwzh@gnu.org>
parents:
9463
diff
changeset
|
6199 } |
| 300 | 6200 lim = MARKER_BLOCK_SIZE; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6201 /* 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
|
6202 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
|
6203 this block. */ |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6204 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
|
6205 { |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6206 *mprev = mblk->next; |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6207 /* Unhook from the free list. */ |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6208 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
|
6209 lisp_free (mblk); |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6210 n_marker_blocks--; |
|
20057
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6211 } |
|
612cd201aea5
(gc_sweep): Free memory blocks that contain only unused
Karl Heuer <kwzh@gnu.org>
parents:
19666
diff
changeset
|
6212 else |
|
21379
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6213 { |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6214 num_free += this_free; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6215 mprev = &mblk->next; |
|
1701bf5b9dec
(gc_sweep): Avoid using two loop variables counting the
Andreas Schwab <schwab@suse.de>
parents:
21306
diff
changeset
|
6216 } |
| 300 | 6217 } |
| 6218 | |
| 6219 total_markers = num_used; | |
| 6220 total_free_markers = num_free; | |
| 6221 } | |
| 6222 | |
| 6223 /* Free all unmarked buffers */ | |
| 6224 { | |
| 6225 register struct buffer *buffer = all_buffers, *prev = 0, *next; | |
| 6226 | |
| 6227 while (buffer) | |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6228 if (!VECTOR_MARKED_P (buffer)) |
| 300 | 6229 { |
| 6230 if (prev) | |
| 6231 prev->next = buffer->next; | |
| 6232 else | |
| 6233 all_buffers = buffer->next; | |
| 6234 next = buffer->next; | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6235 lisp_free (buffer); |
| 300 | 6236 buffer = next; |
| 6237 } | |
| 6238 else | |
| 6239 { | |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6240 VECTOR_UNMARK (buffer); |
|
10307
e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10291
diff
changeset
|
6241 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer)); |
| 300 | 6242 prev = buffer, buffer = buffer->next; |
| 6243 } | |
| 6244 } | |
| 6245 | |
| 6246 /* Free all unmarked vectors */ | |
| 6247 { | |
| 6248 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next; | |
| 6249 total_vector_size = 0; | |
| 6250 | |
| 6251 while (vector) | |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6252 if (!VECTOR_MARKED_P (vector)) |
| 300 | 6253 { |
| 6254 if (prev) | |
| 6255 prev->next = vector->next; | |
| 6256 else | |
| 6257 all_vectors = vector->next; | |
| 6258 next = vector->next; | |
|
23958
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6259 lisp_free (vector); |
|
7094b74ce0a6
(lisp_malloc, lisp_free): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
23534
diff
changeset
|
6260 n_vectors--; |
| 300 | 6261 vector = next; |
|
25024
3bb745067f0e
(gc_sweep): Call sweep_weak_hash_tables.
Gerd Moellmann <gerd@gnu.org>
parents:
23973
diff
changeset
|
6262 |
| 300 | 6263 } |
| 6264 else | |
| 6265 { | |
|
51683
fb960854a12c
(VECTOR_MARK, VECTOR_UNMARK, VECTOR_MARKED_P): New macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51668
diff
changeset
|
6266 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
|
6267 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
|
6268 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
|
6269 else |
|
bd3241a14d0a
(gc_sweep): If a misc has type Lisp_Misc_Free,
Richard M. Stallman <rms@gnu.org>
parents:
11374
diff
changeset
|
6270 total_vector_size += vector->size; |
| 300 | 6271 prev = vector, vector = vector->next; |
| 6272 } | |
| 6273 } | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49529
diff
changeset
|
6274 |
|
35183
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6275 #ifdef GC_CHECK_STRING_BYTES |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6276 if (!noninteractive) |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6277 check_string_bytes (1); |
|
cc2a06489f0d
(CHECK_STRING_BYTES) [GC_CHECK_STRING_BYTES]: New macro.
Gerd Moellmann <gerd@gnu.org>
parents:
35170
diff
changeset
|
6278 #endif |
| 300 | 6279 } |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6280 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6281 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6282 |
| 300 | 6283 |
|
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6284 /* Debugging aids. */ |
|
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6285 |
|
5353
6389ed5b45ac
(Fmemory_limit): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
4956
diff
changeset
|
6286 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
|
6287 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
|
6288 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
|
6289 We divide the value by 1024 to make sure it fits in a Lisp integer. */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6290 () |
|
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6291 { |
|
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6292 Lisp_Object end; |
|
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6293 |
|
9261
e5ba7993d378
(VALIDATE_LISP_STORAGE, make_float, Fcons, Fmake_vector, Fmake_symbol,
Karl Heuer <kwzh@gnu.org>
parents:
9144
diff
changeset
|
6294 XSETINT (end, (EMACS_INT) sbrk (0) / 1024); |
|
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6295 |
|
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6296 return end; |
|
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6297 } |
|
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6298 |
|
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6299 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
|
6300 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
|
6301 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
|
6302 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
|
6303 Garbage collection does not decrease them. |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6304 The elements of the value are as follows: |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6305 (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
|
6306 All are in units of 1 = one object consed |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6307 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
|
6308 objects consed. |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6309 MISCS include overlays, markers, and some internal types. |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6310 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
|
6311 (but the contents of a buffer's text do not count here). */) |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6312 () |
|
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6313 { |
|
27142
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6314 Lisp_Object consed[8]; |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6315 |
|
39633
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6316 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
|
6317 consed[1] = make_number (min (MOST_POSITIVE_FIXNUM, floats_consed)); |
|
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6318 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
|
6319 consed[3] = make_number (min (MOST_POSITIVE_FIXNUM, symbols_consed)); |
|
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6320 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
|
6321 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
|
6322 consed[6] = make_number (min (MOST_POSITIVE_FIXNUM, intervals_consed)); |
|
a0bf0cb8ff3e
(inhibit_garbage_collection): Simplify.
Gerd Moellmann <gerd@gnu.org>
parents:
39572
diff
changeset
|
6323 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
|
6324 |
|
f742c86fcc15
(Fgarbage_collect): Return number of live and free
Gerd Moellmann <gerd@gnu.org>
parents:
27006
diff
changeset
|
6325 return Flist (8, consed); |
|
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6326 } |
|
28406
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6327 |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6328 int suppress_checking; |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6329 void |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6330 die (msg, file, line) |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6331 const char *msg; |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6332 const char *file; |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6333 int line; |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6334 { |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6335 fprintf (stderr, "\r\nEmacs fatal error: %s:%d: %s\r\n", |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6336 file, line, msg); |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6337 abort (); |
|
451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents:
28374
diff
changeset
|
6338 } |
|
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6339 |
| 300 | 6340 /* Initialization */ |
| 6341 | |
| 21514 | 6342 void |
| 300 | 6343 init_alloc_once () |
| 6344 { | |
| 6345 /* 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
|
6346 purebeg = PUREBEG; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6347 pure_size = PURESIZE; |
|
32594
e0646c73bf81
(pure_bytes_used): Renamed from pureptr.
Gerd Moellmann <gerd@gnu.org>
parents:
32587
diff
changeset
|
6348 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
|
6349 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
|
6350 pure_bytes_used_before_overflow = 0; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6351 |
|
51723
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6352 /* Initialize the list of free aligned blocks. */ |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6353 free_ablock = NULL; |
|
635066222916
(ALIGN): Add casts to simplify usage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51686
diff
changeset
|
6354 |
|
32692
0343fe9ef3ac
(toplevel) [SYSTEM_MALLOC || DOUG_LEA_MALLOC]: Undef
Gerd Moellmann <gerd@gnu.org>
parents:
32609
diff
changeset
|
6355 #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
|
6356 mem_init (); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6357 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
|
6358 #endif |
|
39572
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6359 |
| 300 | 6360 all_vectors = 0; |
| 6361 ignore_warnings = 1; | |
|
17345
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
6362 #ifdef DOUG_LEA_MALLOC |
|
4e11e27ce1f1
For glibc's malloc, include <malloc.h> for mallinfo,
Richard M. Stallman <rms@gnu.org>
parents:
17328
diff
changeset
|
6363 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
|
6364 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
|
6365 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
|
6366 #endif |
| 300 | 6367 init_strings (); |
| 6368 init_cons (); | |
| 6369 init_symbol (); | |
| 6370 init_marker (); | |
| 6371 init_float (); | |
|
27738
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6372 init_intervals (); |
|
1300
b13b79e28eb5
* alloc.c: #include "intervals.h".
Joseph Arceneaux <jla@gnu.org>
parents:
1295
diff
changeset
|
6373 |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6374 #ifdef REL_ALLOC |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6375 malloc_hysteresis = 32; |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6376 #else |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6377 malloc_hysteresis = 0; |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6378 #endif |
|
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6379 |
|
66530
88aab29bf2b2
(syms_of_alloc) <memory-full>: Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
66499
diff
changeset
|
6380 refill_memory_reserve (); |
|
10673
337c3a4d5fef
(emacs_blocked_malloc): Set __malloc_extra_blocks here.
Richard M. Stallman <rms@gnu.org>
parents:
10649
diff
changeset
|
6381 |
| 300 | 6382 ignore_warnings = 0; |
| 6383 gcprolist = 0; | |
|
26364
7b0217d9259c
(Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
6384 byte_stack_list = 0; |
| 300 | 6385 staticidx = 0; |
| 6386 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
|
6387 gc_cons_threshold = 100000 * sizeof (Lisp_Object); |
|
64611
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
6388 gc_relative_threshold = 0; |
|
47f158dcf216
(gc_cons_threshold): Not static.
Richard M. Stallman <rms@gnu.org>
parents:
64273
diff
changeset
|
6389 |
| 300 | 6390 #ifdef VIRT_ADDR_VARIES |
| 6391 malloc_sbrk_unused = 1<<22; /* A large number */ | |
| 6392 malloc_sbrk_used = 100000; /* as reasonable as any number */ | |
| 6393 #endif /* VIRT_ADDR_VARIES */ | |
| 6394 } | |
| 6395 | |
| 21514 | 6396 void |
| 300 | 6397 init_alloc () |
| 6398 { | |
| 6399 gcprolist = 0; | |
|
26364
7b0217d9259c
(Fgarbage_collect): Call mark_byte_stack and
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
6400 byte_stack_list = 0; |
|
28365
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6401 #if GC_MARK_STACK |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6402 #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
|
6403 setjmp_tested_p = longjmps_done = 0; |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6404 #endif |
|
a72abbd8dc16
(mark_maybe_object): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
28269
diff
changeset
|
6405 #endif |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6406 Vgc_elapsed = make_float (0.0); |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6407 gcs_done = 0; |
| 300 | 6408 } |
| 6409 | |
| 6410 void | |
| 6411 syms_of_alloc () | |
| 6412 { | |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6413 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
|
6414 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
|
6415 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
|
6416 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
|
6417 |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6418 Garbage collection happens automatically only when `eval' is called. |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6419 |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6420 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
|
6421 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
|
6422 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
|
6423 |
|
5c7cbbd6dbb4
(gc_cons_combined_threshold, Vgc_cons_percentage): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
64084
diff
changeset
|
6424 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
|
6425 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
|
6426 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
|
6427 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
|
6428 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
|
6429 Vgc_cons_percentage = make_float (0.1); |
|
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6430 |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6431 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
|
6432 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
|
6433 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6434 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
|
6435 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
|
6436 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6437 DEFVAR_INT ("floats-consed", &floats_consed, |
|
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Jan?k <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6438 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
|
6439 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6440 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
|
6441 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
|
6442 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6443 DEFVAR_INT ("symbols-consed", &symbols_consed, |
|
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Jan?k <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6444 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
|
6445 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6446 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
|
6447 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
|
6448 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6449 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
|
6450 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
|
6451 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6452 DEFVAR_INT ("intervals-consed", &intervals_consed, |
|
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Jan?k <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6453 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
|
6454 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6455 DEFVAR_INT ("strings-consed", &strings_consed, |
|
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Jan?k <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6456 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
|
6457 |
|
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6458 DEFVAR_LISP ("purify-flag", &Vpurify_flag, |
|
40107
d3cc7dd5d75a
Reindent DEFUNs with doc: keywords.
Pavel Jan?k <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
6459 doc: /* Non-nil means loading Lisp code in order to dump an executable. |
|
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6460 This means that certain objects should be allocated in shared (pure) space. */); |
|
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39859
diff
changeset
|
6461 |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6462 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
|
6463 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
|
6464 garbage_collection_messages = 0; |
|
f2b5d784fa88
(garbage_collection_messages): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
14764
diff
changeset
|
6465 |
|
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39973
diff
changeset
|
6466 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
|
6467 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
|
6468 Vpost_gc_hook = Qnil; |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6469 Qpost_gc_hook = intern ("post-gc-hook"); |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6470 staticpro (&Qpost_gc_hook); |
|
715a67381594
(purebeg, pure_size, pure_bytes_used_before_overflow):
Gerd Moellmann <gerd@gnu.org>
parents:
39297
diff
changeset
|
6471 |
|
46305
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6472 DEFVAR_LISP ("memory-signal-data", &Vmemory_signal_data, |
|
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6473 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
|
6474 /* 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
|
6475 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
|
6476 Vmemory_signal_data |
|
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6477 = list2 (Qerror, |
|
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6478 build_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs")); |
|
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6479 |
|
fed6b815dbeb
(Vmemory_full): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
46293
diff
changeset
|
6480 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
|
6481 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
|
6482 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
|
6483 |
|
11374
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
6484 staticpro (&Qgc_cons_threshold); |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
6485 Qgc_cons_threshold = intern ("gc-cons-threshold"); |
|
1ebc81f84aa4
(inhibit_garbage_collection): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11341
diff
changeset
|
6486 |
|
13219
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
6487 staticpro (&Qchar_table_extra_slots); |
|
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
6488 Qchar_table_extra_slots = intern ("char-table-extra-slots"); |
|
99b5164a319d
(Qchar_table_extra_slots): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13150
diff
changeset
|
6489 |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6490 DEFVAR_LISP ("gc-elapsed", &Vgc_elapsed, |
|
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6491 doc: /* Accumulated time elapsed in garbage collections. |
|
51974
111cc76606c6
(syms_of_alloc): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents:
51938
diff
changeset
|
6492 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
|
6493 DEFVAR_INT ("gcs-done", &gcs_done, |
|
51974
111cc76606c6
(syms_of_alloc): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents:
51938
diff
changeset
|
6494 doc: /* Accumulated number of garbage collections done. */); |
|
49529
fd79b3081e01
(Vgc_elapsed, gcs_done): New variables.
Dave Love <fx@gnu.org>
parents:
49414
diff
changeset
|
6495 |
| 300 | 6496 defsubr (&Scons); |
| 6497 defsubr (&Slist); | |
| 6498 defsubr (&Svector); | |
| 6499 defsubr (&Smake_byte_code); | |
| 6500 defsubr (&Smake_list); | |
| 6501 defsubr (&Smake_vector); | |
|
13141
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
6502 defsubr (&Smake_char_table); |
| 300 | 6503 defsubr (&Smake_string); |
|
13141
4a4d1d8e89e5
(Fmake_chartable, Fmake_boolvector): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
13008
diff
changeset
|
6504 defsubr (&Smake_bool_vector); |
| 300 | 6505 defsubr (&Smake_symbol); |
| 6506 defsubr (&Smake_marker); | |
| 6507 defsubr (&Spurecopy); | |
| 6508 defsubr (&Sgarbage_collect); | |
|
1327
ef16e7c0d402
* alloc.c (Fmemory_limit): New function.
Jim Blandy <jimb@redhat.com>
parents:
1318
diff
changeset
|
6509 defsubr (&Smemory_limit); |
|
12748
3433bb446e06
(cons_cells_consed, floats_consed, vector_cells_consed)
Richard M. Stallman <rms@gnu.org>
parents:
12605
diff
changeset
|
6510 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
|
6511 |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6512 #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
|
6513 defsubr (&Sgc_status); |
|
581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
6514 #endif |
| 300 | 6515 } |
| 52401 | 6516 |
| 6517 /* arch-tag: 6695ca10-e3c5-4c2c-8bc3-ed26a7dda857 | |
| 6518 (do not change this comment) */ |
