kvm_proc needs synchronized access
authorNikos Ntarmos <ntarmos@cs.uoi.gr>
Sun, 5 Dec 2010 03:57:38 +0000 (05:57 +0200)
committerPavel Labath <pavelo@centrum.sk>
Thu, 9 Dec 2010 18:00:47 +0000 (19:00 +0100)
Signed-off-by: Nikos Ntarmos <ntarmos@cs.uoi.gr>
Signed-off-by: Pavel Labath <pavelo@centrum.sk>

src/conky.c
src/freebsd.c
src/freebsd.h

index 20f2f67..4015f24 100644 (file)
@@ -5718,6 +5718,7 @@ void initialisation(int argc, char **argv) {
                        "kvm_open")) == NULL) {
                CRIT_ERR(NULL, NULL, "cannot read kvm");
        }
+       pthread_mutex_init(&kvm_proc_mutex, NULL);
 #endif
 
        while (1) {
@@ -6001,6 +6002,7 @@ int main(int argc, char **argv)
 
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
        kvm_close(kd);
+       pthread_mutex_destroy(&kvm_proc_mutex);
 #endif
 
        return 0;
index a8cd8b1..b9426f4 100644 (file)
@@ -266,7 +266,9 @@ int update_total_processes(void)
 {
        int n_processes;
 
+       pthread_mutex_lock(&kvm_proc_mutex);
        kvm_getprocs(kd, KERN_PROC_ALL, 0, &n_processes);
+       pthread_mutex_unlock(&kvm_proc_mutex);
 
        info.procs = n_processes;
        return 0;
@@ -278,6 +280,7 @@ int update_running_processes(void)
        int n_processes;
        int i, cnt = 0;
 
+       pthread_mutex_lock(&kvm_proc_mutex);
        p = kvm_getprocs(kd, KERN_PROC_ALL, 0, &n_processes);
        for (i = 0; i < n_processes; i++) {
 #if (__FreeBSD__ < 5) && (__FreeBSD_kernel__ < 5)
@@ -288,6 +291,7 @@ int update_running_processes(void)
                        cnt++;
                }
        }
+       pthread_mutex_unlock(&kvm_proc_mutex);
 
        info.run_procs = cnt;
        return 0;
@@ -748,6 +752,7 @@ proc_find_top(struct process **cpu, struct process **mem, struct process **time)
                CRIT_ERR(NULL, NULL, "Cannot read sysctl \"vm.stats.vm.v_page_count\"");
        }
 
+       pthread_mutex_lock(&kvm_proc_mutex);
        p = kvm_getprocs(kd, KERN_PROC_PROC, 0, &n_processes);
        processes = malloc(n_processes * sizeof(struct process));
 
@@ -764,6 +769,7 @@ proc_find_top(struct process **cpu, struct process **mem, struct process **time)
                        j++;
                }
        }
+       pthread_mutex_unlock(&kvm_proc_mutex);
 
        qsort(processes, j - 1, sizeof(struct process), comparemem);
        for (i = 0; i < 10 && i < n_processes; i++) {
index 063b131..7b3db6a 100644 (file)
@@ -9,11 +9,13 @@
 #include <sys/ucred.h>
 #include <fcntl.h>
 #include <kvm.h>
+#include <pthread.h>
 #if (defined(i386) || defined(__i386__))
 #include <machine/apm_bios.h>
 #endif /* i386 || __i386__ */
 
 kvm_t *kd;
+pthread_mutex_t kvm_proc_mutex;
 
 int get_entropy_avail(unsigned int *);
 int get_entropy_poolsize(unsigned int *);