forked from enlightenment/evisum
FreeBSD: Don't duplicate code.
This commit is contained in:
parent
65f77e1793
commit
226579933b
|
@ -787,69 +787,6 @@ _pid_max(void)
|
||||||
return pid_max;
|
return pid_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_List *
|
|
||||||
_process_list_freebsd_fallback_get(void)
|
|
||||||
{
|
|
||||||
Eina_List *list;
|
|
||||||
struct rusage *usage;
|
|
||||||
struct kinfo_proc kp;
|
|
||||||
int mib[4];
|
|
||||||
size_t len;
|
|
||||||
static int pid_max, pagesize = 0;
|
|
||||||
|
|
||||||
if (!pagesize)
|
|
||||||
pagesize = getpagesize();
|
|
||||||
|
|
||||||
pid_max = _pid_max();
|
|
||||||
|
|
||||||
list = NULL;
|
|
||||||
|
|
||||||
len = sizeof(int);
|
|
||||||
if (sysctlnametomib("kern.proc.pid", mib, &len) == -1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (int i = 1; i <= pid_max; i++)
|
|
||||||
{
|
|
||||||
mib[3] = i;
|
|
||||||
len = sizeof(kp);
|
|
||||||
if (sysctl(mib, 4, &kp, &len, NULL, 0) == -1)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kp.ki_flag & P_KPROC)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Proc_Info *p = calloc(1, sizeof(Proc_Info));
|
|
||||||
if (!p) return NULL;
|
|
||||||
|
|
||||||
p->pid = kp.ki_pid;
|
|
||||||
p->uid = kp.ki_uid;
|
|
||||||
p->command = strdup(kp.ki_comm);
|
|
||||||
p->cpu_id = kp.ki_oncpu;
|
|
||||||
if (p->cpu_id == -1)
|
|
||||||
p->cpu_id = kp.ki_lastcpu;
|
|
||||||
|
|
||||||
usage = &kp.ki_rusage;
|
|
||||||
|
|
||||||
p->cpu_time = (usage->ru_utime.tv_sec * 1000000) +
|
|
||||||
usage->ru_utime.tv_usec + (usage->ru_stime.tv_sec * 1000000) +
|
|
||||||
usage->ru_stime.tv_usec;
|
|
||||||
p->cpu_time /= 10000;
|
|
||||||
p->state = _process_state_name(kp.ki_stat);
|
|
||||||
p->mem_virt = kp.ki_size;
|
|
||||||
p->mem_rss = kp.ki_rssize * pagesize;
|
|
||||||
p->mem_size = p->mem_virt;
|
|
||||||
p->nice = kp.ki_nice - NZERO;
|
|
||||||
p->priority = kp.ki_pri.pri_level - PZERO;
|
|
||||||
p->numthreads = kp.ki_numthreads;
|
|
||||||
|
|
||||||
list = eina_list_append(list, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_cmd_get(Proc_Info *p, struct kinfo_proc *kp)
|
_cmd_get(Proc_Info *p, struct kinfo_proc *kp)
|
||||||
{
|
{
|
||||||
|
@ -898,118 +835,6 @@ _cmd_get(Proc_Info *p, struct kinfo_proc *kp)
|
||||||
p->command = strdup(name);
|
p->command = strdup(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Eina_List *
|
|
||||||
_process_list_freebsd_get(void)
|
|
||||||
{
|
|
||||||
kvm_t *kern;
|
|
||||||
Eina_List *list = NULL;
|
|
||||||
struct kinfo_proc *kps, *kp;
|
|
||||||
struct rusage *usage;
|
|
||||||
char errbuf[_POSIX2_LINE_MAX];
|
|
||||||
int pid_count;
|
|
||||||
static int pagesize = 0;
|
|
||||||
|
|
||||||
if (!pagesize) pagesize = getpagesize();
|
|
||||||
|
|
||||||
kern = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
|
|
||||||
if (!kern)
|
|
||||||
return _process_list_freebsd_fallback_get();
|
|
||||||
|
|
||||||
kps = kvm_getprocs(kern, KERN_PROC_PROC, 0, &pid_count);
|
|
||||||
if (!kps)
|
|
||||||
{
|
|
||||||
kvm_close(kern);
|
|
||||||
return _process_list_freebsd_fallback_get();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < pid_count; i++)
|
|
||||||
{
|
|
||||||
if (kps[i].ki_flag & P_KPROC)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
kp = &kps[i];
|
|
||||||
|
|
||||||
Proc_Info *p = calloc(1, sizeof(Proc_Info));
|
|
||||||
if (!p) continue;
|
|
||||||
p->pid = kp->ki_pid;
|
|
||||||
p->uid = kp->ki_uid;
|
|
||||||
|
|
||||||
p->cpu_id = kp->ki_oncpu;
|
|
||||||
if (p->cpu_id == -1)
|
|
||||||
p->cpu_id = kp->ki_lastcpu;
|
|
||||||
|
|
||||||
_cmd_get(p, kp);
|
|
||||||
|
|
||||||
usage = &kp->ki_rusage;
|
|
||||||
p->cpu_time = (usage->ru_utime.tv_sec * 1000000) +
|
|
||||||
usage->ru_utime.tv_usec + (usage->ru_stime.tv_sec * 1000000) +
|
|
||||||
usage->ru_stime.tv_usec;
|
|
||||||
p->cpu_time /= 10000;
|
|
||||||
p->state = _process_state_name(kp->ki_stat);
|
|
||||||
p->mem_virt = kp->ki_size;
|
|
||||||
p->mem_rss = kp->ki_rssize * pagesize;
|
|
||||||
p->mem_size = p->mem_virt;
|
|
||||||
p->nice = kp->ki_nice - NZERO;
|
|
||||||
p->priority = kp->ki_pri.pri_level - PZERO;
|
|
||||||
p->numthreads = kp->ki_numthreads;
|
|
||||||
|
|
||||||
list = eina_list_append(list, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
kvm_close(kern);
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Proc_Info *
|
|
||||||
_proc_info_by_pid_fallback(int pid)
|
|
||||||
{
|
|
||||||
struct rusage *usage;
|
|
||||||
struct kinfo_proc kp;
|
|
||||||
int mib[4];
|
|
||||||
size_t len;
|
|
||||||
static int pagesize = 0;
|
|
||||||
|
|
||||||
if (!pagesize) pagesize = getpagesize();
|
|
||||||
|
|
||||||
len = sizeof(int);
|
|
||||||
if (sysctlnametomib("kern.proc.pid", mib, &len) == -1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
mib[3] = pid;
|
|
||||||
|
|
||||||
len = sizeof(kp);
|
|
||||||
if (sysctl(mib, 4, &kp, &len, NULL, 0) == -1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
Proc_Info *p = calloc(1, sizeof(Proc_Info));
|
|
||||||
if (!p) return NULL;
|
|
||||||
|
|
||||||
p->pid = kp.ki_pid;
|
|
||||||
p->uid = kp.ki_uid;
|
|
||||||
_cmd_get(p, &kp);
|
|
||||||
p->cpu_id = kp.ki_oncpu;
|
|
||||||
if (p->cpu_id == -1)
|
|
||||||
p->cpu_id = kp.ki_lastcpu;
|
|
||||||
|
|
||||||
usage = &kp.ki_rusage;
|
|
||||||
|
|
||||||
p->cpu_time = (usage->ru_utime.tv_sec * 1000000) + usage->ru_utime.tv_usec +
|
|
||||||
(usage->ru_stime.tv_sec * 1000000) + usage->ru_stime.tv_usec;
|
|
||||||
p->cpu_time /= 10000;
|
|
||||||
p->state = _process_state_name(kp.ki_stat);
|
|
||||||
p->mem_virt = kp.ki_size;
|
|
||||||
p->mem_rss = kp.ki_rssize * pagesize;
|
|
||||||
p->mem_size = p->mem_virt;
|
|
||||||
p->nice = kp.ki_nice - NZERO;
|
|
||||||
p->priority = kp.ki_pri.pri_level - PZERO;
|
|
||||||
p->numthreads = kp.ki_numthreads;
|
|
||||||
p->tid = kp.ki_tid;
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Proc_Info *
|
static Proc_Info *
|
||||||
_proc_thread_info(struct kinfo_proc *kp, Eina_Bool is_thread)
|
_proc_thread_info(struct kinfo_proc *kp, Eina_Bool is_thread)
|
||||||
{
|
{
|
||||||
|
@ -1020,6 +845,7 @@ _proc_thread_info(struct kinfo_proc *kp, Eina_Bool is_thread)
|
||||||
if (!pagesize) pagesize = getpagesize();
|
if (!pagesize) pagesize = getpagesize();
|
||||||
|
|
||||||
p = calloc(1, sizeof(Proc_Info));
|
p = calloc(1, sizeof(Proc_Info));
|
||||||
|
if (!p) return NULL;
|
||||||
|
|
||||||
p->pid = kp->ki_pid;
|
p->pid = kp->ki_pid;
|
||||||
p->uid = kp->ki_uid;
|
p->uid = kp->ki_uid;
|
||||||
|
@ -1050,6 +876,112 @@ _proc_thread_info(struct kinfo_proc *kp, Eina_Bool is_thread)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Eina_List *
|
||||||
|
_process_list_freebsd_fallback_get(void)
|
||||||
|
{
|
||||||
|
Eina_List *list;
|
||||||
|
struct kinfo_proc kp;
|
||||||
|
int mib[4];
|
||||||
|
size_t len;
|
||||||
|
static int pid_max, pagesize = 0;
|
||||||
|
|
||||||
|
if (!pagesize)
|
||||||
|
pagesize = getpagesize();
|
||||||
|
|
||||||
|
pid_max = _pid_max();
|
||||||
|
|
||||||
|
list = NULL;
|
||||||
|
|
||||||
|
len = sizeof(int);
|
||||||
|
if (sysctlnametomib("kern.proc.pid", mib, &len) == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (int i = 1; i <= pid_max; i++)
|
||||||
|
{
|
||||||
|
mib[3] = i;
|
||||||
|
len = sizeof(kp);
|
||||||
|
if (sysctl(mib, 4, &kp, &len, NULL, 0) == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (kp.ki_flag & P_KPROC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Proc_Info *p = _proc_thread_info(&kp, EINA_FALSE);
|
||||||
|
if (p)
|
||||||
|
list = eina_list_append(list, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_List *
|
||||||
|
_process_list_freebsd_get(void)
|
||||||
|
{
|
||||||
|
kvm_t *kern;
|
||||||
|
Eina_List *list = NULL;
|
||||||
|
struct kinfo_proc *kps, *kp;
|
||||||
|
char errbuf[_POSIX2_LINE_MAX];
|
||||||
|
int pid_count;
|
||||||
|
static int pagesize = 0;
|
||||||
|
|
||||||
|
if (!pagesize) pagesize = getpagesize();
|
||||||
|
|
||||||
|
kern = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
|
||||||
|
if (!kern)
|
||||||
|
return _process_list_freebsd_fallback_get();
|
||||||
|
|
||||||
|
kps = kvm_getprocs(kern, KERN_PROC_PROC, 0, &pid_count);
|
||||||
|
if (!kps)
|
||||||
|
{
|
||||||
|
kvm_close(kern);
|
||||||
|
return _process_list_freebsd_fallback_get();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < pid_count; i++)
|
||||||
|
{
|
||||||
|
if (kps[i].ki_flag & P_KPROC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
kp = &kps[i];
|
||||||
|
|
||||||
|
Proc_Info *p = _proc_thread_info(kp, EINA_FALSE);
|
||||||
|
if (p)
|
||||||
|
{
|
||||||
|
_cmd_get(p, kp);
|
||||||
|
list = eina_list_append(list, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kvm_close(kern);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Proc_Info *
|
||||||
|
_proc_info_by_pid_fallback(int pid)
|
||||||
|
{
|
||||||
|
struct kinfo_proc kp;
|
||||||
|
int mib[4];
|
||||||
|
size_t len;
|
||||||
|
static int pagesize = 0;
|
||||||
|
|
||||||
|
if (!pagesize) pagesize = getpagesize();
|
||||||
|
|
||||||
|
len = sizeof(int);
|
||||||
|
if (sysctlnametomib("kern.proc.pid", mib, &len) == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
mib[3] = pid;
|
||||||
|
|
||||||
|
len = sizeof(kp);
|
||||||
|
if (sysctl(mib, 4, &kp, &len, NULL, 0) == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
Proc_Info *p = _proc_thread_info(&kp, EINA_FALSE);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
Proc_Info *
|
Proc_Info *
|
||||||
proc_info_by_pid(int pid)
|
proc_info_by_pid(int pid)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue