diff options
author | David Hunt <dhunt@iolanthe.attlocal.net> | 2015-07-13 01:17:14 -0500 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2015-08-19 13:51:49 -0300 |
commit | 43ef703f034be4e347ab94250101cd8f23409952 (patch) | |
tree | 157b1c2180b056ef0c1d45bf80c47b3808175689 /darwin/DarwinProcessList.c | |
parent | 70e7c8db592408f45b958238d4bbf0048886f6fc (diff) |
Start supporting actual data
Diffstat (limited to 'darwin/DarwinProcessList.c')
-rw-r--r-- | darwin/DarwinProcessList.c | 140 |
1 files changed, 101 insertions, 39 deletions
diff --git a/darwin/DarwinProcessList.c b/darwin/DarwinProcessList.c index 3fb36365..6187d346 100644 --- a/darwin/DarwinProcessList.c +++ b/darwin/DarwinProcessList.c @@ -11,16 +11,85 @@ in the source distribution for its full text. #include <stdlib.h> #include <string.h> +#include <unistd.h> +#include <stdio.h> +#include <libproc.h> /*{ +#include <mach/mach_host.h> +#include <sys/sysctl.h> + +typedef struct DarwinProcessList_ { + ProcessList super; + + host_basic_info_data_t prev_hinfo; + processor_info_data_t prev_cpus; +} DarwinProcessList; }*/ +void ProcessList_getHostInfo(host_basic_info_data_t *p) { + mach_msg_type_number_t info_size = HOST_BASIC_INFO_COUNT; + + if(0 != host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)p, &info_size)) { + fprintf(stderr, "Unable to retrieve host info\n"); + exit(2); + } +} + +unsigned ProcessList_getCPUInfo(processor_info_data_t *p) { + mach_msg_type_number_t info_size = PROCESSOR_CPU_LOAD_INFO_COUNT; + unsigned cpu_count; + + if(0 != host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &cpu_count, (processor_info_array_t *)p, &info_size)) { + fprintf(stderr, "Unable to retrieve CPU info\n"); + exit(4); + } + + return cpu_count; +} + +struct kinfo_proc *ProcessList_getKInfoProcs(size_t *count) { + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; + struct kinfo_proc *processes = NULL; + + /* Note the two calls to sysctl(). One to get length and one to get the + * data. This -does- mean that the second call could end up with a missing + * process entry or two. + */ + *count = 0; + if(0 > sysctl(mib, 4, NULL, count, NULL, 0)) { + fprintf(stderr, "Unable to get size of kproc_infos"); + exit(5); + } + + processes = (struct kinfo_proc *)malloc(*count); + if(NULL == processes) { + fprintf(stderr, "Out of memory for kproc_infos\n"); + exit(6); + } + + if(0 > sysctl(mib, 4, processes, count, NULL, 0)) { + fprintf(stderr, "Unable to get kinfo_procs\n"); + exit(7); + } + + *count = *count / sizeof(struct kinfo_proc); + + return processes; +} + + ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, uid_t userId) { - ProcessList* this = calloc(1, sizeof(ProcessList)); - ProcessList_init(this, Class(Process), usersTable, pidWhiteList, userId); + DarwinProcessList* this = calloc(1, sizeof(DarwinProcessList)); + + ProcessList_init(&this->super, Class(Process), usersTable, pidWhiteList, userId); - return this; + /* Initialize the previous information */ + this->super.cpuCount = ProcessList_getCPUInfo(&this->prev_cpus); + ProcessList_getHostInfo(&this->prev_hinfo); + + return &this->super; } void ProcessList_delete(ProcessList* this) { @@ -29,43 +98,36 @@ void ProcessList_delete(ProcessList* this) { } void ProcessList_goThroughEntries(ProcessList* super) { + DarwinProcessList *dpl = (DarwinProcessList *)super; bool preExisting = true; + struct kinfo_proc *ps; + size_t count; Process *proc; + struct timeval tv; + + gettimeofday(&tv, NULL); /* Start processing time */ + + /* We use kinfo_procs for initial data since : + * + * 1) They always succeed. + * 2) The contain the basic information. + * + * We attempt to fill-in additional information with libproc. + */ + ps = ProcessList_getKInfoProcs(&count); + + for(size_t i = 0; i < count; ++i) { + proc = ProcessList_getProcess(super, ps[i].kp_proc.p_pid, &preExisting, DarwinProcess_new); + + DarwinProcess_setFromKInfoProc(proc, ps + i, tv.tv_sec, preExisting); + DarwinProcess_setFromLibprocPidinfo(proc, dpl->prev_hinfo.max_mem, preExisting); + + if(!preExisting) { + proc->user = UsersTable_getRef(super->usersTable, proc->st_uid); + + ProcessList_add(super, proc); + } + } - proc = ProcessList_getProcess(super, 1, &preExisting, DarwinProcess_new); - - /* Empty values */ - proc->time = proc->time + 10; - proc->pid = 1; - proc->ppid = 1; - proc->tgid = 0; - proc->comm = "<unsupported architecture>"; - proc->basenameOffset = 0; - proc->updated = true; - - proc->state = 'R'; - proc->show = true; /* Reflected in proc->settings-> "hideXXX" really */ - proc->pgrp = 0; - proc->session = 0; - proc->tty_nr = 0; - proc->tpgid = 0; - proc->st_uid = 0; - proc->flags = 0; - proc->processor = 0; - - proc->percent_cpu = 2.5; - proc->percent_mem = 2.5; - proc->user = "nobody"; - - proc->priority = 0; - proc->nice = 0; - proc->nlwp = 1; - strncpy(proc->starttime_show, "Jun 01 ", sizeof(proc->starttime_show)); - proc->starttime_ctime = 1433116800; // Jun 01, 2015 - - proc->m_size = 100; - proc->m_resident = 100; - - proc->minflt = 20; - proc->majflt = 20; + free(ps); } |