]> git.hungrycats.org Git - linux/commitdiff
[PATCH] number of threads in /proc
authorAlbert Cahalan <albert.cahalan@ccur.com>
Wed, 15 Oct 2003 03:13:33 +0000 (20:13 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Wed, 15 Oct 2003 03:13:33 +0000 (20:13 -0700)
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.

fs/proc/array.c

index 1eba76a6f603b0b044a7e414a59a976ad3da7659..d26f6590bd058889a09bca6f96ca3dd6ea1ad4da 100644 (file)
@@ -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),