aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorDaniel Colascione2019-01-15 17:36:54 -0500
committerDaniel Colascione2019-01-15 17:37:36 -0500
commitd12e5d003d503025c1c9b0335d6518a6c3bdfae1 (patch)
tree41829446caca2d488e723843046c4f5b8931d8f8 /src/buffer.c
parent2a3bd6798e9670828f0402079fcc116d6d6b042d (diff)
downloademacs-d12e5d003d503025c1c9b0335d6518a6c3bdfae1.tar.gz
emacs-d12e5d003d503025c1c9b0335d6518a6c3bdfae1.zip
Add portable dumper
Add a new portable dumper as an alternative to unexec. Use it by default. * src/dmpstruct.awk: New file. * src/doc.c (get_doc_string): use will_dump_p(). * src/editfns.c (styled_format): silence compiler warning with UNINIT. * src/emacs-module.c (syms_of_module): staticpro ltv_mark. * src/emacs.c (gflags): new variable. (init_cmdargs): unwrap (string_starts_with_p, find_argument, dump_error_to_string) (load_pdump): new functions. (main): detect pdumper and --temacs invocation; actually load portable dump when detected; set gflags as appropriate; changes to init functions throughout to avoid passing explicit 'initialized' argument. * src/eval.c (inhibit_lisp_code): remove unused variable. (init_eval_once_for_pdumper): new function. (init_eval_once): call it. * src/filelock.c: CANNOT_DUMP -> will_dump_p() * src/fingerprint-dummy.c: new file * src/fingerprint.h: new file * src/fns.c: CANNOT_DUMP -> will_dump_p(), etc. (weak_hash_tables): remove (hashfn_equal, hashfn_eql): un-staticify (make_hash_table): set new 'next_weak' hash table field; drop global weak_hash_tables logic. (copy_hash_table): drop global weak_hash_tables logic. (hash_table_rehash): new function. (hash_lookup, hash_put, hash_remove_from_table, hash_clear): rehash if needed. (sweep_weak_table): un-staticify; explain logic; bool-ify. (sweep_weak_hash_tables): remove function. * src/font.c (syms_of_font): remember pdumper stuff. * src/fontset.c (syms_of_fontset): remember pdumper stuff. * src/frame.c (make_initial_frame): don't reset Vframe_list. (init_frame_once_for_pdumper, init_frame_once): new functions. (syms_of_frame): remove redundant staticpro. * src/fringe.c (init_fringe_once_for_pdumper): new functin. (init_fringe_once): call it. * src/ftcrfont.c (syms_of_ftcrfont_for_pdumper): new function. (syms_of_ftcrfont): call it. * src/ftfont.c (syms_of_ftfont_for_pdumper): new function. (syms_of_ftfont): call it. * src/ftxont.c (syms_of_ftxfont_for_pdumper): new function. (syms_of_ftxfont): call it. * src/gmalloc.c: adjust for pdumper througout (DUMPED): remove weird custom dumped indicator. * src/gnutls.c (syms_of_gnutls): pdumper note for gnutls_global_initialized. * src/image.c (syms_of_image): add pdumper comment, initializer note. * src/insdel.c (prepare_to_modify_buffer_1): account for buffer contents possibly being in dump image. * src/keyboard.c (syms_of_keyboard_for_pdumper): new function. (syms_of_keyboard): staticpro more; call pdumper syms function. * src/lisp.h: add comments throughout (gflags): declare. (will_dump_p, will_bootstrap_p, will_dump_with_pdumper_p) (dumped_with_pdumper_p, will_dump_with_unexec_p) (dumped_with_unexec_p, definitely_will_not_unexec_p): new functions. (POWER_OF_2, ROUNDUP): move macros. (PSEUDOVECTOR_TYPE, PSEUDOVECTOR_TYPEP): take vectorlike header pointer instead of vector; constify. (Lisp_Hash_Table): add comment about need to rehash on access; add comment for next_weak. (HASH_KEY, HASH_VALUE, HASH_HASH, HASH_TABLE_SIZE): const-ify. (hash_table_rehash): declare. (hash_rehash_needed_p, hash_rehash_if_needed): new functions. (finalizers, doomed_finalizers): declare extern. (SUBR_SECTION_ATTRIBUTE): new macro. (staticvec, staticidx): un-static-ify. (sweep_weak_hash_tables): remove declaration. (sweep_weak_table): declare. (hashfn_eql, hashfn_equal): declare. (number_finalizers_run): new variable. (Vdead): externify when ENABLE_CHECKING. (gc_root_type): new enumeration. (gc_root_visitor): new struct. (visit_static_gc_roots): declare. (vectorlike_nbytes): declare. (vector_nbytes): define as trivial inline function wrapper for vectorlike_nbytes. (init_obarray_once): change signature. (primary_thread): extern-ify. (init_buffer): change signature. (init_frame_once): declare. * src/lread.c (readevalloop): adjust for new dumped predicates. (init_obarray_once): new function. (ndefsubr): new variable. (defsubr): increment it. (load_path_check): adjust for pdumper. (load_path_default): use pdumper functions; adjust for dump search. * src/macfont.m (macfont_init_font_change_handler): avoid shadowing global. (syms_of_macfont_for_pdumper): new function. (syms_of_macfont): call it. * src/menu.c (syms_of_menu): staticpro more stuff. * src/minibuf.c (Ftry_completion): rehash if needed. (init_minibuf_once_for_pdumper): new function. (init_minibuf_once): call it. * src/nsfont.m (syms_of_nsfns): staticpro more. * src/nsfont.m (syms_of_nsfont_for_pdumper): new function. (syms_of_nsfont): call it. * src/nsterm.m (syms_of_nsfont): remember pdumper stuff. * src/pdumper.c: new file. * src/pdumper.h: new file. * src/process.c (init_process_emacs): use new pdumper functions instead of CANNOT_DUMP. * src/profiler.c (syms_of_profiler_for_pdumper): new function. (syms_of_profiler_for_pdumper): call it. * src/search.c (syms_of_search_for_pdumper): new function. (syms_of_search_for_pdumper): call it. * src/sheap.c (bss_sbrk_did_unexec): remove. * src/sheap.h (bss_sbrk_did_unexec): remove. * src/syntax.c (syms_of_syntax): don't redundantly staticpro re_match_object. * src/sysdep.c: use will_dump_with_unexec_p() instead of bss hack thing. * src/syssignals.h (init_sigsegv): declare. * src/systime.h (init_timefns): remove bool from signature. * src/textprop.c (syms_of_textprop): move staticpro. * src/thread.c (main_thread_p): constify. * src/thread.h (main_thread_p): constify. * src/timefns.c (init_timefns): remove bool from signature. (syms_of_timefns_for_pdumper): new function. (syms_of_timefns): call it. * src/w32.c: rearrange code. * src/w32.h (w32_relocate): declare. * src/w32fns.c (syms_of_w32fns): add pdumper note. * src/w32font.c (syms_of_w32font_for_pdumper): new function. (syms_of_w32font): call it. * src/w32heap.c (using_dynamic_heap): new variable. (init_heap): use it. * src/w32menu.c (syms_of_w32menu): add pdumper note. * src/w32proc.c (ctrl_c_handler, mainCRTStartup, _start, open_input_file) (rva_to_section, close_file_data): move here. * src/w32uniscribe.c (syms_of_w32uniscribe_for_pdumper): new function. (syms_of_w32uniscribe): call it. * src/window.c (init_window_once_for_pdumper): new function. (init_window_once): call it; staticpro more stuff. * src/xfont.c (syms_of_xfont_for_pdumper): new function. (syms_of_xfont): call it. * src/xftfont.c (syms_of_xftfont_for_pdumper): new function. (syms_of_xftfont): call it. * src/xmenu.c (syms_of_xmenu_for_pdumper): new function. (syms_of_xmenu): call it. * src/xselect.c (syms_of_xselect_for_pdumper): new function. (syms_of_xselect): call it. * src/xsettings.c (syms_of_xsettings): add more pdumper notes. * src/term.c (syms_of_xterm): add pdumper note. * src/dispnew.c (init_faces_initial): new function. (init_display_interactive): rename from init_display; use will_dump_p instead of !initialized. Initialize faces early for pdumper if needed. (init_display): new function. (syms_of_display_for_pdumper): new function. (syms_of_display): call it. * src/dbusbind.c (syms_of_dbusbind): Add TODO for bus reset on pdumper load. * src/data.c (Fdefalias): Use will_dump_p instead of Vpurify_flag. (Fmake_variable_buffer_local): silence compiler warning with -Og by making valcontents UNINIT. (arith_driver): silence compiler warning with UNINIT. * src/conf_post.h (ATTRIBUTE_SECTION): new macro. * src/composite.c (composition_gstring_put_cache): rehash hash table if needed. * src/coding.c (init_coding_once, syms_of_coding): remember pdumper stuff. * src/charset.h (charset_table_size, charset_table_user): declare. * src/charset.c (charset_table_used, charset_table_size): un-static. (init_charset_oncem, syms_of_charset): remember pdumper stuff. * src/category.c (category_table_version): remove obsolete variable. * src/callint.c (syms_of_callint): staticpro 'preserved_fns' (init_callproc): use will_dump_p instead of !CANNOT_DUMP. * src/bytecode.c (exec_byte_code): rehash table tables if needed * src/buffer.c (alloc_buffer_text, free_buffer_text): account for pdumper (init_buffer_once): add TODO; remember stuff for pdumper. (init_buffer): don't take initialized argument; adjust for pdumper. * src/atimer.c (init_atimer): initialize subr only if !initialized. * src/alloc.c: (vector_marked_p, set_vector_marked) (vectorlike_marked_p, set_vectorlike_marked, cons_marked_p) (set_cons_marked, string_marked_p, set_string_marked) (symbol_marked_p, set_symbol_marked, interval_marked_p) (set_interval_marked): new accessor routines. Use them instead of raw GC access throughout. (Vdead): make non-static when ENABLE_CHECKING. (vectorlike_nbytes): rename of 'vector_nbytes'; take a vectorlike header as input instead of a vector. (number_finalizers_run): new internal C variable. (mark_maybe_object): check for pdumper objects. (valid_pointer_p): don't be gratuitously inefficient under rr(1). (make_pure_c_string): add support for size_byte = -2 mode indicating that string data points into Emacs image rodata. (visit_vectorlike_root): visits GC roots embedded in vectorlike objects. (visit_buffer_root): visits GC roots embedded in our totally-not-a-buffer buffer global objects. (visit_static_gc_roots): visit GC roots in the Emacs data section. (mark_object_root_visitor): root callback used for conventional GC marking (weak_hash_tables): new internal variable for tracking found weak hash tables during GC. (mark_and_sweep_weak_table_contents): new weak hash table marking. (garbage_collect_1): use new GC root visitor machinery. (mark_vectorlike): accept a vectorlike_header instead of a Lisp_Vector. (mark_frame, mark_window, mark_hash_table): new functions. (mark_object): initialize 'm'; check for pdumper objects and use new mark-bit accessors throughout. Remove some object-specific marking code and move to helper functions above. (survives_gc_p): check for pdumper objects. (gc-sweep): clear pdumper mark bits. (init_alloc_once_for_pdumper): new helper function for early init called both during normal init and pdumper load. (init_alloc_once): pdumper integration. * src/Makefile.in: Rewrite dumping for pdumper; add pdumper.o; invoke temacs with --temacs command line option; build dmpstruct.h from dmpstruct.awk; stop relying on CANNOT_DUMP; clean up pdumper intermediate files during build. * nextstep/Makefile.in: build emacs.pdmp into NS packages * lisp/startup.el: account for new '--temacs' and '--dump-file' command line option. * lisp/loadup.el: rewrite early init to account for pdumper; use injected 'dump-mode' variable (set via the new '--temacs' option) instead of parsing command line. * lisp/cus-start.el: Check 'dump-mode' instead of 'purify-flag', since the new 'dump-mode' * lib-src/make-fingerprint.c: new program * lib-src/Makefile.in: built make-fingerprint utility program * configure.ac: Add --with-pdumper toggle to control pdumper support; add --with-unexec toggle to control unexec support. Add --with-dumping option to control which dumping strategy we use by default. Adjust for pdumper throughout. Check for posix_madvise. * Makefile.in: Add @DUMPING@ substitution; add pdumper mode. * .gitignore: Add make-fingerprint, temacs.in, fingerprint.c, dmpstruct.h, and pdumper dump files.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c68
1 files changed, 52 insertions, 16 deletions
diff --git a/src/buffer.c b/src/buffer.c
index cc0899676de..a12c80ec0b0 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -44,6 +44,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
44#include "keymap.h" 44#include "keymap.h"
45#include "frame.h" 45#include "frame.h"
46#include "xwidget.h" 46#include "xwidget.h"
47#include "pdumper.h"
47 48
48#ifdef WINDOWSNT 49#ifdef WINDOWSNT
49#include "w32heap.h" /* for mmap_* */ 50#include "w32heap.h" /* for mmap_* */
@@ -529,6 +530,8 @@ even if it is dead. The return value is never nil. */)
529 /* No one shows us now. */ 530 /* No one shows us now. */
530 b->window_count = 0; 531 b->window_count = 0;
531 532
533 memset (&b->local_flags, 0, sizeof (b->local_flags));
534
532 BUF_GAP_SIZE (b) = 20; 535 BUF_GAP_SIZE (b) = 20;
533 block_input (); 536 block_input ();
534 /* We allocate extra 1-byte at the tail and keep it always '\0' for 537 /* We allocate extra 1-byte at the tail and keep it always '\0' for
@@ -781,6 +784,8 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
781 /* Always -1 for an indirect buffer. */ 784 /* Always -1 for an indirect buffer. */
782 b->window_count = -1; 785 b->window_count = -1;
783 786
787 memset (&b->local_flags, 0, sizeof (b->local_flags));
788
784 b->pt = b->base_buffer->pt; 789 b->pt = b->base_buffer->pt;
785 b->begv = b->base_buffer->begv; 790 b->begv = b->base_buffer->begv;
786 b->zv = b->base_buffer->zv; 791 b->zv = b->base_buffer->zv;
@@ -5001,24 +5006,37 @@ alloc_buffer_text (struct buffer *b, ptrdiff_t nbytes)
5001void 5006void
5002enlarge_buffer_text (struct buffer *b, ptrdiff_t delta) 5007enlarge_buffer_text (struct buffer *b, ptrdiff_t delta)
5003{ 5008{
5004 void *p;
5005 ptrdiff_t nbytes = (BUF_Z_BYTE (b) - BUF_BEG_BYTE (b) + BUF_GAP_SIZE (b) + 1
5006 + delta);
5007 block_input (); 5009 block_input ();
5010 void *p;
5011 unsigned char *old_beg = b->text->beg;
5012 ptrdiff_t old_nbytes =
5013 BUF_Z_BYTE (b) - BUF_BEG_BYTE (b) + BUF_GAP_SIZE (b) + 1;
5014 ptrdiff_t new_nbytes = old_nbytes + delta;
5015
5016 if (pdumper_object_p (old_beg))
5017 b->text->beg = NULL;
5018 else
5019 old_beg = NULL;
5020
5008#if defined USE_MMAP_FOR_BUFFERS 5021#if defined USE_MMAP_FOR_BUFFERS
5009 p = mmap_realloc ((void **) &b->text->beg, nbytes); 5022 p = mmap_realloc ((void **) &b->text->beg, new_nbytes);
5010#elif defined REL_ALLOC 5023#elif defined REL_ALLOC
5011 p = r_re_alloc ((void **) &b->text->beg, nbytes); 5024 p = r_re_alloc ((void **) &b->text->beg, new_nbytes);
5012#else 5025#else
5013 p = xrealloc (b->text->beg, nbytes); 5026 p = xrealloc (b->text->beg, new_nbytes);
5014#endif 5027#endif
5015 5028
5016 if (p == NULL) 5029 if (p == NULL)
5017 { 5030 {
5031 if (old_beg)
5032 b->text->beg = old_beg;
5018 unblock_input (); 5033 unblock_input ();
5019 memory_full (nbytes); 5034 memory_full (new_nbytes);
5020 } 5035 }
5021 5036
5037 if (old_beg)
5038 memcpy (p, old_beg, min (old_nbytes, new_nbytes));
5039
5022 BUF_BEG_ADDR (b) = p; 5040 BUF_BEG_ADDR (b) = p;
5023 unblock_input (); 5041 unblock_input ();
5024} 5042}
@@ -5031,13 +5049,16 @@ free_buffer_text (struct buffer *b)
5031{ 5049{
5032 block_input (); 5050 block_input ();
5033 5051
5052 if (!pdumper_object_p (b->text->beg))
5053 {
5034#if defined USE_MMAP_FOR_BUFFERS 5054#if defined USE_MMAP_FOR_BUFFERS
5035 mmap_free ((void **) &b->text->beg); 5055 mmap_free ((void **) &b->text->beg);
5036#elif defined REL_ALLOC 5056#elif defined REL_ALLOC
5037 r_alloc_free ((void **) &b->text->beg); 5057 r_alloc_free ((void **) &b->text->beg);
5038#else 5058#else
5039 xfree (b->text->beg); 5059 xfree (b->text->beg);
5040#endif 5060#endif
5061 }
5041 5062
5042 BUF_BEG_ADDR (b) = NULL; 5063 BUF_BEG_ADDR (b) = NULL;
5043 unblock_input (); 5064 unblock_input ();
@@ -5048,14 +5069,25 @@ free_buffer_text (struct buffer *b)
5048/*********************************************************************** 5069/***********************************************************************
5049 Initialization 5070 Initialization
5050 ***********************************************************************/ 5071 ***********************************************************************/
5051
5052void 5072void
5053init_buffer_once (void) 5073init_buffer_once (void)
5054{ 5074{
5075 /* TODO: clean up the buffer-local machinery. Right now,
5076 we have:
5077
5078 buffer_defaults: default values of buffer-locals
5079 buffer_local_flags: metadata
5080 buffer_permanent_local_flags: metadata
5081 buffer_local_symbols: metadata
5082
5083 There must be a simpler way to store the metadata.
5084 */
5085
5055 int idx; 5086 int idx;
5056 5087
5057 /* Items flagged permanent get an explicit permanent-local property 5088 /* Items flagged permanent get an explicit permanent-local property
5058 added in bindings.el, for clarity. */ 5089 added in bindings.el, for clarity. */
5090 PDUMPER_REMEMBER_SCALAR (buffer_permanent_local_flags);
5059 memset (buffer_permanent_local_flags, 0, sizeof buffer_permanent_local_flags); 5091 memset (buffer_permanent_local_flags, 0, sizeof buffer_permanent_local_flags);
5060 5092
5061 /* 0 means not a lisp var, -1 means always local, else mask. */ 5093 /* 0 means not a lisp var, -1 means always local, else mask. */
@@ -5144,10 +5176,15 @@ init_buffer_once (void)
5144 XSETFASTINT (BVAR (&buffer_local_flags, extra_line_spacing), idx); ++idx; 5176 XSETFASTINT (BVAR (&buffer_local_flags, extra_line_spacing), idx); ++idx;
5145 XSETFASTINT (BVAR (&buffer_local_flags, cursor_in_non_selected_windows), idx); ++idx; 5177 XSETFASTINT (BVAR (&buffer_local_flags, cursor_in_non_selected_windows), idx); ++idx;
5146 5178
5179 /* buffer_local_flags contains no pointers, so it's safe to treat it
5180 as a blob for pdumper. */
5181 PDUMPER_REMEMBER_SCALAR (buffer_local_flags);
5182
5147 /* Need more room? */ 5183 /* Need more room? */
5148 if (idx >= MAX_PER_BUFFER_VARS) 5184 if (idx >= MAX_PER_BUFFER_VARS)
5149 emacs_abort (); 5185 emacs_abort ();
5150 last_per_buffer_idx = idx; 5186 last_per_buffer_idx = idx;
5187 PDUMPER_REMEMBER_SCALAR (last_per_buffer_idx);
5151 5188
5152 /* Make sure all markable slots in buffer_defaults 5189 /* Make sure all markable slots in buffer_defaults
5153 are initialized reasonably, so mark_buffer won't choke. */ 5190 are initialized reasonably, so mark_buffer won't choke. */
@@ -5242,7 +5279,9 @@ init_buffer_once (void)
5242 5279
5243 Vbuffer_alist = Qnil; 5280 Vbuffer_alist = Qnil;
5244 current_buffer = 0; 5281 current_buffer = 0;
5282 pdumper_remember_lv_ptr_raw (&current_buffer, Lisp_Vectorlike);
5245 all_buffers = 0; 5283 all_buffers = 0;
5284 pdumper_remember_lv_ptr_raw (&all_buffers, Lisp_Vectorlike);
5246 5285
5247 QSFundamental = build_pure_c_string ("Fundamental"); 5286 QSFundamental = build_pure_c_string ("Fundamental");
5248 5287
@@ -5266,12 +5305,12 @@ init_buffer_once (void)
5266} 5305}
5267 5306
5268void 5307void
5269init_buffer (int initialized) 5308init_buffer (void)
5270{ 5309{
5271 Lisp_Object temp; 5310 Lisp_Object temp;
5272 5311
5273#ifdef USE_MMAP_FOR_BUFFERS 5312#ifdef USE_MMAP_FOR_BUFFERS
5274 if (initialized) 5313 if (dumped_with_unexec_p ())
5275 { 5314 {
5276 struct buffer *b; 5315 struct buffer *b;
5277 5316
@@ -5312,9 +5351,6 @@ init_buffer (int initialized)
5312 eassert (b->text->beg != NULL); 5351 eassert (b->text->beg != NULL);
5313 } 5352 }
5314 } 5353 }
5315#else /* not USE_MMAP_FOR_BUFFERS */
5316 /* Avoid compiler warnings. */
5317 (void) initialized;
5318#endif /* USE_MMAP_FOR_BUFFERS */ 5354#endif /* USE_MMAP_FOR_BUFFERS */
5319 5355
5320 AUTO_STRING (scratch, "*scratch*"); 5356 AUTO_STRING (scratch, "*scratch*");