[Toybox] [PATCH] Revert "Fix "ps -T 1234" to show thread belonging to that PID."

Rob Landley rob at landley.net
Sat Feb 10 10:40:38 PST 2018


Ok, trying again at ps -T.

On 01/24/2018 10:42 AM, enh wrote:
> random example on my laptop:
> 
> /tmp/toybox$ ./toybox ps -AT
> ...
> 244083 244083 ?      00:17:32 chrome
> 244083 244084 ?      00:14:38 chrome
> 244083 244085 ?      00:14:38 chrome
> 244083 244086 ?      00:14:38 chrome
$ ps -T 2273
  PID  SPID TTY      STAT   TIME COMMAND
 2273  2273 ?        SLl  645:52
/usr/lib/chromium-browser/chromium-browser --e
 2273  2300 ?        SLl    7:58
/usr/lib/chromium-browser/chromium-browser --e
 2273  2305 ?        SLl    0:00
/usr/lib/chromium-browser/chromium-browser --e
 2273  2309 ?        SLl    0:01
/usr/lib/chromium-browser/chromium-browser --e

I didn't notice because that's what the host ps -T was doing. (And
obviously it's not showing the _same_ structure or the TID wouldn't vary
either.)

> /tmp/toybox$ git revert 416397e14858c75a9bf20d05f7729595e03943df
> [master 0e3dbdb] Revert "Fix "ps -T 1234" to show thread belonging to that PID."
>  1 file changed, 2 insertions(+), 5 deletions(-)
> 
> (rebuild)
> 
> /tmp/toybox$ ./toybox ps -AT
> ...
> 244083 244083 ?      00:17:32 chrome
> 244083 244084 ?      00:00:00 TaskSchedulerSe
> 244083 244085 ?      00:00:01 TaskSchedulerRe
> 244083 244086 ?      00:00:01 TaskSchedulerRe

What columns is that displaying? (You cut that part out... /me diverges
into android plumbing a bit until I figure out "right, you're showing me
the ubuntu version, not the android version"....)

Anyway, it's with -T it's -o PID,TID,TIME,CMD and I get:

$ ./ps -AT | grep -w 2273
 2273  2273 ?        15:53:23 chromium-browse
 2273  2300 ?        00:07:58 sandbox_ipc_thr
 2273  2305 ?        00:00:00 chromium-browse
 2273  2309 ?        00:00:01 gdbus

The patch was:

-  if (TT.threadparent && TT.threadparent->extra)
-    if (*slot == *(((struct carveup *)TT.threadparent->extra)->slot))
return 0;
+  if (TT.threadparent && TT.threadparent->extra) {
+    *slot = *(((struct carveup *)TT.threadparent->extra)->slot);
+    // Parent also shows up as a thread, discard duplicate
+    if (*slot == tb->slot[SLOT_tid]) return 0;
+  }

(Dear thunderbird developers, despite having three tabs under
preferences->composition, letting me specify what column to wrap at
never occurred to you. You are _operatically_ bad at user interface stuff.)

Old logic: if this is a thread, if this thread's PID matches the
parent's PID, return 0.

New logic: if this is a thread, copy the parent's PID into this thread's
PID field. (Which is not the same as the TID field.) Then if that PID is
equal to the TID, bail because it's a duplicate (process also showing up
as first thread).

So the only differences afterwards are either we returned early (which
would skip the field) or we assigned a different value to *slot... Which
is then used in filenames for opening all the _other_ files under
/proc/$PID/task and will now all be opening the main thread's files.

Sigh. Ok, switch those to opening tid, not pid. (They're the same for
processes so it should still work in the normal case.)

Should get_sched_policy(*slot, (void *)&slot[SLOT_pcy]) be using the PID
or the TID? I'm not sure if threads have their own scheduling policy or
what, but I'm erring on the side of "what -AT does now", so switching
that to tid too.

$ ./ps -AT 2273
  PID   TID TTY          TIME CMD
 2273  2273 ?        15:53:34 chromium-browse
 2273  2300 ?        00:07:58 sandbox_ipc_thr
 2273  2305 ?        00:00:00 chromium-browse
 2273  2309 ?        00:00:01 gdbus
 2273  2310 ?        00:00:01 NetworkChangeNo

Rob


More information about the Toybox mailing list