summaryrefslogtreecommitdiff
path: root/fs/proc/array.c
diff options
context:
space:
mode:
authorAlbert Cahalan <albert.cahalan@ccur.com>2003-10-14 20:13:33 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-10-14 20:13:33 -0700
commitc31bc22f82e85a4d47547ef1fe8a2642f65a3d2f (patch)
treed32c8e1af25d1f284135e7f70101987b3443199b /fs/proc/array.c
parent1590208444308de5c126d739b9e89b29961c3f10 (diff)
[PATCH] number of threads in /proc
Having the number-of-threads value easily available turns out to be very important for procps performance. The /proc/*/stat thing getting reused has been zero since the 2.2.xx days, and was the seldom-used timeout value before that.
Diffstat (limited to 'fs/proc/array.c')
-rw-r--r--fs/proc/array.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c
index 1eba76a6f603..d26f6590bd05 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -226,6 +226,7 @@ static void collect_sigign_sigcatch(struct task_struct *p, sigset_t *ign,
static inline char * task_sig(struct task_struct *p, char *buffer)
{
sigset_t pending, shpending, blocked, ignored, caught;
+ int num_threads = 0;
sigemptyset(&pending);
sigemptyset(&shpending);
@@ -241,10 +242,13 @@ static inline char * task_sig(struct task_struct *p, char *buffer)
shpending = p->signal->shared_pending.signal;
blocked = p->blocked;
collect_sigign_sigcatch(p, &ignored, &caught);
+ num_threads = atomic_read(&p->signal->count);
spin_unlock_irq(&p->sighand->siglock);
}
read_unlock(&tasklist_lock);
+ buffer += sprintf(buffer, "Threads:\t%d\n", num_threads);
+
/* render them all */
buffer = render_sigset_t("SigPnd:\t", &pending, buffer);
buffer = render_sigset_t("ShdPnd:\t", &shpending, buffer);
@@ -296,6 +300,7 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
char state;
int res;
pid_t ppid;
+ int num_threads = 0;
struct mm_struct *mm;
state = *get_task_state(task);
@@ -324,6 +329,7 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
read_lock(&tasklist_lock);
if (task->sighand) {
spin_lock_irq(&task->sighand->siglock);
+ num_threads = atomic_read(&task->signal->count);
collect_sigign_sigcatch(task, &sigign, &sigcatch);
spin_unlock_irq(&task->sighand->siglock);
}
@@ -338,7 +344,7 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
ppid = task->pid ? task->real_parent->pid : 0;
read_unlock(&tasklist_lock);
res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \
-%lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %llu %lu %ld %lu %lu %lu %lu %lu \
+%lu %lu %lu %lu %lu %ld %ld %ld %ld %d %ld %llu %lu %ld %lu %lu %lu %lu %lu \
%lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu\n",
task->pid,
task->comm,
@@ -359,7 +365,7 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
jiffies_to_clock_t(task->cstime),
priority,
nice,
- 0UL /* removed */,
+ num_threads,
jiffies_to_clock_t(task->it_real_value),
(unsigned long long)
jiffies_64_to_clock_t(task->start_time - INITIAL_JIFFIES),