diff src/alloc.c @ 5158:9e0b43d3095c

more cleanups to object-memory-usage stuff -------------------- ChangeLog entries follow: -------------------- lisp/ChangeLog addition: 2010-03-19 Ben Wing <ben@xemacs.org> * diagnose.el (show-object-memory-usage-stats): Rewrite to take into account non-lisp-storage statistics returned by garbage-collect-1 and friends. src/ChangeLog addition: 2010-03-19 Ben Wing <ben@xemacs.org> * alloc.c: * alloc.c (struct): * alloc.c (tick_lrecord_stats): * alloc.c (gc_sweep_1): * alloc.c (finish_object_memory_usage_stats): * alloc.c (object_memory_usage_stats): * alloc.c (compute_memusage_stats_length): Call new memory-usage mechanism at sweep time to compute extra memory utilization for all objects. Add up the values element-by- element to get an aggregrate set of statistics, where each is the sum of the values of a single statistic across different objects of the same type. At end of sweep time, call finish_object_memory_usage_stats() to add up all the aggreggrate stats that are related to non-Lisp memory storage to compute a single value, and add it to the list of values returned by `garbage-collect' and `object-memory-usage-stats'. * buffer.c (compute_buffer_text_usage): Don't crash on buffers without text (killed buffers?) and don't double-count indirect buffers. * elhash.c: * elhash.c (hash_table_objects_create): * elhash.c (vars_of_elhash): * symsinit.h: Add memory-usage method to count the size of `hentries'. * emacs.c (main_1): Call new functions in elhash.c, frame.c at init. * frame.c: * frame.c (compute_frame_usage): * frame.c (frame_memory_usage): * frame.c (frame_objects_create): * symsinit.h: Add memory-usage method to count gutter display structures, subwindow exposures. * gc.c (gc_finish): * lisp.h: Declare finish_object_memory_usage_stats(), call it in gc_finish(). * lrecord.h (struct lrecord_implementation): * lrecord.h (INIT_MEMORY_USAGE_STATS): New value in implementation struct to track number of non-Lisp-memory statistics. Computed in alloc.c.
author Ben Wing <ben@xemacs.org>
date Fri, 19 Mar 2010 14:47:44 -0500
parents 1fae11d56ad2
children cb303ff63e76
line wrap: on
line diff
--- a/src/alloc.c	Thu Mar 18 10:50:06 2010 -0500
+++ b/src/alloc.c	Fri Mar 19 14:47:44 2010 -0500
@@ -3624,6 +3624,10 @@
   int bytes_freed;
   int instances_on_free_list;
   int bytes_on_free_list;
+#ifdef MEMORY_USAGE_STATS
+  Bytecount nonlisp_bytes_in_use;
+  struct generic_usage_stats stats;
+#endif
 } lrecord_stats [countof (lrecord_implementations_table)];
 
 void
@@ -3638,6 +3642,22 @@
     case ALLOC_IN_USE:
       lrecord_stats[type_index].instances_in_use++;
       lrecord_stats[type_index].bytes_in_use += sz;
+#ifdef MEMORY_USAGE_STATS
+      {
+	struct generic_usage_stats stats;
+	Lisp_Object obj = wrap_pointer_1 (h);
+	if (HAS_OBJECT_METH_P (obj, memory_usage))
+	  {
+	    int i;
+	    int total_stats = OBJECT_PROPERTY (obj, num_extra_memusage_stats);
+	    xzero (stats);
+	    OBJECT_METH (obj, memory_usage, (obj, &stats));
+	    for (i = 0; i < total_stats; i++)
+	      lrecord_stats[type_index].stats.othervals[i] +=
+		stats.othervals[i];
+	  }
+      }
+#endif
       break;
     case ALLOC_FREE:
       lrecord_stats[type_index].instances_freed++;
@@ -4517,9 +4537,7 @@
   sweep_eval_data ();
   sweep_misc_user_data ();
 #endif /* EVENT_DATA_AS_OBJECTS */
-#endif /* not NEW_GC */
-
-#ifndef NEW_GC
+
 #ifdef PDUMP
   pdump_objects_unmark ();
 #endif
@@ -4659,6 +4677,25 @@
   strcat (buf, suffix);
 }
 
+void
+finish_object_memory_usage_stats (void)
+{
+#ifdef MEMORY_USAGE_STATS
+  int i;
+  for (i = 0; i < countof (lrecord_implementations_table); i++)
+    {
+      struct lrecord_implementation *imp = lrecord_implementations_table[i];
+      if (imp && imp->num_extra_nonlisp_memusage_stats)
+	{
+	  int j;
+	  for (j = 0; j < imp->num_extra_nonlisp_memusage_stats; j++)
+	    lrecord_stats[i].nonlisp_bytes_in_use +=
+	      lrecord_stats[i].stats.othervals[j];
+	}
+    }
+#endif /* MEMORY_USAGE_STATS */
+}
+
 static Lisp_Object
 object_memory_usage_stats (int set_total_gc_usage)
 {
@@ -4667,7 +4704,6 @@
   EMACS_INT tgu_val = 0;
 
 #ifdef NEW_GC
-  
   for (i = 0; i < countof (lrecord_implementations_table); i++)
     {
       if (lrecord_stats[i].instances_in_use != 0)
@@ -4742,6 +4778,13 @@
           sprintf (buf, "%s-storage", name);
           pl = gc_plist_hack (buf, lrecord_stats[i].bytes_in_use, pl);
 	  tgu_val += lrecord_stats[i].bytes_in_use;
+	  if (lrecord_stats[i].nonlisp_bytes_in_use)
+	    {
+	      sprintf (buf, "%s-non-lisp-storage", name);
+	      pl = gc_plist_hack (buf, lrecord_stats[i].nonlisp_bytes_in_use,
+				  pl);
+	      tgu_val += lrecord_stats[i].nonlisp_bytes_in_use;
+	    }
 	  pluralize_and_append (buf, name, "-freed");
           if (lrecord_stats[i].instances_freed != 0)
             pl = gc_plist_hack (buf, lrecord_stats[i].instances_freed, pl);
@@ -4807,6 +4850,9 @@
   for (i = 0; i < countof (lrecord_implementations_table); i++)
     {
       int len = 0;
+      int nonlisp_len = 0;
+      int seen_break = 0;
+
       struct lrecord_implementation *imp = lrecord_implementations_table[i];
 
       if (!imp)
@@ -4820,11 +4866,18 @@
 	LIST_LOOP_2 (item, imp->memusage_stats_list)
 	  {
 	    if (!NILP (item) && !EQ (item, Qt))
-	      len++;
+	      {
+		len++;
+		if (!seen_break)
+		  nonlisp_len++;
+	      }
+	    else
+	      seen_break++;
 	  }
       }
 
       imp->num_extra_memusage_stats = len;
+      imp->num_extra_nonlisp_memusage_stats = nonlisp_len;
     }
 }