summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hgspy.c43
-rw-r--r--src/hgspy_helper.c17
-rw-r--r--src/visualizer.c63
-rw-r--r--src/visualizer.h2
4 files changed, 104 insertions, 21 deletions
diff --git a/src/hgspy.c b/src/hgspy.c
index 0c4d56e..922e920 100644
--- a/src/hgspy.c
+++ b/src/hgspy.c
@@ -64,6 +64,7 @@ _hgspy_vm_thread(gpointer data)
libretto_vm_init();
spy->vm = libretto_vm_new(LB_EMULATION_LEVEL_1);
libretto_vm_startjob(spy->vm, spy->file, TRUE);
+ libretto_vm_finalize();
return NULL;
}
@@ -202,7 +203,6 @@ _hgspy_pool_updated_cb(HgMemoryVisualizer *visual,
gulong sigid;
g_return_if_fail (HG_IS_MEMORY_VISUALIZER (visual));
- g_return_if_fail (list != NULL);
bin = gtk_ui_manager_get_widget(spy->ui, "/MenuBar/ViewMenu/PoolMenu");
menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM (bin));
@@ -229,6 +229,12 @@ _hgspy_pool_updated_cb(HgMemoryVisualizer *visual,
gtk_menu_shell_append(GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show(menuitem);
}
+ if (sigwidget == NULL) {
+ menuitem = gtk_menu_item_new_with_label(_("None"));
+ gtk_menu_shell_append(GTK_MENU_SHELL (menu), menuitem);
+ gtk_widget_set_sensitive(menuitem, FALSE);
+ gtk_widget_show(menuitem);
+ }
g_object_set_data(G_OBJECT (menu), "signal-widget-list", sigwidget);
gtk_menu_item_set_submenu(GTK_MENU_ITEM (bin), menu);
}
@@ -244,9 +250,7 @@ _hgspy_draw_updated_cb(HgMemoryVisualizer *visual,
g_return_if_fail (data != NULL);
name = hg_memory_visualizer_get_current_pool_name(visual);
- if (name) {
- _hgspy_update_vm_status(visual, spy, name);
- }
+ _hgspy_update_vm_status(visual, spy, name);
}
static void
@@ -259,19 +263,24 @@ _hgspy_update_vm_status(HgMemoryVisualizer *visual,
g_return_if_fail (HG_IS_MEMORY_VISUALIZER (visual));
g_return_if_fail (spy != NULL);
- g_return_if_fail (name != NULL);
-
- total = hg_memory_visualizer_get_max_size(visual, name);
- p = g_strdup_printf("%d", total);
- gtk_entry_set_text(GTK_ENTRY (spy->total_vm_size), p);
- g_free(p);
- used = hg_memory_visualizer_get_used_size(visual, name);
- p = g_strdup_printf("%d", used);
- gtk_entry_set_text(GTK_ENTRY (spy->used_vm_size), p);
- g_free(p);
- p = g_strdup_printf("%d", total - used);
- gtk_entry_set_text(GTK_ENTRY (spy->free_vm_size), p);
- g_free(p);
+
+ if (name) {
+ total = hg_memory_visualizer_get_max_size(visual, name);
+ p = g_strdup_printf("%d", total);
+ gtk_entry_set_text(GTK_ENTRY (spy->total_vm_size), p);
+ g_free(p);
+ used = hg_memory_visualizer_get_used_size(visual, name);
+ p = g_strdup_printf("%d", used);
+ gtk_entry_set_text(GTK_ENTRY (spy->used_vm_size), p);
+ g_free(p);
+ p = g_strdup_printf("%d", total - used);
+ gtk_entry_set_text(GTK_ENTRY (spy->free_vm_size), p);
+ g_free(p);
+ } else {
+ gtk_entry_set_text(GTK_ENTRY (spy->total_vm_size), "");
+ gtk_entry_set_text(GTK_ENTRY (spy->used_vm_size), "");
+ gtk_entry_set_text(GTK_ENTRY (spy->free_vm_size), "");
+ }
}
/*
diff --git a/src/hgspy_helper.c b/src/hgspy_helper.c
index 14ac3ae..8eff821 100644
--- a/src/hgspy_helper.c
+++ b/src/hgspy_helper.c
@@ -32,6 +32,7 @@
#include "visualizer.h"
+static gpointer __hg_mem_pool_destroy = NULL;
static gpointer __hg_mem_pool_add_heap = NULL;
static gpointer __hg_mem_alloc_with_flags = NULL;
static gpointer __hg_mem_free = NULL;
@@ -51,6 +52,10 @@ helper_init(void)
g_warning("Failed g_module_open: %s", g_module_error());
exit(1);
}
+ if (!g_module_symbol(__handle, "hg_mem_pool_destroy", &__hg_mem_pool_destroy)) {
+ g_warning("Failed g_module_symbol: %s", g_module_error());
+ exit(1);
+ }
if (!g_module_symbol(__handle, "hg_mem_pool_add_heap", &__hg_mem_pool_add_heap)) {
g_warning("Failed g_module_symbol: %s", g_module_error());
exit(1);
@@ -82,6 +87,18 @@ helper_finalize(void)
* preload functions
*/
void
+hg_mem_pool_destroy(HgMemPool *pool)
+{
+ gchar *pool_name = g_strdup(hg_mem_pool_get_name(pool));
+
+ ((void (*) (HgMemPool *))__hg_mem_pool_destroy) (pool);
+
+ hg_memory_visualizer_remove_pool(HG_MEMORY_VISUALIZER (visual),
+ pool_name);
+ g_free(pool_name);
+}
+
+void
hg_mem_pool_add_heap(HgMemPool *pool,
HgHeap *heap)
{
diff --git a/src/visualizer.c b/src/visualizer.c
index 86178c1..c324e7b 100644
--- a/src/visualizer.c
+++ b/src/visualizer.c
@@ -66,7 +66,7 @@ struct _HgMemoryVisualizer {
GHashTable *pool2used_size;
GHashTable *pool2array;
GSList *pool_name_list;
- const gchar *current_pool_name;
+ gchar *current_pool_name;
struct Heap2Offset *current_h2o;
gboolean need_update;
guint idle_id;
@@ -153,6 +153,10 @@ hg_memory_visualizer_real_destroy(GtkObject *object)
visual->pool2array = NULL;
}
if (visual->pool_name_list) {
+ GSList *l;
+
+ for (l = visual->pool_name_list; l != NULL; l = g_slist_next(l))
+ g_free(l->data);
g_slist_free(visual->pool_name_list);
visual->pool_name_list = NULL;
}
@@ -577,6 +581,13 @@ _hg_memory_visualizer_redraw_in_pixmap(HgMemoryVisualizer *visual)
}
}
+static gint
+_hg_memory_visualizer_compare_pool_name_list(gconstpointer a,
+ gconstpointer b)
+{
+ return strcmp(a, b);
+}
+
/*
* Public Functions
*/
@@ -686,13 +697,50 @@ hg_memory_visualizer_set_heap_state(HgMemoryVisualizer *visual,
visual->pool_name_list = g_slist_append(visual->pool_name_list,
g_strdup(name));
if (visual->current_pool_name == NULL) {
- visual->current_pool_name = name;
+ visual->current_pool_name = g_strdup(name);
visual->current_h2o = h2o;
}
g_signal_emit(visual, signals[POOL_UPDATED], 0, visual->pool_name_list);
}
void
+hg_memory_visualizer_remove_pool(HgMemoryVisualizer *visual,
+ const gchar *name)
+{
+ GSList *l;
+
+ g_return_if_fail (HG_IS_MEMORY_VISUALIZER (visual));
+ g_return_if_fail (name != NULL);
+
+ if ((l = g_slist_find_custom(visual->pool_name_list,
+ name,
+ _hg_memory_visualizer_compare_pool_name_list)) == NULL) {
+ g_warning("pool %s isn't registered.", name);
+ return;
+ }
+
+ G_LOCK (visualizer);
+
+ g_hash_table_remove(visual->pool2total_size, name);
+ g_hash_table_remove(visual->pool2used_size, name);
+ g_hash_table_remove(visual->pool2array, name);
+ g_free(l->data);
+ visual->pool_name_list = g_slist_delete_link(visual->pool_name_list, l);
+
+ if (strcmp(name, visual->current_pool_name) == 0) {
+ const gchar *pool_name;
+
+ if (visual->pool_name_list)
+ pool_name = visual->pool_name_list->data;
+ else
+ pool_name = "";
+ hg_memory_visualizer_change_pool(visual, pool_name);
+ }
+
+ G_UNLOCK (visualizer);
+}
+
+void
hg_memory_visualizer_set_chunk_state(HgMemoryVisualizer *visual,
const gchar *name,
gint heap_id,
@@ -754,13 +802,20 @@ hg_memory_visualizer_change_pool(HgMemoryVisualizer *visual,
g_return_if_fail (name != NULL);
if (g_slist_find(visual->pool_name_list, name) != NULL) {
- visual->current_pool_name = name;
+ if (visual->current_pool_name)
+ g_free(visual->current_pool_name);
+ visual->current_pool_name = g_strdup(name);
visual->current_h2o = g_hash_table_lookup(visual->pool2array, name);
- _hg_memory_visualizer_redraw_in_pixmap(visual);
} else {
/* send a signal to update the out of date list */
+ if (visual->current_pool_name)
+ g_free(visual->current_pool_name);
+ visual->current_pool_name = NULL;
+ visual->current_h2o = NULL;
g_signal_emit(visual, signals[POOL_UPDATED], 0, visual->pool_name_list);
}
+ visual->need_update = TRUE;
+ _hg_memory_visualizer_add_idle(visual);
}
gsize
diff --git a/src/visualizer.h b/src/visualizer.h
index 10acb70..92223fc 100644
--- a/src/visualizer.h
+++ b/src/visualizer.h
@@ -56,6 +56,8 @@ gsize hg_memory_visualizer_get_max_size (HgMemoryVisualizer *visu
void hg_memory_visualizer_set_heap_state (HgMemoryVisualizer *visual,
const gchar *name,
HgHeap *heap);
+void hg_memory_visualizer_remove_pool (HgMemoryVisualizer *visual,
+ const gchar *name);
void hg_memory_visualizer_set_chunk_state (HgMemoryVisualizer *visual,
const gchar *name,
gint heap_id,