Mercurial > hg > xemacs-beta
view src/vdb-posix.c @ 4917:fce43cb76a1c
xlike cleanup, documentation
-------------------- ChangeLog entries follow: --------------------
man/ChangeLog addition:
2010-02-03 Ben Wing <ben@xemacs.org>
* internals/internals.texi (Top):
* internals/internals.texi (Evaluation; Stack Frames; Bindings):
* internals/internals.texi (Ben's README):
* internals/internals.texi (Consoles; Devices; Frames; Windows):
* internals/internals.texi (Window Hierarchy):
* internals/internals.texi (The Window Object):
* internals/internals.texi (Modules for the Basic Displayable Lisp Objects):
* internals/internals.texi (Window-System Support):
* internals/internals.texi (Creating a Window-System Type):
* internals/internals.texi (Discussion -- Garbage Collection):
Update the part at the top about how to maintain the file with
more tips.
Add a chapter on "window-system support" describing in a general
way how the support for different window systems/device types
works, including the separation between device-independent and
device-dependent parts, device methods, the specific device types
and the "xlike" pseudo-type.
src/ChangeLog addition:
2010-02-03 Ben Wing <ben@xemacs.org>
* Makefile.in.in:
* Makefile.in.in (x_objs):
* Makefile.in.in (gtk_gui_objs):
* console-xlike-inc.h:
* depend:
* device-x.c:
* emacs.c:
* gccache-gtk.h:
* gccache-gtk.h (gc_cache_lookup):
* gccache-x.c:
* gccache-x.c (GCCACHE_HASH):
* gccache-x.h:
* toolbar-gtk.c:
* toolbar-gtk.c (gtk_initialize_frame_toolbars):
* toolbar-x.c:
* toolbar-x.c (x_initialize_frame_toolbars):
* toolbar-xlike.c:
* toolbar-xlike.c (xlike_draw_blank_toolbar_button):
* toolbar-xlike.c (xlike_output_toolbar_button):
* toolbar-xlike.c (xlike_get_button_size):
* toolbar-xlike.c (XLIKE_OUTPUT_BUTTONS_LOOP):
* toolbar-xlike.c (xlike_output_toolbar):
* toolbar-xlike.c (xlike_clear_toolbar):
* toolbar-xlike.c (xlike_output_frame_toolbars):
* toolbar-xlike.c (xlike_clear_frame_toolbars):
* toolbar-xlike.c (xlike_redraw_exposed_toolbar):
* toolbar-xlike.c (xlike_redraw_exposed_toolbars):
* toolbar-xlike.c (xlike_redraw_frame_toolbars):
* toolbar-xlike.h:
* toolbar-xlike.h (xlike_clear_frame_toolbars):
Rename some files to make them consistent with general naming rules:
xgccache.c -> gccache-x.c
xgccache.h -> gccache-x.h
toolbar-common.c -> toolbar-xlike.c
toolbar-common.h -> toolbar-xlike.h
Fix include-file references. Also change the names of functions
in now-named toolbar-xlike.c to be xlike_foo() instead of common_foo().
Add a longish comment in console-xlike-inc.h describing the "xlike"
system, how it works and what the various files are used for.
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Wed, 03 Feb 2010 02:46:50 -0600 |
| parents | 896a34d28b71 |
| children | ed624ab64583 |
line wrap: on
line source
/* Virtual diry bit implementation for XEmacs. Copyright (C) 2005 Marcus Crestani. This file is part of XEmacs. XEmacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. XEmacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with XEmacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Synched up with: Not in FSF. */ #include <config.h> #include "lisp.h" #include "gc.h" #include "mc-alloc.h" #include "vdb.h" #include <errno.h> #include <signal.h> #include <sys/mman.h> #if defined (HAVE_SIGACTION) # if defined (HAVE_STRUCT_SIGINFO_SI_ADDR) # define FAULT_HANDLER_ARGUMENTS \ int signum, struct siginfo *siginfo, void *UNUSED (ctx) # define GET_FAULT_ADDRESS siginfo->si_addr # elif defined (HAVE_SIGINFO_T_SI_ADDR) # define FAULT_HANDLER_ARGUMENTS \ int signum, siginfo_t *siginfo, void *UNUSED (ctx) # define GET_FAULT_ADDRESS siginfo->si_addr # endif # define USE_SIGACTION # define FAULT_HANDLER_REMOVE_HANDLER #elif defined (HAVE_SIGNAL) # define FAULT_HANDLER_ARGUMENTS int signum, struct sigcontext sc # define GET_FAULT_ADDRESS (void *) sc.cr2 # define USE_SIGNAL #endif #ifdef USE_SIGACTION struct sigaction act, segv_oact, bus_oact; #endif /* USE_SIGACTION */ #ifdef USE_SIGNAL sighandler_t segv_oact, bus_oact; #endif /* USE_SIGNAL */ void vdb_remove_signal_handler (void); void vdb_fault_handler (FAULT_HANDLER_ARGUMENTS) { if (write_barrier_enabled && (fault_on_protected_page (GET_FAULT_ADDRESS))) { vdb_designate_modified (GET_FAULT_ADDRESS); unprotect_page_and_mark_dirty (GET_FAULT_ADDRESS); #ifdef FAULT_HANDLER_REINSTALL_HANDLER vdb_install_signal_handler (); #endif /* FAULT_HANDLER_REINSTALL_HANDLER */ } else /* default sigsegv handler */ { char *signal_name = ""; if (signum == SIGSEGV) signal_name = "SIGSEGV"; else if (signum == SIGBUS) signal_name = "SIGBUS"; else ABORT (); /* something weird happened: wrong signal caught */ fprintf (stderr, "\n\nFatal Error: Received %s (%d) for address %p\n", signal_name, signum, (void *) GET_FAULT_ADDRESS); #ifdef FAULT_HANDLER_CALL_PREVIOUS_HANDLER if (signum == SIGSEGV) segv_oact (signum); else if (signum == SIGBUS) bus_oact (signum); #endif /* FAULT_HANDLER_CALL_PREVIOUS_HANDLER */ #ifdef FAULT_HANDLER_REMOVE_HANDLER vdb_remove_signal_handler (); #endif /* FAULT_HANDLER_REMOVE_HANDLER */ } } void vdb_remove_signal_handler (void) { #ifdef USE_SIGACTION sigaction(SIGSEGV, &segv_oact, 0); sigaction(SIGBUS, &bus_oact, 0); #endif /* USE_SIGACTION */ #ifdef USE_SIGNAL signal (SIGSEGV, segv_oact); signal (SIGBUS, bus_oact); #endif } void vdb_install_signal_handler (void) { /* See init_signals_very_early () in signal.c. */ if (noninteractive && !initialized) { allow_incremental_gc = 0; return; } #ifdef USE_SIGACTION memset(&act, 0, sizeof(struct sigaction)); act.sa_sigaction = vdb_fault_handler; sigemptyset (&act.sa_mask); act.sa_flags = SA_SIGINFO; sigaction (SIGSEGV, &act, &segv_oact); sigaction (SIGBUS, &act, &bus_oact); allow_incremental_gc = 1; #endif /* USE_SIGACTION */ #ifdef USE_SIGNAL segv_oact = signal (SIGSEGV, (void (*)(int)) vdb_fault_handler); bus_oact = signal (SIGBUS, (void (*)(int)) vdb_fault_handler); #endif /* USE_SIGNAL */ } void vdb_protect (void *ptr, EMACS_INT len) { if (mprotect (ptr, len, PROT_READ)) { perror ("Couldn't mprotect"); ABORT (); } } void vdb_unprotect (void *ptr, EMACS_INT len) { if (mprotect (ptr, len, PROT_READ | PROT_WRITE)) { perror ("Couldn't mprotect"); ABORT (); } }
