wchan for multithreaded process is now ~0ull or "*"
This commit is contained in:
parent
9e52b5aa29
commit
266d5b708a
1
NEWS
1
NEWS
@ -4,6 +4,7 @@ avoid truncating long usernames
|
||||
avoid warning about -lncurses when not linking (more)
|
||||
new names for shared libraries (packagers: watch out!)
|
||||
"make install" no longer rebuilds everything
|
||||
wchan now '*' for multi-threaded processes
|
||||
|
||||
procps-3.2.1 --> procps-3.2.2
|
||||
|
||||
|
12
proc/ksym.c
12
proc/ksym.c
@ -109,9 +109,6 @@ typedef struct symb {
|
||||
unsigned KLONG addr;
|
||||
} symb;
|
||||
|
||||
static const symb fail = { "?", 0 };
|
||||
static const char dash[] = "-";
|
||||
|
||||
/* These mostly rely on POSIX to make them zero. */
|
||||
|
||||
static symb hashtable[256];
|
||||
@ -602,10 +599,14 @@ static const char * read_wchan_file(unsigned pid){
|
||||
|
||||
/***************************************/
|
||||
|
||||
static const symb fail = { .name = "?" };
|
||||
static const char dash[] = "-";
|
||||
static const char star[] = "*";
|
||||
|
||||
#define MAX_OFFSET (0x1000*sizeof(long)) /* past this is generally junk */
|
||||
|
||||
/* return pointer to temporary static buffer with function name */
|
||||
const char * wchan(unsigned KLONG address, unsigned pid) {
|
||||
const char * lookup_wchan(unsigned KLONG address, unsigned pid) {
|
||||
const symb *mod_symb;
|
||||
const symb *map_symb;
|
||||
const symb *good_symb;
|
||||
@ -615,7 +616,8 @@ const char * wchan(unsigned KLONG address, unsigned pid) {
|
||||
// can't cache it due to a race condition :-(
|
||||
if(use_wchan_file) return read_wchan_file(pid);
|
||||
|
||||
if(!address) return dash;
|
||||
if(!address) return dash;
|
||||
if(!~address) return star;
|
||||
|
||||
read_and_parse();
|
||||
hash = (address >> 4) & 0xff; /* got 56/63 hits & 7/63 misses */
|
||||
|
@ -1,3 +1,6 @@
|
||||
# for --version-script
|
||||
# WTF is the syntax for this file?
|
||||
# Give me a BNF, man!
|
||||
_3_1_14 {
|
||||
global:
|
||||
__cyg_profile_func_enter; __cyg_profile_func_exit; main;
|
||||
@ -5,7 +8,7 @@ global:
|
||||
readproc; readtask; readproctab; readproctab2; look_up_our_self; escape_command;
|
||||
escape_str; escape_strlist;
|
||||
openproc; closeproc;
|
||||
tty_to_dev; dev_to_tty; open_psdb_message; open_psdb; wchan;
|
||||
tty_to_dev; dev_to_tty; open_psdb_message; open_psdb; lookup_wchan;
|
||||
display_version; procps_version; linux_version_code;
|
||||
Hertz; smp_num_cpus;
|
||||
sprint_uptime; uptime; user_from_uid; print_uptime; loadavg;
|
||||
|
@ -521,7 +521,12 @@ static proc_t* simple_readproc(PROCTAB *restrict const PT, proc_t *restrict cons
|
||||
}
|
||||
}
|
||||
|
||||
/* some number->text resolving which is time consuming */
|
||||
// if multithreaded, some values are crap
|
||||
if(p->nlwp > 1){
|
||||
p->wchan = (KLONG)~0ull;
|
||||
}
|
||||
|
||||
/* some number->text resolving which is time consuming and kind of insane */
|
||||
if (flags & PROC_FILLUSR){
|
||||
memcpy(p->euser, user_from_uid(p->euid), sizeof p->euser);
|
||||
if(flags & PROC_FILLSTATUS) {
|
||||
@ -531,7 +536,7 @@ static proc_t* simple_readproc(PROCTAB *restrict const PT, proc_t *restrict cons
|
||||
}
|
||||
}
|
||||
|
||||
/* some number->text resolving which is time consuming */
|
||||
/* some number->text resolving which is time consuming and kind of insane */
|
||||
if (flags & PROC_FILLGRP){
|
||||
memcpy(p->egroup, group_from_gid(p->egid), sizeof p->egroup);
|
||||
if(flags & PROC_FILLSTATUS) {
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
EXTERN_C_BEGIN
|
||||
|
||||
extern const char * wchan(unsigned KLONG address, unsigned pid);
|
||||
extern const char * lookup_wchan(unsigned KLONG address, unsigned pid);
|
||||
extern int open_psdb(const char *restrict override);
|
||||
extern int open_psdb_message(const char *restrict override, void (*message)(const char *, ...));
|
||||
|
||||
|
@ -502,7 +502,7 @@ static int pr_wchan(char *restrict const outbuf, const proc_t *restrict const pp
|
||||
*/
|
||||
if(!(pp->wchan & 0xffffff)) return snprintf(outbuf, COLWID, "%s", "-");
|
||||
if(wchan_is_number) return snprintf(outbuf, COLWID, "%x", (unsigned)(pp->wchan) & 0xffffffu);
|
||||
return snprintf(outbuf, COLWID, "%s", wchan(pp->wchan, pp->XXXID));
|
||||
return snprintf(outbuf, COLWID, "%s", lookup_wchan(pp->wchan, pp->XXXID));
|
||||
}
|
||||
|
||||
/* Terrible trunctuation, like BSD crap uses: I999 J999 K999 */
|
||||
@ -704,7 +704,7 @@ static int pr_wname(char *restrict const outbuf, const proc_t *restrict const pp
|
||||
* more than one thread waiting in the kernel.
|
||||
*/
|
||||
if(!(pp->wchan & 0xffffff)) return snprintf(outbuf, COLWID, "%s", "-");
|
||||
return snprintf(outbuf, COLWID, "%s", wchan(pp->wchan, pp->XXXID));
|
||||
return snprintf(outbuf, COLWID, "%s", lookup_wchan(pp->wchan, pp->XXXID));
|
||||
}
|
||||
|
||||
static int pr_nwchan(char *restrict const outbuf, const proc_t *restrict const pp){
|
||||
|
Loading…
Reference in New Issue
Block a user