summaryrefslogtreecommitdiffstats
path: root/darwin/DarwinProcessList.c
diff options
context:
space:
mode:
authorDavid Hunt <dhunt@iolanthe.attlocal.net>2015-07-13 01:17:14 -0500
committerHisham Muhammad <hisham@gobolinux.org>2015-08-19 13:51:49 -0300
commit43ef703f034be4e347ab94250101cd8f23409952 (patch)
tree157b1c2180b056ef0c1d45bf80c47b3808175689 /darwin/DarwinProcessList.c
parent70e7c8db592408f45b958238d4bbf0048886f6fc (diff)
Start supporting actual data
Diffstat (limited to 'darwin/DarwinProcessList.c')
-rw-r--r--darwin/DarwinProcessList.c140
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);
}

© 2014-2024 Faster IT GmbH | imprint | privacy policy