Get maps view working

This commit is contained in:
Matt Mackall 2009-03-27 13:10:36 -05:00
commit 09d7939030

77
smem
View file

@ -15,7 +15,7 @@ def pidmaps(pid):
else:
start, end = f[0].split('-')
start = int(start, 16)
name = ""
name = "<anonymous>"
if len(f) > 5:
name = f[5]
maps[start] = dict(end=int(end, 16), mode=f[1],
@ -43,10 +43,6 @@ def processtotals(pids):
continue
return totals
def maptotals():
t = dict(size=0, rss=0, pss=0, shared_clean=0, shared_dirty=0,
private_clean=0, private_dirty=0, referenced=0, swap=0)
def sortmaps(totals, key):
l = []
for pid in totals:
@ -115,11 +111,6 @@ def showpids():
return piduser(p)
return username(piduser(p))
def showsize(field):
if numeric:
return lambda n: pt[n][field]
return lambda n: units(pt[n][field])
fields = dict(
pid=('PID', lambda n: n, '% 5s', lambda x: len(p)),
uid=('UID', username, '%-5s', None),
@ -136,6 +127,46 @@ def showpids():
showtable(p, fields, columns.split(), options.sort or 'pss')
def maptotals(pids):
totals = {}
for pid in pids:
try:
maps = pidmaps(pid)
for m in maps.iterkeys():
name = maps[m]['name']
if name not in totals:
t = dict(size=0, rss=0, pss=0, shared_clean=0,
shared_dirty=0, private_clean=0, count=0,
private_dirty=0, referenced=0, swap=0)
else:
t = totals[name]
for k in t:
t[k] += maps[m].get(k, 0)
t['count'] += 1
totals[name] = t
except:
raise
print len(totals), totals.keys()[0]
return totals
def showmaps():
p = pids()
pt = maptotals(p)
fields = dict(
map=('Map', lambda n: n, '%-24.24s', len),
count=('Count', lambda n: pt[n]['count'], '% 8s', sum),
swap=('Swap',lambda n: pt[n]['swap'], '% 8s', sum),
uss=('USS', lambda n: pt[n]['private_clean']
+ pt[n]['private_dirty'], '% 8s', sum),
rss=('RSS', lambda n: pt[n]['rss'], '% 8s', sum),
pss=('PSS', lambda n: pt[n]['pss'], '% 8s', sum),
)
columns = options.columns or 'map count swap uss pss rss'
showtable(pt.keys(), fields, columns.split(), options.sort or 'pss')
def showtable(rows, fields, columns, sort):
header = ""
format = ""
@ -170,29 +201,25 @@ def showtable(rows, fields, columns, sort):
print "-" * len(header)
print format % tuple(t)
# todo
# fix disappearing dirs
# show unknowns
# options
# columns
# numeric
# sort order
parser = optparse.OptionParser("%prog [options]")
parser.add_option("-H", "--no-header", action="store_true",
help="disable header line")
help="disable header line")
parser.add_option("-n", "--numeric", action="store_true",
help="numeric output")
help="numeric output")
parser.add_option("-s", "--sort", type="str",
help="field to sort on")
help="field to sort on")
parser.add_option("-t", "--totals", action="store_true",
help="show totals")
help="show totals")
parser.add_option("-c", "--columns", type="str",
help="columns to show")
help="columns to show")
parser.add_option("-m", "--mappings", action="store_true",
help="show mappings")
defaults = {}
parser.set_defaults(**defaults)
(options, args) = parser.parse_args()
showpids()
if options.mappings:
showmaps()
else:
showpids()