Mercurial > hg > xemacs-beta
annotate src/vdb.c @ 5750:66d2f63df75f
Correct some spelling and formatting in behavior.el.
Mentioned in tracker issue 826, the third thing mentioned there (the file
name at the bottom of the file) had already been fixed.
lisp/ChangeLog addition:
2013-08-05 Aidan Kehoe <kehoea@parhasard.net>
* behavior.el:
(override-behavior):
Correct some spelling and formatting here, thank you Steven
Mitchell in tracker issue 826.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Mon, 05 Aug 2013 10:05:32 +0100 |
parents | 308d34e9f07d |
children |
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 | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5042
diff
changeset
|
7 XEmacs is free software: you can redistribute it and/or modify it |
3092 | 8 under the terms of the GNU General Public License as published by the |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5042
diff
changeset
|
9 Free Software Foundation, either version 3 of the License, or (at your |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5042
diff
changeset
|
10 option) any later version. |
3092 | 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 | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5042
diff
changeset
|
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
3092 | 19 |
20 /* Synched up with: Not in FSF. */ | |
21 | |
22 #include <config.h> | |
23 #include "lisp.h" | |
24 #include "gc.h" | |
25 #include "mc-alloc.h" | |
26 #include "vdb.h" | |
27 | |
28 | |
29 typedef struct | |
30 { | |
31 Dynarr_declare (void *); | |
32 } void_ptr_dynarr; | |
33 | |
34 void_ptr_dynarr *page_fault_table; | |
35 | |
36 /* Init page fault table and protect heap. */ | |
37 void | |
38 vdb_start_dirty_bits_recording (void) | |
39 { | |
3303 | 40 Elemcount protected_pages = (Elemcount) protect_heap_pages (); |
3092 | 41 page_fault_table = Dynarr_new2 (void_ptr_dynarr, void *); |
3303 | 42 Dynarr_resize (page_fault_table, protected_pages); |
3092 | 43 } |
44 | |
45 /* Remove heap protection. */ | |
46 void | |
47 vdb_stop_dirty_bits_recording (void) | |
48 { | |
49 unprotect_heap_pages (); | |
50 } | |
51 | |
52 /* Read page fault table and pass page faults to garbage collector. */ | |
53 int | |
54 vdb_read_dirty_bits (void) | |
55 { | |
56 int repushed_objects = 0; | |
57 Elemcount count; | |
58 for (count = Dynarr_length (page_fault_table); count; count--) | |
59 repushed_objects += | |
60 repush_all_objects_on_page (Dynarr_at (page_fault_table, count - 1)); | |
61 Dynarr_free (page_fault_table); | |
62 page_fault_table = 0; | |
63 return repushed_objects; | |
64 } | |
65 | |
66 /* Called by the page fault handler: add address to page fault table. */ | |
67 void | |
68 vdb_designate_modified (void *addr) | |
69 { | |
70 Dynarr_add (page_fault_table, addr); | |
71 } | |
72 | |
73 | |
74 /* For testing and debugging... */ | |
75 | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
76 #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
|
77 |
3092 | 78 DEFUN ("test-vdb", Ftest_vdb, 0, 0, "", /* |
79 Test virtual dirty bit implementation. Prints results to stderr. | |
80 */ | |
81 ()) | |
82 { | |
83 Rawbyte *p; | |
84 char c; | |
85 Elemcount count; | |
86 | |
87 /* Wrap up gc (if currently running). */ | |
88 gc_full (); | |
89 | |
90 /* Allocate a buffer; it will have the default | |
91 protection of PROT_READ|PROT_WRITE. */ | |
92 p = (Rawbyte *) mc_alloc (mc_get_page_size()); | |
93 set_lheader_implementation ((struct lrecord_header *) p, &lrecord_cons); | |
4123 | 94 fprintf (stderr, "Allocate p: [%p ... %p], length %d\n", |
95 p, p + mc_get_page_size (), (int) mc_get_page_size ()); | |
3092 | 96 |
97 /* Test read. */ | |
98 fprintf (stderr, "Attempt to read p[666]... "); | |
99 c = p[666]; | |
100 fprintf (stderr, "read ok.\n"); | |
101 | |
102 /* Test write. */ | |
103 fprintf (stderr, "Attempt to write 42 to p[666]... "); | |
104 p[666] = 42; | |
105 fprintf (stderr, "write ok, p[666] = %d\n", p[666]); | |
106 | |
107 /* Mark the buffer read-only and set environemnt for write-barrier. */ | |
108 fprintf (stderr, "Write-protect the page.\n"); | |
109 MARK_BLACK (p); | |
110 vdb_start_dirty_bits_recording (); | |
111 write_barrier_enabled = 1; | |
112 | |
113 /* Test write-barrier read. */ | |
114 fprintf (stderr, "Attempt to read p[666]... "); | |
115 c = p[666]; | |
116 fprintf (stderr, "read ok.\n"); | |
117 | |
118 /* Test write-barrier write, program receives SIGSEGV. */ | |
119 fprintf (stderr, "Attempt to write 23 to p[666]... "); | |
120 p[666] = 23; | |
121 fprintf (stderr, "Written p[666] = %d\n", p[666]); | |
122 | |
123 /* Stop write-barrier mode. */ | |
124 write_barrier_enabled = 0; | |
125 MARK_WHITE (p); | |
126 vdb_unprotect (p, mc_get_page_size ()); | |
127 for (count = Dynarr_length (page_fault_table); count; count--) | |
128 if (Dynarr_at (page_fault_table, count - 1) == &p[666]) | |
4123 | 129 fprintf (stderr, "VALID page fault at %p\n", |
130 Dynarr_at (page_fault_table, count - 1)); | |
3092 | 131 else |
4123 | 132 fprintf (stderr, "WRONG page fault at %p\n", |
133 Dynarr_at (page_fault_table, count - 1)); | |
3092 | 134 Dynarr_free (page_fault_table); |
135 return Qnil; | |
136 } | |
137 | |
138 DEFUN ("test-segfault", Ftest_segfault, 0, 0, "", /* | |
139 Test virtual dirty bit implementation: provoke a segfault on purpose. | |
140 WARNING: this function causes a SEGFAULT on purpose and thus crashes | |
141 XEmacs! This is only used for debbugging, e.g. for testing how the | |
142 debugger behaves when XEmacs segfaults and the write barrier is | |
143 enabled. | |
144 */ | |
145 ()) | |
146 { | |
147 Rawbyte *q = 0; | |
148 q[0] = 23; | |
149 return Qnil; | |
150 } | |
151 | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
152 #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
|
153 |
3092 | 154 void |
155 syms_of_vdb (void) | |
156 { | |
5042
f395ee7ad844
Fix some compile warnings, make vdb test code conditional on DEBUG_XEMACS
Ben Wing <ben@xemacs.org>
parents:
4123
diff
changeset
|
157 #ifdef DEBUG_XEMACS |
3092 | 158 DEFSUBR (Ftest_vdb); |
159 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
|
160 #endif /* DEBUG_XEMACS */ |
3092 | 161 } |