comparison src/lisp.h @ 5157:1fae11d56ad2

redo memory-usage mechanism, add way of dynamically initializing Lisp objects -------------------- ChangeLog entries follow: -------------------- lisp/ChangeLog addition: 2010-03-18 Ben Wing <ben@xemacs.org> * diagnose.el (show-memory-usage): Rewrite to take into account API changes in memory-usage functions. src/ChangeLog addition: 2010-03-18 Ben Wing <ben@xemacs.org> * alloc.c: * alloc.c (disksave_object_finalization_1): * alloc.c (lisp_object_storage_size): * alloc.c (listu): * alloc.c (listn): * alloc.c (Fobject_memory_usage_stats): * alloc.c (compute_memusage_stats_length): * alloc.c (Fobject_memory_usage): * alloc.c (Ftotal_object_memory_usage): * alloc.c (malloced_storage_size): * alloc.c (common_init_alloc_early): * alloc.c (reinit_alloc_objects_early): * alloc.c (reinit_alloc_early): * alloc.c (init_alloc_once_early): * alloc.c (syms_of_alloc): * alloc.c (reinit_vars_of_alloc): * buffer.c: * buffer.c (struct buffer_stats): * buffer.c (compute_buffer_text_usage): * buffer.c (compute_buffer_usage): * buffer.c (buffer_memory_usage): * buffer.c (buffer_objects_create): * buffer.c (syms_of_buffer): * buffer.c (vars_of_buffer): * console-impl.h (struct console_methods): * dynarr.c (Dynarr_memory_usage): * emacs.c (main_1): * events.c (clear_event_resource): * extents.c: * extents.c (compute_buffer_extent_usage): * extents.c (extent_objects_create): * extents.h: * faces.c: * faces.c (compute_face_cachel_usage): * faces.c (face_objects_create): * faces.h: * general-slots.h: * glyphs.c: * glyphs.c (compute_glyph_cachel_usage): * glyphs.c (glyph_objects_create): * glyphs.h: * lisp.h: * lisp.h (struct usage_stats): * lrecord.h: * lrecord.h (enum lrecord_type): * lrecord.h (struct lrecord_implementation): * lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE): * lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_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_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_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_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT): * lrecord.h (MAKE_MODULE_LISP_OBJECT): * lrecord.h (INIT_LISP_OBJECT): * lrecord.h (INIT_MODULE_LISP_OBJECT): * lrecord.h (UNDEF_LISP_OBJECT): * lrecord.h (UNDEF_MODULE_LISP_OBJECT): * lrecord.h (DECLARE_LISP_OBJECT): * lrecord.h (DECLARE_MODULE_API_LISP_OBJECT): * lrecord.h (DECLARE_MODULE_LISP_OBJECT): * lstream.c: * lstream.c (syms_of_lstream): * lstream.c (vars_of_lstream): * marker.c: * marker.c (compute_buffer_marker_usage): * mc-alloc.c (mc_alloced_storage_size): * mc-alloc.h: * mule-charset.c: * mule-charset.c (struct charset_stats): * mule-charset.c (compute_charset_usage): * mule-charset.c (charset_memory_usage): * mule-charset.c (mule_charset_objects_create): * mule-charset.c (syms_of_mule_charset): * mule-charset.c (vars_of_mule_charset): * redisplay.c: * redisplay.c (compute_rune_dynarr_usage): * redisplay.c (compute_display_block_dynarr_usage): * redisplay.c (compute_glyph_block_dynarr_usage): * redisplay.c (compute_display_line_dynarr_usage): * redisplay.c (compute_line_start_cache_dynarr_usage): * redisplay.h: * scrollbar-gtk.c (gtk_compute_scrollbar_instance_usage): * scrollbar-msw.c (mswindows_compute_scrollbar_instance_usage): * scrollbar-x.c (x_compute_scrollbar_instance_usage): * scrollbar.c (compute_scrollbar_instance_usage): * scrollbar.h: * symbols.c: * symbols.c (reinit_symbol_objects_early): * symbols.c (init_symbols_once_early): * symbols.c (reinit_symbols_early): * symbols.c (defsymbol_massage_name_1): * symsinit.h: * ui-gtk.c: * ui-gtk.c (emacs_gtk_object_getprop): * ui-gtk.c (emacs_gtk_object_putprop): * ui-gtk.c (ui_gtk_objects_create): * unicode.c (compute_from_unicode_table_size_1): * unicode.c (compute_to_unicode_table_size_1): * unicode.c (compute_from_unicode_table_size): * unicode.c (compute_to_unicode_table_size): * window.c: * window.c (struct window_stats): * window.c (compute_window_mirror_usage): * window.c (compute_window_usage): * window.c (window_memory_usage): * window.c (window_objects_create): * window.c (syms_of_window): * window.c (vars_of_window): * window.h: Redo memory-usage mechanism, make it general; add way of dynamically initializing Lisp object types -- OBJECT_HAS_METHOD(), similar to CONSOLE_HAS_METHOD(). (1) Create OBJECT_HAS_METHOD(), OBJECT_HAS_PROPERTY() etc. for specifying that a Lisp object type has a particular method or property. Call such methods with OBJECT_METH, MAYBE_OBJECT_METH, OBJECT_METH_OR_GIVEN; retrieve properties with OBJECT_PROPERTY. Methods that formerly required a DEFINE_*GENERAL_LISP_OBJECT() to specify them (getprop, putprop, remprop, plist, disksave) now instead use the dynamic-method mechanism. The main benefit of this is that new methods or properties can be added without requiring that the declaration statements of all existing methods be modified. We have to make the `struct lrecord_implementation' non-const, but I don't think this should have any effect on speed -- the only possible method that's really speed-critical is the mark method, and we already extract those out into a separate (non-const) array for increased cache locality. Object methods need to be reinitialized after pdump, so we put them in separate functions such as face_objects_create(), extent_objects_create() and call them appropriately from emacs.c The only current object property (`memusage_stats_list') that objects can specify is a Lisp object and gets staticpro()ed so it only needs to be set during dump time, but because it references symbols that might not exist in a syms_of_() function, we initialize it in vars_of_(). There is also an object property (`num_extra_memusage_stats') that is automatically initialized based on `memusage_stats_list'; we do that in reinit_vars_of_alloc(), which is called after all vars_of_() functions are called. `disksaver' method was renamed `disksave' to correspond with the name normally given to the function (e.g. disksave_lstream()). (2) Generalize the memory-usage mechanism in `buffer-memory-usage', `window-memory-usage', `charset-memory-usage' into an object-type- specific mechanism called by a single function `object-memory-usage'. (Former function `object-memory-usage' renamed to `total-object-memory-usage'). Generalize the mechanism of different "slices" so that we can have different "classes" of memory described and different "slices" onto each class; `t' separates classes, `nil' separates slices. Currently we have three classes defined: the memory of an object itself, non-Lisp-object memory associated with the object (e.g. arrays or dynarrs stored as fields in the object), and Lisp-object memory associated with the object (other internal Lisp objects stored in the object). This isn't completely finished yet and we might need to further separate the "other internal Lisp objects" class into two classes. The memory-usage mechanism uses a `struct usage_stats' (renamed from `struct overhead_stats') to describe a malloc-view onto a set of allocated memory (listing how much was requested and various types of overhead) and a more general `struct generic_usage_stats' (with a `struct usage_stats' in it) to hold all statistics about object memory. `struct generic_usage_stats' contains an array of 32 Bytecounts, which are statistics of unspecified semantics. The intention is that individual types declare a corresponding struct (e.g. `struct window_stats') with the same structure but with specific fields in place of the array, corresponding to specific statistics. The number of such statistics is an object property computed from the list of tags (Lisp symbols describing the statistics) stored in `memusage_stats_list'. The idea here is to allow particular object types to customize the number and semantics of the statistics where completely avoiding consing. This doesn't matter so much yet, but the intention is to have the memory usage of all objects computed at the end of GC, at the same time as other statistics are currently computed. The values for all statistics for a single type would be added up to compute aggregate values for all objects of a specific type. To make this efficient, we can't allow any memory allocation at all. (3) Create some additional functions for creating lists that specify the elements directly as args rather than indirectly through an array: listn() (number of args given), listu() (list terminated by Qunbound). (4) Delete a bit of remaining unused C window_config stuff, also unused lrecord_type_popup_data.
author Ben Wing <ben@xemacs.org>
date Thu, 18 Mar 2010 10:50:06 -0500
parents 88bd4f3ef8e4
children 9e0b43d3095c
comparison
equal deleted inserted replaced
5156:6bff4f219697 5157:1fae11d56ad2
1611 1611
1612 Functions that accept a structure of this sort do not initialize 1612 Functions that accept a structure of this sort do not initialize
1613 the fields to 0, and add any existing values to whatever was there 1613 the fields to 0, and add any existing values to whatever was there
1614 before; this way, you can get a cumulative effect. */ 1614 before; this way, you can get a cumulative effect. */
1615 1615
1616 struct overhead_stats 1616 struct usage_stats
1617 { 1617 {
1618 int was_requested; 1618 Bytecount was_requested;
1619 int malloc_overhead; 1619 Bytecount malloc_overhead;
1620 int dynarr_overhead; 1620 Bytecount dynarr_overhead;
1621 int gap_overhead; 1621 Bytecount gap_overhead;
1622 };
1623
1624 struct generic_usage_stats
1625 {
1626 struct usage_stats u;
1627 Bytecount othervals[32];
1622 }; 1628 };
1623 1629
1624 #endif /* MEMORY_USAGE_STATS */ 1630 #endif /* MEMORY_USAGE_STATS */
1625 1631
1626 1632
2173 2179
2174 /* Reset the dynarr's length to 0. */ 2180 /* Reset the dynarr's length to 0. */
2175 #define Dynarr_reset(d) Dynarr_set_lengthr (d, 0) 2181 #define Dynarr_reset(d) Dynarr_set_lengthr (d, 0)
2176 2182
2177 #ifdef MEMORY_USAGE_STATS 2183 #ifdef MEMORY_USAGE_STATS
2178 struct overhead_stats; 2184 struct usage_stats;
2179 Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats); 2185 Bytecount Dynarr_memory_usage (void *d, struct usage_stats *stats);
2180 #endif 2186 #endif
2181 2187
2182 /************* Adding/deleting elements to/from a dynarr *************/ 2188 /************* Adding/deleting elements to/from a dynarr *************/
2183 2189
2184 /* Set the Lisp implementation of the element at POS in dynarr D. Only 2190 /* Set the Lisp implementation of the element at POS in dynarr D. Only
4777 MODULE_API Lisp_Object list1 (Lisp_Object); 4783 MODULE_API Lisp_Object list1 (Lisp_Object);
4778 MODULE_API Lisp_Object list2 (Lisp_Object, Lisp_Object); 4784 MODULE_API Lisp_Object list2 (Lisp_Object, Lisp_Object);
4779 MODULE_API Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object); 4785 MODULE_API Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object);
4780 MODULE_API Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, 4786 MODULE_API Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object,
4781 Lisp_Object); 4787 Lisp_Object);
4782 MODULE_API Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 4788 MODULE_API Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object,
4783 Lisp_Object);
4784 MODULE_API Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
4785 Lisp_Object, Lisp_Object); 4789 Lisp_Object, Lisp_Object);
4790 MODULE_API Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object,
4791 Lisp_Object, Lisp_Object, Lisp_Object);
4792 MODULE_API Lisp_Object listn (int numargs, ...);
4793 MODULE_API Lisp_Object listu (Lisp_Object, ...);
4786 DECLARE_DOESNT_RETURN (memory_full (void)); 4794 DECLARE_DOESNT_RETURN (memory_full (void));
4787 void disksave_object_finalization (void); 4795 void disksave_object_finalization (void);
4788 extern int purify_flag; 4796 extern int purify_flag;
4789 #ifndef NEW_GC 4797 #ifndef NEW_GC
4790 extern EMACS_INT gc_generation_number[1]; 4798 extern EMACS_INT gc_generation_number[1];
4829 extern int need_to_signal_post_gc; 4837 extern int need_to_signal_post_gc;
4830 extern Lisp_Object Qpost_gc_hook, Qgarbage_collecting; 4838 extern Lisp_Object Qpost_gc_hook, Qgarbage_collecting;
4831 void recompute_funcall_allocation_flag (void); 4839 void recompute_funcall_allocation_flag (void);
4832 4840
4833 #ifdef MEMORY_USAGE_STATS 4841 #ifdef MEMORY_USAGE_STATS
4834 Bytecount malloced_storage_size (void *, Bytecount, struct overhead_stats *); 4842 Bytecount malloced_storage_size (void *, Bytecount, struct usage_stats *);
4835 Bytecount fixed_type_block_overhead (Bytecount); 4843 Bytecount fixed_type_block_overhead (Bytecount);
4836 #endif 4844 #endif
4837 4845
4838 #ifdef EVENT_DATA_AS_OBJECTS 4846 #ifdef EVENT_DATA_AS_OBJECTS
4839 Lisp_Object make_key_data (void); 4847 Lisp_Object make_key_data (void);
5924 void set_marker_position (Lisp_Object, Charbpos); 5932 void set_marker_position (Lisp_Object, Charbpos);
5925 void unchain_marker (Lisp_Object); 5933 void unchain_marker (Lisp_Object);
5926 Lisp_Object noseeum_copy_marker (Lisp_Object, Lisp_Object); 5934 Lisp_Object noseeum_copy_marker (Lisp_Object, Lisp_Object);
5927 Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object); 5935 Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object);
5928 #ifdef MEMORY_USAGE_STATS 5936 #ifdef MEMORY_USAGE_STATS
5929 int compute_buffer_marker_usage (struct buffer *, struct overhead_stats *); 5937 int compute_buffer_marker_usage (struct buffer *, struct usage_stats *);
5930 #endif 5938 #endif
5931 void init_buffer_markers (struct buffer *b); 5939 void init_buffer_markers (struct buffer *b);
5932 void uninit_buffer_markers (struct buffer *b); 5940 void uninit_buffer_markers (struct buffer *b);
5933 5941
5934 /* Defined in menubar.c */ 5942 /* Defined in menubar.c */
6599 void recalculate_unicode_precedence (void); 6607 void recalculate_unicode_precedence (void);
6600 extern Lisp_Object Qunicode; 6608 extern Lisp_Object Qunicode;
6601 extern Lisp_Object Qutf_16, Qutf_8, Qucs_4, Qutf_7, Qutf_32; 6609 extern Lisp_Object Qutf_16, Qutf_8, Qucs_4, Qutf_7, Qutf_32;
6602 #ifdef MEMORY_USAGE_STATS 6610 #ifdef MEMORY_USAGE_STATS
6603 Bytecount compute_from_unicode_table_size (Lisp_Object charset, 6611 Bytecount compute_from_unicode_table_size (Lisp_Object charset,
6604 struct overhead_stats *stats); 6612 struct usage_stats *stats);
6605 Bytecount compute_to_unicode_table_size (Lisp_Object charset, 6613 Bytecount compute_to_unicode_table_size (Lisp_Object charset,
6606 struct overhead_stats *stats); 6614 struct usage_stats *stats);
6607 #endif /* MEMORY_USAGE_STATS */ 6615 #endif /* MEMORY_USAGE_STATS */
6608 6616
6609 /* Defined in undo.c */ 6617 /* Defined in undo.c */
6610 EXFUN (Fundo_boundary, 0); 6618 EXFUN (Fundo_boundary, 0);
6611 6619