Mercurial > hg > xemacs-beta
annotate src/vdb.c @ 5557:53c066311921
If XLookupKeysym() returned an XFree86 "special key", ignore it. Fixes Sh-F11.
src/ChangeLog addition:
2011-08-27 Aidan Kehoe <kehoea@parhasard.net>
* config.h.in: Make HAVE_X11_XF86KEYSYM_H available here.
* event-Xt.c: #include X11/XF86keysym.h if available.
* event-Xt.c (x_event_to_emacs_event):
If XLookupKeysym () returned one of the XFree86 "special action
keys" for the shifted keysym, treat that as NoSymbol, fixing a
long-standing bug with shifted function keys under X.org.
Details of why in:
http://mid.gmane.org/16960.15685.26911.644835@parhasard.net
ChangeLog addition:
2011-08-27 Aidan Kehoe <kehoea@parhasard.net>
* configure.ac: Check whether X11/XF86keysym.h is available, to
allow us to avoid a bug in the interaction of XKB and XLookupKeysym.
* configure: Regenerate.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Sat, 27 Aug 2011 20:35:23 +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 } |
