comparison src/lstream.c @ 5124:623d57b7fbe8 ben-lisp-object

separate regular and disksave finalization, print method fixes. Create separate disksave method and make the finalize method only be for actual object finalization, not disksave finalization. Fix places where 0 was given in place of a printer -- print methods are mandatory, and internal objects formerly without a print method now must explicitly specify internal_object_printer(). Change the defn of CONSOLE_LIVE_P to avoid problems in some weird situations. -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2010-01-20 Ben Wing <ben@xemacs.org> * alloc.c: * alloc.c (very_old_free_lcrecord): * alloc.c (disksave_object_finalization_1): * alloc.c (make_lcrecord_list): * alloc.c (alloc_managed_lcrecord): * alloc.c (free_managed_lcrecord): * alloc.c (sweep_lcrecords_1): * buffer.c: * bytecode.c: * bytecode.c (Fcompiled_function_p): * chartab.c: * console-impl.h: * console-impl.h (CONSOLE_TYPE_P): * console.c: * console.c (set_quit_events): * data.c: * data.c (Fmake_ephemeron): * database.c: * database.c (finalize_database): * database.c (Fclose_database): * device-msw.c: * device-msw.c (finalize_devmode): * device-msw.c (allocate_devmode): * device.c: * elhash.c: * elhash.c (finalize_hash_table): * eval.c: * eval.c (bind_multiple_value_limits): * event-stream.c: * event-stream.c (finalize_command_builder): * events.c: * events.c (mark_event): * extents.c: * extents.c (finalize_extent_info): * extents.c (uninit_buffer_extents): * faces.c: * file-coding.c: * file-coding.c (finalize_coding_system): * file-coding.h: * file-coding.h (struct coding_system_methods): * file-coding.h (struct detector): * floatfns.c: * floatfns.c (extract_float): * fns.c: * fns.c (Fidentity): * font-mgr.c (finalize_fc_pattern): * font-mgr.c (finalize_fc_config): * frame.c: * glyphs.c: * glyphs.c (finalize_image_instance): * glyphs.c (unmap_subwindow_instance_cache_mapper): * gui.c: * gui.c (gui_error): * keymap.c: * lisp.h (struct Lisp_Symbol): * lrecord.h: * lrecord.h (struct lrecord_implementation): * lrecord.h (MC_ALLOC_CALL_FINALIZER): * lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE): * lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_INTERNAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT): * lrecord.h (MAKE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_MODULE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT): * lrecord.h (MAKE_MODULE_LISP_OBJECT): * lstream.c: * lstream.c (finalize_lstream): * lstream.c (disksave_lstream): * marker.c: * marker.c (finalize_marker): * mule-charset.c (make_charset): * number.c: * objects.c: * objects.c (finalize_color_instance): * objects.c (finalize_font_instance): * opaque.c: * opaque.c (make_opaque_ptr): * process-nt.c: * process-nt.c (nt_finalize_process_data): * process-nt.c (nt_deactivate_process): * process.c: * process.c (finalize_process): * procimpl.h (struct process_methods): * scrollbar.c: * scrollbar.c (free_scrollbar_instance): * specifier.c (finalize_specifier): * symbols.c: * toolbar.c: * toolbar.c (Ftoolbar_button_p): * tooltalk.c: * ui-gtk.c: * ui-gtk.c (emacs_gtk_object_finalizer): * ui-gtk.c (allocate_emacs_gtk_boxed_data): * window.c: * window.c (finalize_window): * window.c (mark_window_as_deleted): Separate out regular and disksave finalization. Instead of a FOR_DISKSAVE argument to the finalizer, create a separate object method `disksaver'. Make `finalizer' have only one argument. Go through and separate out all finalize methods into finalize and disksave. Delete lots of thereby redundant disksave checking. Delete places that signal an error if we attempt to disksave -- all of these objects are non-dumpable and we will get an error from pdump anyway if we attempt to dump them. After this is done, only one object remains that has a disksave method -- lstream. Change DEFINE_*_LISP_OBJECT_WITH_PROPS to DEFINE_*_GENERAL_LISP_OBJECT, which is used for specifying either property methods or disksave methods (or in the future, any other less-used methods). Remove the for_disksave argument to finalize_process_data. Don't provide a disksaver for processes because no one currently needs it. Clean up various places where objects didn't provide a print method. It was made mandatory in previous changes, and all methods now either provide their own print method or use internal_object_printer or external_object_printer. Change the definition of CONSOLE_LIVE_P to use the contype enum rather than looking into the conmeths structure -- in some weird situations with dead objects, the conmeths structure is NULL, and printing such objects from debug_print() will crash if we try to look into the conmeths structure.
author Ben Wing <ben@xemacs.org>
date Wed, 20 Jan 2010 07:05:57 -0600
parents e0db3c197671
children b5df3737028a
comparison
equal deleted inserted replaced
5123:fc85923c49af 5124:623d57b7fbe8
1 /* Generic stream implementation. 1 /* Generic stream implementation.
2 Copyright (C) 1995 Free Software Foundation, Inc. 2 Copyright (C) 1995 Free Software Foundation, Inc.
3 Copyright (C) 1995 Sun Microsystems, Inc. 3 Copyright (C) 1995 Sun Microsystems, Inc.
4 Copyright (C) 1996, 2001, 2002 Ben Wing. 4 Copyright (C) 1996, 2001, 2002, 2010 Ben Wing.
5 5
6 This file is part of XEmacs. 6 This file is part of XEmacs.
7 7
8 XEmacs is free software; you can redistribute it and/or modify it 8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the 9 under the terms of the GNU General Public License as published by the
67 "#<INTERNAL OBJECT (XEmacs bug?) (%s lstream) 0x%lx>", 67 "#<INTERNAL OBJECT (XEmacs bug?) (%s lstream) 0x%lx>",
68 lstr->imp->name, (long) lstr); 68 lstr->imp->name, (long) lstr);
69 } 69 }
70 70
71 static void 71 static void
72 finalize_lstream (void *header, int for_disksave) 72 finalize_lstream (void *header)
73 { 73 {
74 /* WARNING WARNING WARNING. This function (and all finalize functions) 74 /* WARNING WARNING WARNING. This function (and all finalize functions)
75 may get called more than once on the same object, and may get called 75 may get called more than once on the same object. */
76 (at dump time) on objects that are not being released. */
77 Lstream *lstr = (Lstream *) header; 76 Lstream *lstr = (Lstream *) header;
78 77
78 if (lstr->flags & LSTREAM_FL_IS_OPEN)
79 Lstream_close (lstr);
80
81 if (lstr->imp->finalizer)
82 (lstr->imp->finalizer) (lstr);
83 }
84
85 static void
86 disksave_lstream (Lisp_Object lstream)
87 {
88 Lstream *lstr = XLSTREAM (lstream);
89
79 #if 0 /* this may cause weird Broken Pipes? */ 90 #if 0 /* this may cause weird Broken Pipes? */
80 if (for_disksave) 91 Lstream_pseudo_close (lstr);
81 { 92 return;
82 Lstream_pseudo_close (lstr);
83 return;
84 }
85 #endif 93 #endif
86 if (lstr->flags & LSTREAM_FL_IS_OPEN) 94 if ((lstr->flags & LSTREAM_FL_IS_OPEN) &&
87 { 95 (lstr->flags & LSTREAM_FL_CLOSE_AT_DISKSAVE))
88 if (for_disksave) 96 Lstream_close (lstr);
89 {
90 if (lstr->flags & LSTREAM_FL_CLOSE_AT_DISKSAVE)
91 Lstream_close (lstr);
92 }
93 else
94 /* Just close. */
95 Lstream_close (lstr);
96 }
97
98 if (!for_disksave)
99 {
100 if (lstr->imp->finalizer)
101 (lstr->imp->finalizer) (lstr);
102 }
103 } 97 }
104 98
105 inline static Bytecount 99 inline static Bytecount
106 aligned_sizeof_lstream (Bytecount lstream_type_specific_size) 100 aligned_sizeof_lstream (Bytecount lstream_type_specific_size)
107 { 101 {
148 142
149 const struct sized_memory_description lstream_empty_extra_description = { 143 const struct sized_memory_description lstream_empty_extra_description = {
150 0, lstream_empty_extra_description_1 144 0, lstream_empty_extra_description_1
151 }; 145 };
152 146
153 DEFINE_NODUMP_SIZABLE_LISP_OBJECT ("stream", lstream, 147 DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT ("stream", lstream,
154 mark_lstream, print_lstream, 148 mark_lstream, print_lstream,
155 finalize_lstream, 0, 0, 149 finalize_lstream,
156 lstream_description, 150 0, 0, /* no equal or hash */
157 sizeof_lstream, Lstream); 151 lstream_description,
152 0, 0, 0, 0, /* no property meths */
153 disksave_lstream,
154 sizeof_lstream, Lstream);
158 155
159 156
160 /* Change the buffering of a stream. See lstream.h. By default the 157 /* Change the buffering of a stream. See lstream.h. By default the
161 buffering is STREAM_BLOCK_BUFFERED. */ 158 buffering is STREAM_BLOCK_BUFFERED. */
162 159