Cache BinFiles by filename.
authorSoeren Sandmann <sandmann@redhat.com>
Sun, 10 Jul 2005 03:28:35 +0000 (03:28 +0000)
committerSøren Sandmann Pedersen <ssp@src.gnome.org>
Sun, 10 Jul 2005 03:28:35 +0000 (03:28 +0000)
Sat Jul  9 23:20:39 2005  Soeren Sandmann  <sandmann@redhat.com>

* binfile.c (bin_file_new): Cache BinFiles by filename.

* stackstash.c (stack_stash_free): Plug leak

* process.c (process_free_maps): Plug leak

* module/Makefile (install): Check that depmod exists before
running it.

ChangeLog
TODO
binfile.c
module/Makefile
process.c
profile.c
stackstash.c
sysprof.c

index 60b495e..ce5b7c7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Sat Jul  9 23:20:39 2005  Soeren Sandmann  <sandmann@redhat.com>
+
+       * binfile.c (bin_file_new): Cache BinFiles by filename.
+
+       * stackstash.c (stack_stash_free): Plug leak
+
+       * process.c (process_free_maps): Plug leak
+
+       * module/Makefile (install): Check that depmod exists before
+       running it.
+
 Sun Jun 19 15:42:34 2005  Søren Sandmann  <sandmann@redhat.com>
 
        * module/sysprof-module.c (SAMPLES_PER_SECOND): Set to 200.
diff --git a/TODO b/TODO
index 17bc5c2..7424ea7 100644 (file)
--- a/TODO
+++ b/TODO
@@ -191,7 +191,6 @@ http://www.linuxbase.org/spec/booksets/LSB-Embedded/LSB-Embedded/ehframe.html
        - Possibly a special "view details" mode, assuming that 
          the details of a function are not that interesting 
          together with a tree.
-- consider caching [filename => bin_file]
 - rethink caller list, not terribly useful at the moment.
 
 - Have kernel module report the file the address was found in
@@ -370,6 +369,8 @@ Later:
 
 DONE:
 
+* consider caching [filename => bin_file]
+
 * Check the kernel we are building against, if it is SMP or 
   less than 2.6.11, print a warning and suggest upgrading.
 
index b7525d7..c06a155 100644 (file)
--- a/binfile.c
+++ b/binfile.c
@@ -43,6 +43,7 @@ struct BinFile
     int         n_symbols;
     Symbol     *symbols;
     Symbol     undefined;
+    int         ref_count;
 };
 
 static bfd *
@@ -402,33 +403,55 @@ read_symbols (BinFile *bf)
     bf->symbols = (Symbol *)g_array_free (symbols, FALSE);
 } 
 
+static GHashTable *bin_files;
+
 BinFile *
 bin_file_new (const char *filename)
 {
-    BinFile *bf = g_new0 (BinFile, 1);
+    BinFile *bf;
     
-    bf->filename = g_strdup (filename);
-
-    read_symbols (bf);
+    if (!bin_files)
+       bin_files = g_hash_table_new (g_str_hash, g_str_equal);
 
-    bf->undefined.name = g_strdup_printf ("In file %s", filename);
-    bf->undefined.address = 0x0;
+    bf = g_hash_table_lookup (bin_files, filename);
+    if (bf)
+    {
+       bf->ref_count++;
+    }
+    else
+    {
+       bf = g_new0 (BinFile, 1);
     
+       bf->filename = g_strdup (filename);
+       
+       read_symbols (bf);
+       
+       bf->undefined.name = g_strdup_printf ("In file %s", filename);
+       bf->undefined.address = 0x0;
+       bf->ref_count = 1;
+       g_hash_table_insert (bin_files, bf->filename, bf);
+    }
+       
     return bf;
 }
 
 void
 bin_file_free (BinFile *bf)
 {
-    int i;
-    
-    g_free (bf->filename);
+    if (--bf->ref_count == 0)
+    {
+       int i;
 
-    for (i = 0; i < bf->n_symbols; ++i)
-       g_free (bf->symbols[i].name);
-    g_free (bf->symbols);
-    g_free (bf->undefined.name);
-    g_free (bf);
+       g_hash_table_remove (bin_files, bf->filename);
+       
+       g_free (bf->filename);
+       
+       for (i = 0; i < bf->n_symbols; ++i)
+           g_free (bf->symbols[i].name);
+       g_free (bf->symbols);
+       g_free (bf->undefined.name);
+       g_free (bf);
+    }
 }
 
 /**
index c87b078..850c896 100644 (file)
@@ -43,7 +43,7 @@ distdir:
 
 install:
        $(KMAKE) modules_install
-       depmod
+       [ -e /sbin/depmod ] && /sbin/depmod
 
 install-data:
 install-exec:
index a28e10c..f5b3f4a 100644 (file)
--- a/process.c
+++ b/process.c
@@ -183,6 +183,9 @@ process_free_maps (Process *process)
     for (list = process->maps; list != NULL; list = list->next)
     {
        Map *map = list->data;
+
+       if (map->filename)
+           g_free (map->filename);
        
        if (map->bin_file)
            bin_file_free (map->bin_file);
index ac98d97..dedcde3 100644 (file)
--- a/profile.c
+++ b/profile.c
@@ -523,7 +523,7 @@ profile_new (StackStash *stash)
     /* profile objects */
     info.profile_objects = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                  g_free, NULL);
-    
+
     stack_stash_foreach (stash, generate_object_table, &info);
     stack_stash_foreach (stash, generate_call_tree, &info);
     link_parents (info.profile->call_tree, NULL);
@@ -531,7 +531,7 @@ profile_new (StackStash *stash)
     g_hash_table_foreach (info.profile->nodes_by_object, compute_object_total, NULL);
     
     g_hash_table_destroy (info.profile_objects);
-    
+
     return info.profile;
 }
 
index 1d1803d..c7ecb1d 100644 (file)
@@ -211,4 +211,5 @@ stack_stash_free      (StackStash      *stash)
 {
     stack_node_free (stash->root);
     g_hash_table_destroy (stash->leaves_by_process);
+    g_free (stash);
 }
index f7cc3af..2b7284f 100644 (file)
--- a/sysprof.c
+++ b/sysprof.c
@@ -1552,7 +1552,7 @@ main (int argc, char **argv)
 
        g_idle_add (load_file, file_open_data);
     }
-    
+
     gtk_main ();
     
     return 0;