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 _______________________________________________ Toybox mailing list Toybox@lists.landley.net http://lists.landley.net/listinfo.cgi/toybox-landley.net