Mercurial > hg > xemacs-beta
annotate src/vdb.c @ 5167:e374ea766cc1
clean up, rearrange allocation statistics code
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-03-21 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (assert_proper_sizing):
* alloc.c (c_readonly):
* alloc.c (malloced_storage_size):
* alloc.c (fixed_type_block_overhead):
* alloc.c (lisp_object_storage_size):
* alloc.c (inc_lrecord_stats):
* alloc.c (dec_lrecord_stats):
* alloc.c (pluralize_word):
* alloc.c (object_memory_usage_stats):
* alloc.c (Fobject_memory_usage):
* alloc.c (compute_memusage_stats_length):
* alloc.c (disksave_object_finalization_1):
* alloc.c (Fgarbage_collect):
* mc-alloc.c:
* mc-alloc.c (mc_alloced_storage_size):
* mc-alloc.h:
No functionality change here. Collect the allocations-statistics
code that was scattered throughout alloc.c into one place. Add
remaining section headings so that all sections have headings
clearly identifying the start of the section and its purpose.
Expose mc_alloced_storage_size() even when not MEMORY_USAGE_STATS;
this fixes build problems and is related to the export of
lisp_object_storage_size() and malloced_storage_size() when
non-MEMORY_USAGE_STATS in the previous change set.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Sun, 21 Mar 2010 04:41:49 -0500 |
parents | f395ee7ad844 |
children | 308d34e9f07d |
rev | line source |
---|---|
3092 | 1 /* Virtual diry bit implementation (platform independent) for XEmacs. |
2 Copyright (C) 2005 Marcus Crestani. | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
3 Copyright (C) 2010 Ben Wing. |
3092 | 4 |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: Not in FSF. */ | |
23 | |
24 #include <config.h> | |
25 #include "lisp.h" | |
26 #include "gc.h" | |
27 #include "mc-alloc.h" | |
28 #include "vdb.h" | |
29 | |
30 | |
31 typedef struct | |
32 { | |
33 Dynarr_declare (void *); | |
34 } void_ptr_dynarr; | |
35 | |
36 void_ptr_dynarr *page_fault_table; | |
37 | |
38 /* Init page fault table and protect heap. */ | |
39 void | |
40 vdb_start_dirty_bits_recording (void) | |
41 { | |
3303 | 42 Elemcount protected_pages = (Elemcount) protect_heap_pages (); |
3092 | 43 page_fault_table = Dynarr_new2 (void_ptr_dynarr, void *); |
3303 | 44 Dynarr_resize (page_fault_table, protected_pages); |
3092 | 45 } |
46 | |
47 /* Remove heap protection. */ | |
48 void | |
49 vdb_stop_dirty_bits_recording (void) | |
50 { | |
51 unprotect_heap_pages (); | |
52 } | |
53 | |
54 /* Read page fault table and pass page faults to garbage collector. */ | |
55 int | |
56 vdb_read_dirty_bits (void) | |
57 { | |
58 int repushed_objects = 0; | |
59 Elemcount count; | |
60 for (count = Dynarr_length (page_fault_table); count; count--) | |
61 repushed_objects += | |
62 repush_all_objects_on_page (Dynarr_at (page_fault_table, count - 1)); | |
63 Dynarr_free (page_fault_table); | |
64 page_fault_table = 0; | |
65 return repushed_objects; | |
66 } | |
67 | |
68 /* Called by the page fault handler: add address to page fault table. */ | |
69 void | |
70 vdb_designate_modified (void *addr) | |
71 { | |
72 Dynarr_add (page_fault_table, addr); | |
73 } | |
74 | |
75 | |
76 /* For testing and debugging... */ | |
77 | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
78 #ifdef DEBUG_XEMACS |
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
79 |
3092 | 80 DEFUN ("test-vdb", Ftest_vdb, 0, 0, "", /* |
81 Test virtual dirty bit implementation. Prints results to stderr. | |
82 */ | |
83 ()) | |
84 { | |
85 Rawbyte *p; | |
86 char c; | |
87 Elemcount count; | |
88 | |
89 /* Wrap up gc (if currently running). */ | |
90 gc_full (); | |
91 | |
92 /* Allocate a buffer; it will have the default | |
93 protection of PROT_READ|PROT_WRITE. */ | |
94 p = (Rawbyte *) mc_alloc (mc_get_page_size()); | |
95 set_lheader_implementation ((struct lrecord_header *) p, &lrecord_cons); | |
4123 | 96 fprintf (stderr, "Allocate p: [%p ... %p], length %d\n", |
97 p, p + mc_get_page_size (), (int) mc_get_page_size ()); | |
3092 | 98 |
99 /* Test read. */ | |
100 fprintf (stderr, "Attempt to read p[666]... "); | |
101 c = p[666]; | |
102 fprintf (stderr, "read ok.\n"); | |
103 | |
104 /* Test write. */ | |
105 fprintf (stderr, "Attempt to write 42 to p[666]... "); | |
106 p[666] = 42; | |
107 fprintf (stderr, "write ok, p[666] = %d\n", p[666]); | |
108 | |
109 /* Mark the buffer read-only and set environemnt for write-barrier. */ | |
110 fprintf (stderr, "Write-protect the page.\n"); | |
111 MARK_BLACK (p); | |
112 vdb_start_dirty_bits_recording (); | |
113 write_barrier_enabled = 1; | |
114 | |
115 /* Test write-barrier read. */ | |
116 fprintf (stderr, "Attempt to read p[666]... "); | |
117 c = p[666]; | |
118 fprintf (stderr, "read ok.\n"); | |
119 | |
120 /* Test write-barrier write, program receives SIGSEGV. */ | |
121 fprintf (stderr, "Attempt to write 23 to p[666]... "); | |
122 p[666] = 23; | |
123 fprintf (stderr, "Written p[666] = %d\n", p[666]); | |
124 | |
125 /* Stop write-barrier mode. */ | |
126 write_barrier_enabled = 0; | |
127 MARK_WHITE (p); | |
128 vdb_unprotect (p, mc_get_page_size ()); | |
129 for (count = Dynarr_length (page_fault_table); count; count--) | |
130 if (Dynarr_at (page_fault_table, count - 1) == &p[666]) | |
4123 | 131 fprintf (stderr, "VALID page fault at %p\n", |
132 Dynarr_at (page_fault_table, count - 1)); | |
3092 | 133 else |
4123 | 134 fprintf (stderr, "WRONG page fault at %p\n", |
135 Dynarr_at (page_fault_table, count - 1)); | |
3092 | 136 Dynarr_free (page_fault_table); |
137 return Qnil; | |
138 } | |
139 | |
140 DEFUN ("test-segfault", Ftest_segfault, 0, 0, "", /* | |
141 Test virtual dirty bit implementation: provoke a segfault on purpose. | |
142 WARNING: this function causes a SEGFAULT on purpose and thus crashes | |
143 XEmacs! This is only used for debbugging, e.g. for testing how the | |
144 debugger behaves when XEmacs segfaults and the write barrier is | |
145 enabled. | |
146 */ | |
147 ()) | |
148 { | |
149 Rawbyte *q = 0; | |
150 q[0] = 23; | |
151 return Qnil; | |
152 } | |
153 | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
154 #endif /* DEBUG_XEMACS */ |
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
155 |
3092 | 156 void |
157 syms_of_vdb (void) | |
158 { | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
159 #ifdef DEBUG_XEMACS |
3092 | 160 DEFSUBR (Ftest_vdb); |
161 DEFSUBR (Ftest_segfault); | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
162 #endif /* DEBUG_XEMACS */ |
3092 | 163 } |