Author: dsnell Date: 2006-08-09 23:20:01 -0400 (Wed, 09 Aug 2006) New Revision: 63573
Added: branches/dmsnell/heap-buddy/analyzer/GraphReport.cs Modified: branches/dmsnell/heap-buddy/analyzer/Makefile.am branches/dmsnell/heap-buddy/analyzer/Makefile.in branches/dmsnell/heap-buddy/analyzer/MemlogReport.cs Log: Yay! Cairo inside Gtk! Added: branches/dmsnell/heap-buddy/analyzer/GraphReport.cs =================================================================== --- branches/dmsnell/heap-buddy/analyzer/GraphReport.cs 2006-08-10 00:58:14 UTC (rev 63572) +++ branches/dmsnell/heap-buddy/analyzer/GraphReport.cs 2006-08-10 03:20:01 UTC (rev 63573) @@ -0,0 +1,239 @@ +// +// Graph.cs +// based on BacktracesReport.cs +// + +// +// BacktracesReport.cs +// +// Copyright (C) 2005 Novell, Inc. +// + +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of version 2 of the GNU General Public +// License as published by the Free Software Foundation. +// +// This program 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 this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// + +using System; +using System.Collections; +using Cairo; +using Gtk; + +namespace HeapBuddy { + + public class GraphReport : Report { + + public GraphReport () : base ("Graph") { } + + public Context Context; + public Gdk.Window Window; + + public OutfileReader Reader; + + public ArrayList Stamps; + + override public void Run (OutfileReader reader, string [] args) + { + Reader = reader; + Stamps = new ArrayList (); + CollectStamps (); + Sort (); + + Application.Init (); + + Window MainWindow = new Window ("Heap-Buddy"); + MainWindow.SetDefaultSize (640, 480); + MainWindow.DeleteEvent += QuitApplication; + + VPaned box1 = new VPaned (); + MainWindow.Add (box1); + + MenuBar MainMenu = new MenuBar (); + Menu FileMenu = new Menu (); + MenuItem ExitItem = new MenuItem ("E_xit"); + ExitItem.Activated += QuitApplication; + FileMenu.Append (ExitItem); + MenuItem FileItem = new MenuItem ("_File"); + FileItem.Submenu = FileMenu; + MainMenu.Append (FileItem); + box1.Add (MainMenu); + + CairoGraph cg = new CairoGraph (this); + box1.Add (cg); + + box1.ResizeChildren (); + + MainWindow.ShowAll (); + Application.Run (); + } + + public void SetContext (Context c, Gdk.Window w) + { + Context = c; + Window = w; + + Continue (); + } + + public void Continue () + { + int x, y, w, h, d; + Window.GetGeometry (out x, out y, out w, out h, out d); + + Context c = Context; + + if (Stamps.Count <= 0) + return; + + c.Color = new Color (1, 1, 1, 1); + c.Paint (); + + // Calculate our Time Span, bail if zero + long TimeSpan = ((MemStamp)Stamps [Stamps.Count - 1]).TimeT - ((MemStamp)Stamps [0]).TimeT; + if (TimeSpan == 0) + return; + + long LowBytes = ((MemStamp)Stamps [0]).LiveBytes; + long HighBytes = 0; + + foreach (MemStamp ms in Stamps) { + if (ms.LiveBytes < LowBytes) + LowBytes = ms.LiveBytes; + if (ms.LiveBytes > HighBytes) + HighBytes = ms.LiveBytes; + } + + //*********Scaling + + // How much room for the labels? + c.FontSize = 15; + string label = Util.PrettySize (HighBytes); + double GOX = c.TextExtents (label).Width + 15; + double GOY = h - 30; + double GW = w - GOX - 10; + double GH = GOY - 10; + + double xscale = (double)TimeSpan / GW; + double yrange = HighBytes - LowBytes; + double yscale = yrange / GH; + + // Border + c.Color = new Color (0, 0, 0, 1); + c.LineWidth = 5; + c.Rectangle (GOX, GOY, GW, -GH); + + // Memory line + c.MoveTo (GOX, GOY); + long LowTime = ((MemStamp)Stamps [0]).TimeT; + foreach (MemStamp ms in Stamps) { + c.LineTo (GOX + (double)(ms.TimeT - LowTime) / xscale, GOY - (double)(ms.LiveBytes - LowBytes) / yscale); + } + c.LineWidth = 1.5; + c.Stroke (); + + // Labels + c.LineWidth = 1; + + // Memory + for (int i = 0; i <= 10; i++) { + c.MoveTo (GOX - 5, GOY - i * GH / 10); + c.LineTo (GOX, GOY - i * GH / 10); + c.Stroke (); + + label = Util.PrettySize (LowBytes + (i * (long)yrange / 10)); + TextExtents e = c.TextExtents (label); + c.MoveTo (GOX - 10 - e.Width, GOY - i * GH / 10 + 0.5 * e.Height); + c.ShowText (label); + } + + // Time + for (int i = 0; i < 15; i++) { + c.MoveTo (GOX + i * GW / 15, GOY); + c.LineTo (GOX + i * GW / 15, GOY + 5); + c.Stroke (); + + label = Util.PrettyTime (i * TimeSpan / 15); + TextExtents e = c.TextExtents (label); + c.MoveTo (GOX + i * GW / 15 - 0.5 * e.Width, GOY + 15 + e.Height); + c.ShowText (label); + } + } + + public class MemStamp { + public long LiveBytes; + public long TimeT; + + public MemStamp (long bytes, long time) { + LiveBytes = bytes; + TimeT = time; + } + } + + public class MemStampComparer : IComparer { + int IComparer.Compare (System.Object x, System.Object y) { + MemStamp a = (MemStamp)x; + MemStamp b = (MemStamp)y; + + if (a.TimeT > b.TimeT) return 1; + else if (a.TimeT < b.TimeT) return -1; + else return 0; + } + } + + public void CollectStamps () + { + foreach (Gc gc in Reader.Gcs) { + Stamps.Add (new MemStamp (gc.PostGcLiveBytes, gc.TimeT)); + } + + foreach (Resize r in Reader.Resizes) { + Stamps.Add (new MemStamp (r.TotalLiveBytes, r.time_t)); + } + } + + public void Sort () + { + IComparer ic = new MemStampComparer (); + Stamps.Sort (ic); + } + + protected static void QuitApplication (object o, EventArgs e) + { + Application.Quit (); + } + + } + + public class CairoGraph : DrawingArea + { + public Cairo.Context Context; + public Gdk.Window Window; + public GraphReport GraphReport; + + public CairoGraph (GraphReport gr) + { + GraphReport = gr; + } + + protected override bool OnExposeEvent (Gdk.EventExpose args) + { + Window = args.Window; + Context = Gdk.Context.CreateDrawable (Window); + + GraphReport.SetContext (Context, Window); + + return true; + } + } +} Modified: branches/dmsnell/heap-buddy/analyzer/Makefile.am =================================================================== --- branches/dmsnell/heap-buddy/analyzer/Makefile.am 2006-08-10 00:58:14 UTC (rev 63572) +++ branches/dmsnell/heap-buddy/analyzer/Makefile.am 2006-08-10 03:20:01 UTC (rev 63573) @@ -1,6 +1,6 @@ CSC = mcs -debug -CSFLAGS = -target:exe -r:Mono.Cairo -pkg:gtk-sharp -r:System.Drawing.dll +CSFLAGS = -target:exe -r:Mono.Cairo -pkg:gtk-sharp-2.0 -r:System.Drawing.dll TARGET = HeapBuddy.exe WRAPPER = heap-buddy @@ -10,7 +10,8 @@ HistoryReport.cs \ SummaryReport.cs \ TypesReport.cs \ - MemlogReport.cs + MemlogReport.cs \ + GraphReport.cs CSFILES = \ HeapBuddy.cs \ @@ -27,7 +28,6 @@ MemZone.cs \ TypeLog.cs \ MethodLog.cs \ - MemGraph.cs \ Graphics.cs \ $(REPORT_CSFILES) Modified: branches/dmsnell/heap-buddy/analyzer/Makefile.in =================================================================== --- branches/dmsnell/heap-buddy/analyzer/Makefile.in 2006-08-10 00:58:14 UTC (rev 63572) +++ branches/dmsnell/heap-buddy/analyzer/Makefile.in 2006-08-10 03:20:01 UTC (rev 63573) @@ -153,7 +153,7 @@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ CSC = mcs -debug -CSFLAGS = -target:exe -r:Mono.Cairo -pkg:gtk-sharp -r:System.Drawing.dll +CSFLAGS = -target:exe -r:Mono.Cairo -pkg:gtk-sharp-2.0 -r:System.Drawing.dll TARGET = HeapBuddy.exe WRAPPER = heap-buddy REPORT_CSFILES = \ @@ -161,7 +161,8 @@ HistoryReport.cs \ SummaryReport.cs \ TypesReport.cs \ - MemlogReport.cs + MemlogReport.cs \ + GraphReport.cs CSFILES = \ HeapBuddy.cs \ @@ -178,7 +179,6 @@ MemZone.cs \ TypeLog.cs \ MethodLog.cs \ - MemGraph.cs \ Graphics.cs \ $(REPORT_CSFILES) Modified: branches/dmsnell/heap-buddy/analyzer/MemlogReport.cs =================================================================== --- branches/dmsnell/heap-buddy/analyzer/MemlogReport.cs 2006-08-10 00:58:14 UTC (rev 63572) +++ branches/dmsnell/heap-buddy/analyzer/MemlogReport.cs 2006-08-10 03:20:01 UTC (rev 63573) @@ -203,7 +203,6 @@ Console.WriteLine ("Memlog commands:"); Console.WriteLine (" list: list the items in the current path"); Console.WriteLine (" rows [n]: specify how many rows to print - zero for all"); - Console.WriteLine (" graph [filename]: generate graph of memory usage (memlog.png default)"); Console.WriteLine (" help: show this screen"); Console.WriteLine (" quit: quit"); } @@ -277,19 +276,8 @@ i++; } - break; + break; - - case "graph": - string filename = null; - if (i + 1 < cmds.Length) - filename = cmds[++i]; - - MemGraph graph = new MemGraph (reader, filename); - - break; - - case "/": SetPath ("/"); break; _______________________________________________ Mono-patches maillist - Mono-patches@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-patches