kvm_proc needs synchronized access
[monky] / src / freebsd.c
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++) {