summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames-ws@darkjames.pl>2013-07-31 18:26:14 +0000
committerJakub Zawadzki <darkjames-ws@darkjames.pl>2013-07-31 18:26:14 +0000
commit1cabad610b4a4497d5b17b5939e2798213bfa6da (patch)
treeb0d5d7cc57300ab0c5a2d37cd55165199aed9dce
parent0e90cd8f80cc0def5d30366830228c351f33fc93 (diff)
downloadwireshark-1cabad610b4a4497d5b17b5939e2798213bfa6da.tar.gz
Add some very basic framework to fetch statistics of memory usage per component.
Use it in memory_dlg. svn path=/trunk/; revision=51069
-rw-r--r--epan/app_mem_usage.c77
-rw-r--r--epan/app_mem_usage.h15
-rw-r--r--epan/emem.c35
-rw-r--r--ui/gtk/memory_dlg.c52
4 files changed, 140 insertions, 39 deletions
diff --git a/epan/app_mem_usage.c b/epan/app_mem_usage.c
index d689835c45..ba2a8cc431 100644
--- a/epan/app_mem_usage.c
+++ b/epan/app_mem_usage.c
@@ -33,10 +33,12 @@
#include "app_mem_usage.h"
-gsize
-get_total_mem_used_by_app(void)
-{
+#define MAX_COMPONENTS 16
+
#if defined(_WIN32)
+static gsize
+win32_get_total_mem_used_by_app(void)
+{
HANDLE pHandle;
PROCESS_MEMORY_COUNTERS pmc;
SIZE_T workingSize = 0;
@@ -45,8 +47,6 @@ get_total_mem_used_by_app(void)
if (GetProcessMemoryInfo(pHandle, &pmc, sizeof(pmc))){
workingSize = pmc.WorkingSetSize;
-
- workingSize = workingSize / 1024;
}
CloseHandle(pHandle);
@@ -56,7 +56,70 @@ get_total_mem_used_by_app(void)
}else{
return (int)workingSize;
}
-#else
- return 0;
+}
+
+#define get_total_mem_used_by_app win32_get_total_mem_used_by_app
+
#endif /* (_WIN32) */
+
+
+#ifdef get_total_mem_used_by_app
+static const ws_mem_usage_t total_usage = { "Total", get_total_mem_used_by_app, NULL };
+#endif
+
+#ifdef get_rss_mem_used_by_app
+static const ws_mem_usage_t rss_usage = { "RSS", get_rss_mem_used_by_app, NULL };
+#endif
+
+static const ws_mem_usage_t *memory_components[MAX_COMPONENTS] = {
+#ifdef get_total_mem_used_by_app
+ &total_usage,
+#endif
+#ifdef get_rss_mem_used_by_app
+ &rss_usage,
+#endif
+};
+
+static guint memory_register_num = 0
+#ifdef get_total_mem_used_by_app
+ + 1
+#endif
+#ifdef get_rss_mem_used_by_app
+ + 1
+#endif
+ ;
+
+/* public API */
+
+void
+memory_usage_component_register(const ws_mem_usage_t *component)
+{
+ if (memory_register_num >= MAX_COMPONENTS)
+ return;
+
+ memory_components[memory_register_num++] = component;
+}
+
+const char *
+memory_usage_get(guint index, gsize *value)
+{
+ if (index >= memory_register_num)
+ return NULL;
+
+ if (value)
+ *value = memory_components[index]->fetch();
+
+ return memory_components[index]->name;
}
+
+void
+memory_usage_gc(void)
+{
+ guint i;
+
+ for (i = 0; i < memory_register_num; i++) {
+ if (memory_components[i]->gc)
+ memory_components[i]->gc();
+ }
+}
+
diff --git a/epan/app_mem_usage.h b/epan/app_mem_usage.h
index b97206ec99..fa320984ba 100644
--- a/epan/app_mem_usage.h
+++ b/epan/app_mem_usage.h
@@ -24,6 +24,19 @@
#ifndef __APP_MEM_USAGE_H__
#define __APP_MEM_USAGE_H__
-gsize get_total_mem_used_by_app(void);
+#include "ws_symbol_export.h"
+
+typedef struct {
+ const char *name;
+ gsize (*fetch)(void);
+ void (*gc)(void);
+
+} ws_mem_usage_t;
+
+WS_DLL_PUBLIC void memory_usage_component_register(const ws_mem_usage_t *component);
+
+WS_DLL_PUBLIC void memory_usage_gc(void);
+
+WS_DLL_PUBLIC const char *memory_usage_get(guint index, gsize *value);
#endif /* APP_MEM_USAGE_H */
diff --git a/epan/emem.c b/epan/emem.c
index a176066ea5..124c15be25 100644
--- a/epan/emem.c
+++ b/epan/emem.c
@@ -41,6 +41,7 @@
#include <glib.h>
+#include "app_mem_usage.h"
#include "proto.h"
#include "emem.h"
#include "wmem/wmem.h"
@@ -295,6 +296,26 @@ emem_init_chunk(emem_pool_t *mem)
mem->memory_alloc = emem_alloc_glib;
}
+static gsize
+emem_memory_usage(const emem_pool_t *pool)
+{
+ gsize total_used = 0;
+ emem_chunk_t *chunk;
+
+ for (chunk = pool->used_list; chunk; chunk = chunk->next)
+ total_used += (chunk->amount_free_init - chunk->amount_free);
+
+ for (chunk = pool->free_list; chunk; chunk = chunk->next)
+ total_used += (chunk->amount_free_init - chunk->amount_free);
+
+ return total_used;
+}
+
+static gsize
+ep_memory_usage(void)
+{
+ return emem_memory_usage(&ep_packet_mem);
+}
/* Initialize the packet-lifetime memory allocation pool.
* This function should be called only once when Wireshark or TShark starts
@@ -303,6 +324,8 @@ emem_init_chunk(emem_pool_t *mem)
static void
ep_init_chunk(void)
{
+ static const ws_mem_usage_t ep_stats = { "EP", ep_memory_usage, NULL };
+
ep_packet_mem.free_list=NULL;
ep_packet_mem.used_list=NULL;
ep_packet_mem.trees=NULL; /* not used by this allocator */
@@ -316,6 +339,14 @@ ep_init_chunk(void)
#endif
emem_init_chunk(&ep_packet_mem);
+
+ memory_usage_component_register(&ep_stats);
+}
+
+static gsize
+se_memory_usage(void)
+{
+ return emem_memory_usage(&se_packet_mem);
}
/* Initialize the capture-lifetime memory allocation pool.
@@ -325,6 +356,8 @@ ep_init_chunk(void)
static void
se_init_chunk(void)
{
+ static const ws_mem_usage_t se_stats = { "SE", se_memory_usage, NULL };
+
se_packet_mem.free_list = NULL;
se_packet_mem.used_list = NULL;
se_packet_mem.trees = NULL;
@@ -334,6 +367,8 @@ se_init_chunk(void)
se_packet_mem.debug_verify_pointers = (getenv("WIRESHARK_SE_VERIFY_POINTERS") != NULL);
emem_init_chunk(&se_packet_mem);
+
+ memory_usage_component_register(&se_stats);
}
/* Initialize all the allocators here.
diff --git a/ui/gtk/memory_dlg.c b/ui/gtk/memory_dlg.c
index 3aca56e691..aab9ad0a4c 100644
--- a/ui/gtk/memory_dlg.c
+++ b/ui/gtk/memory_dlg.c
@@ -40,16 +40,9 @@
#include "epan/app_mem_usage.h"
enum {
- MEMORY_TOTAL = 0,
- MEMORY_RSS,
- MEMORY_EP,
- MEMORY_SE,
-
- MAX_GRAPHS
+ MAX_GRAPHS = 10
};
-static const char *graph_labels[MAX_GRAPHS] = { "Total", "RSS", "EP", "SE" };
-
#define MAX_YSCALE 28
static guint32 yscale_max[MAX_YSCALE] = {0, 1, 10, 20,
50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000,
@@ -595,9 +588,13 @@ create_filter_area(io_stat_t *io, GtkWidget *box)
gtk_widget_show(hbox);
for (i=0; i<MAX_GRAPHS; i++) {
+ const char *label = memory_usage_get(i, NULL);
GtkWidget *display_button;
- display_button = gtk_toggle_button_new_with_label(graph_labels[i]);
+ if (!label)
+ break;
+
+ display_button = gtk_toggle_button_new_with_label(label);
gtk_box_pack_start(GTK_BOX(hbox), display_button, FALSE, FALSE, 0);
g_signal_connect(display_button, "toggled", G_CALLBACK(filter_callback), &io->graphs[i]);
gtk_widget_show(display_button);
@@ -647,13 +644,10 @@ init_io_stat_window(io_stat_t *io)
static gboolean
call_it(gpointer user_data)
{
-gsize ep_memory_usage(void);
-gsize se_memory_usage(void);
io_stat_t *io = (io_stat_t *) user_data;
char buf[64];
char *tmp;
-
- int idx;
+ int idx, i;
io->needs_redraw = TRUE;
@@ -665,24 +659,20 @@ gsize se_memory_usage(void);
return FALSE;
}
- /* Point to the appropriate io_item_t struct */
- io->graphs[MEMORY_TOTAL].items[idx]->bytes = get_total_mem_used_by_app() * 1000;
- tmp = format_size(io->graphs[MEMORY_TOTAL].items[idx]->bytes, format_size_unit_bytes);
- g_snprintf(buf, sizeof(buf), "Total [%s]", tmp);
- gtk_button_set_label(GTK_BUTTON(io->graphs[MEMORY_TOTAL].display_button), buf);
- g_free(tmp);
-
- io->graphs[MEMORY_EP].items[idx]->bytes = ep_memory_usage();
- tmp = format_size(io->graphs[MEMORY_EP].items[idx]->bytes, format_size_unit_bytes);
- g_snprintf(buf, sizeof(buf), "EP [%s]", tmp);
- gtk_button_set_label(GTK_BUTTON(io->graphs[MEMORY_EP].display_button), buf);
- g_free(tmp);
-
- io->graphs[MEMORY_SE].items[idx]->bytes = se_memory_usage();
- tmp = format_size(io->graphs[MEMORY_SE].items[idx]->bytes, format_size_unit_bytes);
- g_snprintf(buf, sizeof(buf), "SE [%s]", tmp);
- gtk_button_set_label(GTK_BUTTON(io->graphs[MEMORY_SE].display_button), buf);
- g_free(tmp);
+
+ for (i = 0; i < MAX_GRAPHS; i++) {
+ const char *label;
+
+ label = memory_usage_get(i, &io->graphs[i].items[idx]->bytes);
+
+ if (!label)
+ break;
+
+ tmp = format_size(io->graphs[i].items[idx]->bytes, format_size_unit_bytes);
+ g_snprintf(buf, sizeof(buf), "%s [%s]", label, tmp);
+ gtk_button_set_label(GTK_BUTTON(io->graphs[i].display_button), buf);
+ g_free(tmp);
+ }
io_stat_draw(io);