Mercurial > hg > xemacs-beta
annotate src/vdb-posix.c @ 5486:58e320bde005
Handle redisplay edge case.
With motion events when entering a frame and the minibuffer is
active, row and column can be zero, and there aren't any runes.
| author | Mike Kupfer <mike.kupfer@xemacs.org> |
|---|---|
| date | Sat, 30 Apr 2011 13:30:47 +0900 |
| parents | 308d34e9f07d |
| children |
| rev | line source |
|---|---|
| 3092 | 1 /* Virtual diry bit implementation for XEmacs. |
| 2 Copyright (C) 2005 Marcus Crestani. | |
| 3 | |
| 4 This file is part of XEmacs. | |
| 5 | |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5091
diff
changeset
|
6 XEmacs is free software: you can redistribute it and/or modify it |
| 3092 | 7 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:
5091
diff
changeset
|
8 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:
5091
diff
changeset
|
9 option) any later version. |
| 3092 | 10 |
| 11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 for more details. | |
| 15 | |
| 16 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:
5091
diff
changeset
|
17 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
| 3092 | 18 |
| 19 /* Synched up with: Not in FSF. */ | |
| 20 | |
| 21 #include <config.h> | |
| 22 #include "lisp.h" | |
| 23 #include "gc.h" | |
| 24 #include "mc-alloc.h" | |
| 25 #include "vdb.h" | |
| 26 | |
| 27 #include <errno.h> | |
| 28 #include <signal.h> | |
| 29 #include <sys/mman.h> | |
| 30 | |
| 31 #if defined (HAVE_SIGACTION) | |
| 32 # if defined (HAVE_STRUCT_SIGINFO_SI_ADDR) | |
| 33 # define FAULT_HANDLER_ARGUMENTS \ | |
| 34 int signum, struct siginfo *siginfo, void *UNUSED (ctx) | |
| 35 # define GET_FAULT_ADDRESS siginfo->si_addr | |
| 36 # elif defined (HAVE_SIGINFO_T_SI_ADDR) | |
| 37 # define FAULT_HANDLER_ARGUMENTS \ | |
| 38 int signum, siginfo_t *siginfo, void *UNUSED (ctx) | |
| 39 # define GET_FAULT_ADDRESS siginfo->si_addr | |
| 40 # endif | |
| 41 # define USE_SIGACTION | |
| 42 # define FAULT_HANDLER_REMOVE_HANDLER | |
| 43 #elif defined (HAVE_SIGNAL) | |
| 44 # define FAULT_HANDLER_ARGUMENTS int signum, struct sigcontext sc | |
| 45 # define GET_FAULT_ADDRESS (void *) sc.cr2 | |
| 46 # define USE_SIGNAL | |
| 47 #endif | |
| 48 | |
| 49 | |
| 50 #ifdef USE_SIGACTION | |
| 51 struct sigaction act, segv_oact, bus_oact; | |
| 52 #endif /* USE_SIGACTION */ | |
| 53 | |
| 54 #ifdef USE_SIGNAL | |
| 55 sighandler_t segv_oact, bus_oact; | |
| 56 #endif /* USE_SIGNAL */ | |
| 57 | |
| 58 void vdb_remove_signal_handler (void); | |
| 59 | |
| 60 void | |
| 61 vdb_fault_handler (FAULT_HANDLER_ARGUMENTS) | |
| 62 { | |
| 63 if (write_barrier_enabled | |
| 64 && (fault_on_protected_page (GET_FAULT_ADDRESS))) | |
| 65 { | |
| 66 vdb_designate_modified (GET_FAULT_ADDRESS); | |
| 67 unprotect_page_and_mark_dirty (GET_FAULT_ADDRESS); | |
| 68 #ifdef FAULT_HANDLER_REINSTALL_HANDLER | |
| 69 vdb_install_signal_handler (); | |
| 70 #endif /* FAULT_HANDLER_REINSTALL_HANDLER */ | |
| 71 } | |
| 72 else /* default sigsegv handler */ | |
| 73 { | |
| 5091 | 74 const Ascbyte *signal_name = ""; |
| 3092 | 75 if (signum == SIGSEGV) |
| 76 signal_name = "SIGSEGV"; | |
| 77 else if (signum == SIGBUS) | |
| 78 signal_name = "SIGBUS"; | |
| 79 else | |
| 80 ABORT (); /* something weird happened: wrong signal caught */ | |
| 3519 | 81 fprintf (stderr, "\n\nFatal Error: Received %s (%d) for address %p\n", |
| 82 signal_name, signum, (void *) GET_FAULT_ADDRESS); | |
| 3092 | 83 #ifdef FAULT_HANDLER_CALL_PREVIOUS_HANDLER |
| 84 if (signum == SIGSEGV) | |
| 85 segv_oact (signum); | |
| 86 else if (signum == SIGBUS) | |
| 87 bus_oact (signum); | |
| 88 #endif /* FAULT_HANDLER_CALL_PREVIOUS_HANDLER */ | |
| 89 #ifdef FAULT_HANDLER_REMOVE_HANDLER | |
| 90 vdb_remove_signal_handler (); | |
| 91 #endif /* FAULT_HANDLER_REMOVE_HANDLER */ | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 void | |
| 96 vdb_remove_signal_handler (void) | |
| 97 { | |
| 98 #ifdef USE_SIGACTION | |
| 99 sigaction(SIGSEGV, &segv_oact, 0); | |
| 100 sigaction(SIGBUS, &bus_oact, 0); | |
| 101 #endif /* USE_SIGACTION */ | |
| 102 #ifdef USE_SIGNAL | |
| 103 signal (SIGSEGV, segv_oact); | |
| 104 signal (SIGBUS, bus_oact); | |
| 105 #endif | |
| 106 } | |
| 107 | |
| 108 void | |
| 109 vdb_install_signal_handler (void) | |
| 110 { | |
| 111 /* See init_signals_very_early () in signal.c. */ | |
| 112 if (noninteractive && !initialized) | |
| 113 { | |
| 114 allow_incremental_gc = 0; | |
| 115 return; | |
| 116 } | |
| 117 | |
| 118 #ifdef USE_SIGACTION | |
| 3307 | 119 memset(&act, 0, sizeof(struct sigaction)); |
| 3092 | 120 act.sa_sigaction = vdb_fault_handler; |
| 121 sigemptyset (&act.sa_mask); | |
| 122 act.sa_flags = SA_SIGINFO; | |
| 123 sigaction (SIGSEGV, &act, &segv_oact); | |
| 124 sigaction (SIGBUS, &act, &bus_oact); | |
| 125 allow_incremental_gc = 1; | |
| 126 #endif /* USE_SIGACTION */ | |
| 127 #ifdef USE_SIGNAL | |
| 128 segv_oact = signal (SIGSEGV, (void (*)(int)) vdb_fault_handler); | |
| 129 bus_oact = signal (SIGBUS, (void (*)(int)) vdb_fault_handler); | |
| 130 #endif /* USE_SIGNAL */ | |
| 131 } | |
| 132 | |
| 133 void | |
| 134 vdb_protect (void *ptr, EMACS_INT len) | |
| 135 { | |
| 136 if (mprotect (ptr, len, PROT_READ)) | |
| 137 { | |
| 138 perror ("Couldn't mprotect"); | |
| 139 ABORT (); | |
| 140 } | |
| 141 } | |
| 142 | |
| 143 void | |
| 144 vdb_unprotect (void *ptr, EMACS_INT len) | |
| 145 { | |
| 146 if (mprotect (ptr, len, PROT_READ | PROT_WRITE)) | |
| 147 { | |
| 148 perror ("Couldn't mprotect"); | |
| 149 ABORT (); | |
| 150 } | |
| 151 } |
