Implemented smap support. Closes #320710.

* procmap.c: (add_smaps), (glibtop_get_proc_map_s):

	Implemented smap support.
	Closes #320710.
This commit is contained in:
Benoît Dejean
2005-12-12 13:37:15 +00:00
parent 451f9f9d6c
commit ba7355df9e
2 changed files with 87 additions and 4 deletions

View File

@@ -1,3 +1,10 @@
2005-12-12 Benoît Dejean <benoit@placenet.org>
* procmap.c: (add_smaps), (glibtop_get_proc_map_s):
Implemented smap support.
Closes #320710.
2005-12-12 Benoît Dejean <benoit@placenet.org>
* proclist.c: (glibtop_get_proclist_s):

View File

@@ -29,6 +29,13 @@
#include <glibtop/procmap.h>
#include <linux/kdev_t.h>
#include <stddef.h>
#include "glibtop_private.h"
#define MAPS_FILE "/proc/%u/maps"
#define SMAPS_FILE "/proc/%u/smaps"
#define PROC_MAPS_FORMAT ((sizeof(void*) == 8) \
@@ -46,6 +53,12 @@ static const unsigned long _glibtop_sysdeps_map_entry =
(1L << GLIBTOP_MAP_ENTRY_INODE) + (1L << GLIBTOP_MAP_ENTRY_DEVICE) +
(1L << GLIBTOP_MAP_ENTRY_FILENAME);
static const unsigned long _glibtop_sysdeps_map_entry_smaps =
(1UL << GLIBTOP_MAP_ENTRY_SIZE) + (1UL << GLIBTOP_MAP_ENTRY_RSS) +
(1UL << GLIBTOP_MAP_ENTRY_SHARED_DIRTY) + (1UL << GLIBTOP_MAP_ENTRY_SHARED_CLEAN) +
(1UL << GLIBTOP_MAP_ENTRY_PRIVATE_DIRTY) + (1UL << GLIBTOP_MAP_ENTRY_PRIVATE_CLEAN);
/* Init function. */
void
@@ -56,6 +69,55 @@ glibtop_init_proc_map_s (glibtop *server)
/* Provides detailed information about a process. */
static void
add_smaps(glibtop *server, FILE *smaps, glibtop_map_entry *entry)
{
#define SMAP_OFFSET(MEMBER) offsetof(glibtop_map_entry, MEMBER)
struct smap_value {
const char *name;
ptrdiff_t offset;
};
const struct smap_value values[] = {
{ "Size:", SMAP_OFFSET(size) },
{ "Rss:", SMAP_OFFSET(rss) },
{ "Shared_Clean:", SMAP_OFFSET(shared_clean) },
{ "Shared_Dirty:", SMAP_OFFSET(shared_dirty) },
{ "Private_Clean:", SMAP_OFFSET(private_clean) },
{ "Private_Dirty:", SMAP_OFFSET(private_dirty) }
};
size_t i;
for (i = 0; i < G_N_ELEMENTS(values); ++i) {
char line[80];
char *offset;
guint64 *value;
if (!fgets(line, sizeof line, smaps)) {
glibtop_warn_io_r(server,
"Could not read smaps value %s",
values[i].name);
return;
}
offset = (void*) entry;
offset += values[i].offset;
value = (void*) offset;
*value = get_scaled(line, values[i].name);
}
entry->flags |= _glibtop_sysdeps_map_entry_smaps;
#undef SMAP_OFFSET
}
glibtop_map_entry *
glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
{
@@ -70,12 +132,18 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
sizeof(glibtop_map_entry),
100);
FILE *maps;
const char *filename;
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0);
memset (buf, 0, sizeof (glibtop_proc_map));
snprintf (procfilename, sizeof procfilename, "/proc/%d/maps", pid);
if (server->os_version_code >= LINUX_VERSION_CODE(2, 6, 0))
filename = SMAPS_FILE;
else
filename = MAPS_FILE;
snprintf (procfilename, sizeof procfilename, filename, (unsigned)pid);
if((maps = fopen (procfilename, "r")) == NULL) {
return (glibtop_map_entry*) g_array_free(entry_list, TRUE);
@@ -83,6 +151,8 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
while(TRUE)
{
char line[1024];
unsigned long perm = 0;
int rv;
guint len;
@@ -94,9 +164,11 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
glibtop_map_entry *entry;
if (!fgets(line, sizeof line, maps))
break;
/* 8 arguments */
rv = fscanf (maps, PROC_MAPS_FORMAT,
rv = sscanf(line, PROC_MAPS_FORMAT,
&start, &end, flags, &offset,
&dev_major, &dev_minor, &inode, filename);
@@ -138,6 +210,10 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
entry->device = (guint64) MKDEV(dev_major, dev_minor);
entry->inode = (guint64) inode;
g_strlcpy(entry->filename, filename, sizeof entry->filename);
if (server->os_version_code >= LINUX_VERSION_CODE(2, 6, 0))
add_smaps(server, maps, entry);
}
fclose (maps);