#!/bin/sh

# Show the process's memory use, itemized and totaled.
# Effectively a handy filter on /proc/X/maps.

LIST=${@:-leos saos}
for ITEM in $LIST; do
    case $ITEM in
        [0-9]* ) PIDLIST=$ITEM;;
        *      ) PIDLIST=`pidof $ITEM`;;
    esac
    for PID in $PIDLIST; do
        if [ -d /proc/$PID ] ; then
            LINK=$(readlink /proc/$PID/exe || root readlink /proc/$PID/exe)
            PROG=$(basename $LINK)
            echo "$PROG($PID):"
            sed -e s/^/0x/ -e 's/-/ 0x/' </proc/$PID/maps \
                | awk '{printf("%08X-%08X %s %8d %s %-10d %s\n", \
                                $1,$2,$3,$2 - $1,$5,$6,$7);\
                        if (substr($3, 1, 2) == "r-" && substr($3, 4) == "p") \
                           rsum += $2 - $1; \
                        if (substr($3, 1, 2) == "rw" && substr($3, 4) == "p") \
                           wsum += $2 - $1} \
                        END {printf("Read-only:  %8d\nRead-write: %8d\n", \
                                    rsum, wsum);\
                             printf("Total mem:  %8d\n", rsum + wsum)}'
        fi
    done
done
