Make unsupported run

This commit is contained in:
David Hunt 2015-07-12 11:26:33 -05:00 committed by Hisham Muhammad
parent 5e602f18d5
commit feb7a01fd3
6 changed files with 159 additions and 31 deletions

View File

@ -1,6 +1,7 @@
/* /*
htop - unsupported/Platform.c htop - unsupported/Platform.c
(C) 2014 Hisham H. Muhammad (C) 2014 Hisham H. Muhammad
(C) 2015 David C. Hunt
Released under the GNU GPL, see the COPYING file Released under the GNU GPL, see the COPYING file
in the source distribution for its full text. in the source distribution for its full text.
*/ */
@ -21,9 +22,36 @@ in the source distribution for its full text.
#include "UnsupportedProcess.h" #include "UnsupportedProcess.h"
}*/ }*/
void Platform_setBindings(Htop_Action* keys) { ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 };
(void) keys;
} ProcessFieldData Process_fields[] = {
[0] = { .name = "", .title = NULL, .description = NULL, .flags = 0, },
[PID] = { .name = "PID", .title = " PID ", .description = "Process/thread ID", .flags = 0, },
[COMM] = { .name = "Command", .title = "Command ", .description = "Command line", .flags = 0, },
[STATE] = { .name = "STATE", .title = "S ", .description = "Process state (S sleeping, R running, D disk, Z zombie, T traced, W paging)", .flags = 0, },
[PPID] = { .name = "PPID", .title = " PPID ", .description = "Parent process ID", .flags = 0, },
[PGRP] = { .name = "PGRP", .title = " PGRP ", .description = "Process group ID", .flags = 0, },
[SESSION] = { .name = "SESSION", .title = " SESN ", .description = "Process's session ID", .flags = 0, },
[TTY_NR] = { .name = "TTY_NR", .title = " TTY ", .description = "Controlling terminal", .flags = 0, },
[TPGID] = { .name = "TPGID", .title = " TPGID ", .description = "Process ID of the fg process group of the controlling terminal", .flags = 0, },
[MINFLT] = { .name = "MINFLT", .title = " MINFLT ", .description = "Number of minor faults which have not required loading a memory page from disk", .flags = 0, },
[MAJFLT] = { .name = "MAJFLT", .title = " MAJFLT ", .description = "Number of major faults which have required loading a memory page from disk", .flags = 0, },
[PRIORITY] = { .name = "PRIORITY", .title = "PRI ", .description = "Kernel's internal priority for the process", .flags = 0, },
[NICE] = { .name = "NICE", .title = " NI ", .description = "Nice value (the higher the value, the more it lets other processes take priority)", .flags = 0, },
[STARTTIME] = { .name = "STARTTIME", .title = "START ", .description = "Time the process was started", .flags = 0, },
[PROCESSOR] = { .name = "PROCESSOR", .title = "CPU ", .description = "Id of the CPU the process last executed on", .flags = 0, },
[M_SIZE] = { .name = "M_SIZE", .title = " VIRT ", .description = "Total program size in virtual memory", .flags = 0, },
[M_RESIDENT] = { .name = "M_RESIDENT", .title = " RES ", .description = "Resident set size, size of the text and data sections, plus stack usage", .flags = 0, },
[ST_UID] = { .name = "ST_UID", .title = " UID ", .description = "User ID of the process owner", .flags = 0, },
[PERCENT_CPU] = { .name = "PERCENT_CPU", .title = "CPU% ", .description = "Percentage of the CPU time the process used in the last sampling", .flags = 0, },
[PERCENT_MEM] = { .name = "PERCENT_MEM", .title = "MEM% ", .description = "Percentage of the memory the process is using, based on resident memory size", .flags = 0, },
[USER] = { .name = "USER", .title = "USER ", .description = "Username of the process owner (or user ID if name cannot be determined)", .flags = 0, },
[TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, },
[NLWP] = { .name = "NLWP", .title = "NLWP ", .description = "Number of threads in the process", .flags = 0, },
[TGID] = { .name = "TGID", .title = " TGID ", .description = "Thread group ID (i.e. process ID)", .flags = 0, },
[100] = { .name = "*** report bug! ***", .title = NULL, .description = NULL, .flags = 0, },
};
MeterClass* Platform_meterTypes[] = { MeterClass* Platform_meterTypes[] = {
&CPUMeter_class, &CPUMeter_class,
@ -46,8 +74,16 @@ MeterClass* Platform_meterTypes[] = {
NULL NULL
}; };
void Platform_setBindings(Htop_Action* keys) {
(void) keys;
}
int Platform_numberOfFields = 100;
char* Process_pidFormat = "%7u ";
char* Process_tpgidFormat = "%7u ";
int Platform_getUptime() { int Platform_getUptime() {
return -1; return 0;
} }
void Platform_getLoadAverage(double* one, double* five, double* fifteen) { void Platform_getLoadAverage(double* one, double* five, double* fifteen) {
@ -57,6 +93,44 @@ void Platform_getLoadAverage(double* one, double* five, double* fifteen) {
} }
int Platform_getMaxPid() { int Platform_getMaxPid() {
return -1; return 1;
}
void Process_setupColumnWidths() {
int maxPid = Platform_getMaxPid();
if (maxPid == -1) return;
if (maxPid > 99999) {
Process_fields[PID].title = " PID ";
Process_fields[PPID].title = " PPID ";
Process_fields[TPGID].title = " TPGID ";
Process_fields[TGID].title = " TGID ";
Process_fields[PGRP].title = " PGRP ";
Process_fields[SESSION].title = " SESN ";
Process_pidFormat = "%7u ";
Process_tpgidFormat = "%7d ";
} else {
Process_fields[PID].title = " PID ";
Process_fields[PPID].title = " PPID ";
Process_fields[TPGID].title = "TPGID ";
Process_fields[TGID].title = " TGID ";
Process_fields[PGRP].title = " PGRP ";
Process_fields[SESSION].title = " SESN ";
Process_pidFormat = "%5u ";
Process_tpgidFormat = "%5d ";
}
}
double Platform_setCPUValues(Meter* this, int cpu) {
return 0.0;
}
void Platform_setMemoryValues(Meter* this) {
}
void Platform_setSwapValues(Meter* this) {
}
bool Process_isThread(Process* this) {
return false;
} }

View File

@ -5,6 +5,7 @@
/* /*
htop - unsupported/Platform.h htop - unsupported/Platform.h
(C) 2014 Hisham H. Muhammad (C) 2014 Hisham H. Muhammad
(C) 2015 David C. Hunt
Released under the GNU GPL, see the COPYING file Released under the GNU GPL, see the COPYING file
in the source distribution for its full text. in the source distribution for its full text.
*/ */
@ -13,14 +14,33 @@ in the source distribution for its full text.
#include "BatteryMeter.h" #include "BatteryMeter.h"
#include "UnsupportedProcess.h" #include "UnsupportedProcess.h"
void Platform_setBindings(Htop_Action* keys); extern ProcessField Platform_defaultFields[];
extern ProcessFieldData Process_fields[];
extern MeterClass* Platform_meterTypes[]; extern MeterClass* Platform_meterTypes[];
void Platform_setBindings(Htop_Action* keys);
extern int Platform_numberOfFields;
extern char* Process_pidFormat;
extern char* Process_tpgidFormat;
int Platform_getUptime(); int Platform_getUptime();
void Platform_getLoadAverage(double* one, double* five, double* fifteen); void Platform_getLoadAverage(double* one, double* five, double* fifteen);
int Platform_getMaxPid(); int Platform_getMaxPid();
void Process_setupColumnWidths();
double Platform_setCPUValues(Meter* this, int cpu);
void Platform_setMemoryValues(Meter* this);
void Platform_setSwapValues(Meter* this);
bool Process_isThread(Process* this);
#endif #endif

View File

@ -10,25 +10,21 @@ in the source distribution for its full text.
#include <stdlib.h> #include <stdlib.h>
/*{ /*{
#include "Settings.h"
typedef struct UnsupportedProcess_ {
Process super;
// add platform-specific fields here
} UnsupportedProcess;
#define Process_delete UnsupportedProcess_delete #define Process_delete UnsupportedProcess_delete
}*/ }*/
UnsupportedProcess* UnsupportedProcess_new(Settings* settings) { Process* UnsupportedProcess_new(Settings* settings) {
UnsupportedProcess* this = calloc(sizeof(UnsupportedProcess), 1); Process* this = calloc(sizeof(Process), 1);
Object_setClass(this, Class(Process)); Object_setClass(this, Class(Process));
Process_init(&this->super, settings); Process_init(this, settings);
return this; return this;
} }
void UnsupportedProcess_delete(Object* cast) { void UnsupportedProcess_delete(Object* cast) {
UnsupportedProcess* this = (UnsupportedProcess*) cast; Process* this = (Process*) cast;
Object_setClass(this, Class(Process)); Object_setClass(this, Class(Process));
Process_done((Process*)cast); Process_done((Process*)cast);
// free platform-specific fields here // free platform-specific fields here

View File

@ -9,15 +9,13 @@ Released under the GNU GPL, see the COPYING file
in the source distribution for its full text. in the source distribution for its full text.
*/ */
#include "Settings.h"
typedef struct UnsupportedProcess_ {
Process super;
// add platform-specific fields here
} UnsupportedProcess;
#define Process_delete UnsupportedProcess_delete #define Process_delete UnsupportedProcess_delete
Process* UnsupportedProcess_new(Settings* settings);
void UnsupportedProcess_delete(Object* cast); void UnsupportedProcess_delete(Object* cast);

View File

@ -6,22 +6,18 @@ in the source distribution for its full text.
*/ */
#include "ProcessList.h" #include "ProcessList.h"
#include "UnsupportedProcess.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
/*{ /*{
}*/ }*/
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList) { ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, uid_t userId) {
ProcessList* this = calloc(1, sizeof(ProcessList)); ProcessList* this = calloc(1, sizeof(ProcessList));
ProcessList_init(this, usersTable, pidWhiteList); ProcessList_init(this, Class(Process), usersTable, pidWhiteList, userId);
// Update CPU count:
this->cpuCount = 1;
this->cpus = calloc(1, sizeof(CPUData));
this->cpus[0].totalTime = 1;
this->cpus[0].totalPeriod = 1;
return this; return this;
} }
@ -31,7 +27,49 @@ void ProcessList_delete(ProcessList* this) {
free(this); free(this);
} }
void ProcessList_scan(ProcessList* this) { void ProcessList_goThroughEntries(ProcessList* super) {
bool preExisting = true;
Process *proc;
proc = ProcessList_getProcess(super, 1, &preExisting, UnsupportedProcess_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;
}
void UnsupportedProcessList_scan(ProcessList* this) {
(void) this; (void) this;
// stub! // stub!
} }

View File

@ -11,10 +11,12 @@ in the source distribution for its full text.
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList); ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, uid_t userId);
void ProcessList_delete(ProcessList* this); void ProcessList_delete(ProcessList* this);
void ProcessList_scan(ProcessList* this); void ProcessList_goThroughEntries(ProcessList* super);
void UnsupportedProcessList_scan(ProcessList* this);
#endif #endif