#!/bin/ash

# A ps-like utility that shows priority, and threads too.
# (Stupid busybox doesn't do -L option, or priority.)

echo "  PID   LWP USER PRI STAT COMMAND"
ps -w | sed 1d | while read PID USER VSZ STAT COMMAND ; do
    if [ ! -d /proc/$PID ] ; then continue; fi
    TASKS=$(cd /proc/$PID 2>/dev/null && ls task)
    read -r pid comm state ppid pgrp session tty_nr tpgid flags minflt \
	cminflt majflt cmajflt utime stime cutime cstime priority nice \
	zero itrealvalue starttime vsize rss rlim startcode endcode \
	startstack kstkesp kstkeip signal blocked sigignore sigcatch \
	wchan nswap cnswap exit processor rt policy extra </proc/$PID/stat
    TID=$PID
    if [ $policy -eq 1 ] ; then
	PRI="F$rt"
    elif [ $policy -eq 2 ] ; then
	PRI="R$rt"
    else
	PRI=$nice
    fi
    if [ "$TASKS" == $PID ] ; then
	printf "%5d %5d %-5s %-3d %-5s %-s\n" $PID $TID $USER $PRI $STAT "$COMMAND"
    else
	for TID in $(echo $TASKS | sort -n); do
	    read -r pid comm state ppid pgrp session tty_nr tpgid flags \
		minflt cminflt majflt cmajflt utime stime cutime cstime \
		priority nice zero itrealvalue starttime vsize rss rlim \
		startcode endcode startstack kstkesp kstkeip signal blocked \
		sigignore sigcatch wchan nswap cnswap exit processor rt \
		policy extra </proc/$PID/task/$TID/stat
	    if [ $policy -eq 1 ] ; then
		PRI="F$rt"
	    elif [ $policy -eq 2 ] ; then
		PRI="R$rt"
	    else
		PRI=$nice
	    fi
	    printf "%5d %5d %-5s %-3s %-5s %-s\n" $PID $TID $USER $PRI $STAT "$COMMAND"
	done
    fi
done
