Mercurial > hg > xemacs-beta
annotate src/vdb.c @ 5294:bbff29a01820
Add compiler macros and compilation sanity-checks for functions with keywords.
2010-10-25 Aidan Kehoe <kehoea@parhasard.net>
Add compiler macros and compilation sanity-checking for various
functions that take keywords.
* byte-optimize.el (side-effect-free-fns): #'symbol-value is
side-effect free and not error free.
* bytecomp.el (byte-compile-normal-call): Check keyword argument
lists for sanity; store information about the positions where
keyword arguments start using the new byte-compile-keyword-start
property.
* cl-macs.el (cl-const-expr-val): Take a new optional argument,
cl-not-constant, defaulting to nil, in this function; return it if
the expression is not constant.
(cl-non-fixnum-number-p): Make this into a separate function, we
want to pass it to #'every.
(eql): Use it.
(define-star-compiler-macros): Use the same code to generate the
member*, assoc* and rassoc* compiler macros; special-case some
code in #'add-to-list in subr.el.
(remove, remq): Add compiler macros for these two functions, in
preparation for #'remove being in C.
(define-foo-if-compiler-macros): Transform (remove-if-not ...) calls to
(remove ... :if-not) at compile time, which will be a real win
once the latter is in C.
(define-substitute-if-compiler-macros)
(define-subst-if-compiler-macros): Similarly for these functions.
(delete-duplicates): Change this compiler macro to use
#'plists-equal; if we don't have information about the type of
SEQUENCE at compile time, don't bother attempting to inline the
call, the function will be in C soon enough.
(equalp): Remove an old commented-out compiler macro for this, if
we want to see it it's in version control.
(subst-char-in-string): Transform this to a call to nsubstitute or
nsubstitute, if that is appropriate.
* cl.el (ldiff): Don't call setf here, this makes for a load-time
dependency problem in cl-macs.el
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Mon, 25 Oct 2010 13:04:04 +0100 |
| 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 } |
