Implemented smap support. Closes #320710.
* procmap.c: (add_smaps), (glibtop_get_proc_map_s): Implemented smap support. Closes #320710.
This commit is contained in:
@@ -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>
|
2005-12-12 Benoît Dejean <benoit@placenet.org>
|
||||||
|
|
||||||
* proclist.c: (glibtop_get_proclist_s):
|
* proclist.c: (glibtop_get_proclist_s):
|
||||||
|
@@ -29,6 +29,13 @@
|
|||||||
#include <glibtop/procmap.h>
|
#include <glibtop/procmap.h>
|
||||||
|
|
||||||
#include <linux/kdev_t.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) \
|
#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_INODE) + (1L << GLIBTOP_MAP_ENTRY_DEVICE) +
|
||||||
(1L << GLIBTOP_MAP_ENTRY_FILENAME);
|
(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. */
|
/* Init function. */
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -56,6 +69,55 @@ glibtop_init_proc_map_s (glibtop *server)
|
|||||||
|
|
||||||
/* Provides detailed information about a process. */
|
/* 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_map_entry *
|
||||||
glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
|
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),
|
sizeof(glibtop_map_entry),
|
||||||
100);
|
100);
|
||||||
FILE *maps;
|
FILE *maps;
|
||||||
|
const char *filename;
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0);
|
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0);
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_map));
|
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) {
|
if((maps = fopen (procfilename, "r")) == NULL) {
|
||||||
return (glibtop_map_entry*) g_array_free(entry_list, TRUE);
|
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)
|
while(TRUE)
|
||||||
{
|
{
|
||||||
|
char line[1024];
|
||||||
|
|
||||||
unsigned long perm = 0;
|
unsigned long perm = 0;
|
||||||
int rv;
|
int rv;
|
||||||
guint len;
|
guint len;
|
||||||
@@ -94,9 +164,11 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid)
|
|||||||
|
|
||||||
glibtop_map_entry *entry;
|
glibtop_map_entry *entry;
|
||||||
|
|
||||||
|
if (!fgets(line, sizeof line, maps))
|
||||||
|
break;
|
||||||
|
|
||||||
/* 8 arguments */
|
/* 8 arguments */
|
||||||
rv = fscanf (maps, PROC_MAPS_FORMAT,
|
rv = sscanf(line, PROC_MAPS_FORMAT,
|
||||||
&start, &end, flags, &offset,
|
&start, &end, flags, &offset,
|
||||||
&dev_major, &dev_minor, &inode, filename);
|
&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->device = (guint64) MKDEV(dev_major, dev_minor);
|
||||||
entry->inode = (guint64) inode;
|
entry->inode = (guint64) inode;
|
||||||
g_strlcpy(entry->filename, filename, sizeof entry->filename);
|
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);
|
fclose (maps);
|
||||||
|
Reference in New Issue
Block a user