summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2006-07-12 01:16:03 +0000
committerHisham Muhammad <hisham@gobolinux.org>2006-07-12 01:16:03 +0000
commitdbe2670b69e163cb146d3fc3b3c7b82ea3f71278 (patch)
tree6c9163067c52e387b24593f545fa2c549e4b4acf
parente46f1426b906433c291de05432de9a9a43e14f4a (diff)
Perform RichString operations by hand.
Avoid unnecessary operations when processing entries on ProcessList.
-rw-r--r--CPUMeter.c2
-rw-r--r--Hashtable.c13
-rw-r--r--Hashtable.h4
-rw-r--r--LoadAverageMeter.c4
-rw-r--r--MemoryMeter.c2
-rw-r--r--Meter.c2
-rw-r--r--Panel.c13
-rw-r--r--Process.c2
-rw-r--r--ProcessList.c50
-rw-r--r--RichString.c51
-rw-r--r--RichString.h9
-rw-r--r--SwapMeter.c2
-rw-r--r--TasksMeter.c2
13 files changed, 64 insertions, 92 deletions
diff --git a/CPUMeter.c b/CPUMeter.c
index 53fad310..363da6ac 100644
--- a/CPUMeter.c
+++ b/CPUMeter.c
@@ -81,7 +81,7 @@ void CPUMeter_setValues(Meter* this, char* buffer, int size) {
void CPUMeter_display(Object* cast, RichString* out) {
char buffer[50];
Meter* this = (Meter*)cast;
- RichString_prune(out);
+ RichString_init(out);
sprintf(buffer, "%5.1f%% ", this->values[1]);
RichString_append(out, CRT_colors[METER_TEXT], ":");
RichString_append(out, CRT_colors[CPU_NORMAL], buffer);
diff --git a/Hashtable.c b/Hashtable.c
index f971c8c2..30218a52 100644
--- a/Hashtable.c
+++ b/Hashtable.c
@@ -16,7 +16,6 @@ in the source distribution for its full text.
typedef struct Hashtable_ Hashtable;
typedef void(*Hashtable_PairFunction)(int, void*, void*);
-typedef int(*Hashtable_HashAlgorithm)(Hashtable*, int);
typedef struct HashtableItem {
int key;
@@ -28,7 +27,6 @@ struct Hashtable_ {
int size;
HashtableItem** buckets;
int items;
- Hashtable_HashAlgorithm hashAlgorithm;
bool owner;
};
}*/
@@ -49,15 +47,10 @@ Hashtable* Hashtable_new(int size, bool owner) {
this = (Hashtable*) malloc(sizeof(Hashtable));
this->size = size;
this->buckets = (HashtableItem**) calloc(sizeof(HashtableItem*), size);
- this->hashAlgorithm = Hashtable_hashAlgorithm;
this->owner = owner;
return this;
}
-int Hashtable_hashAlgorithm(Hashtable* this, int key) {
- return key % this->size;
-}
-
void Hashtable_delete(Hashtable* this) {
for (int i = 0; i < this->size; i++) {
HashtableItem* walk = this->buckets[i];
@@ -78,7 +71,7 @@ inline int Hashtable_size(Hashtable* this) {
}
void Hashtable_put(Hashtable* this, int key, void* value) {
- int index = this->hashAlgorithm(this, key);
+ int index = key % this->size;
HashtableItem** bucketPtr = &(this->buckets[index]);
while (true)
if (*bucketPtr == NULL) {
@@ -95,7 +88,7 @@ void Hashtable_put(Hashtable* this, int key, void* value) {
}
void* Hashtable_remove(Hashtable* this, int key) {
- int index = this->hashAlgorithm(this, key);
+ int index = key % this->size;
HashtableItem** bucketPtr = &(this->buckets[index]);
while (true)
if (*bucketPtr == NULL) {
@@ -118,7 +111,7 @@ void* Hashtable_remove(Hashtable* this, int key) {
}
//#include <stdio.h>
inline void* Hashtable_get(Hashtable* this, int key) {
- int index = this->hashAlgorithm(this, key);
+ int index = key % this->size;
HashtableItem* bucketPtr = this->buckets[index];
// fprintf(stderr, "%d -> %d\n", key, index);
while (true) {
diff --git a/Hashtable.h b/Hashtable.h
index a5f2434d..df481f2d 100644
--- a/Hashtable.h
+++ b/Hashtable.h
@@ -18,7 +18,6 @@ in the source distribution for its full text.
typedef struct Hashtable_ Hashtable;
typedef void(*Hashtable_PairFunction)(int, void*, void*);
-typedef int(*Hashtable_HashAlgorithm)(Hashtable*, int);
typedef struct HashtableItem {
int key;
@@ -30,7 +29,6 @@ struct Hashtable_ {
int size;
HashtableItem** buckets;
int items;
- Hashtable_HashAlgorithm hashAlgorithm;
bool owner;
};
@@ -38,8 +36,6 @@ HashtableItem* HashtableItem_new(int key, void* value);
Hashtable* Hashtable_new(int size, bool owner);
-int Hashtable_hashAlgorithm(Hashtable* this, int key);
-
void Hashtable_delete(Hashtable* this);
inline int Hashtable_size(Hashtable* this);
diff --git a/LoadAverageMeter.c b/LoadAverageMeter.c
index 1fbfd4ac..ab06bebd 100644
--- a/LoadAverageMeter.c
+++ b/LoadAverageMeter.c
@@ -60,7 +60,7 @@ void LoadAverageMeter_setValues(Meter* this, char* buffer, int size) {
void LoadAverageMeter_display(Object* cast, RichString* out) {
Meter* this = (Meter*)cast;
char buffer[20];
- RichString_prune(out);
+ RichString_init(out);
sprintf(buffer, "%.2f ", this->values[2]);
RichString_append(out, CRT_colors[LOAD_AVERAGE_FIFTEEN], buffer);
sprintf(buffer, "%.2f ", this->values[1]);
@@ -81,7 +81,7 @@ void LoadMeter_setValues(Meter* this, char* buffer, int size) {
void LoadMeter_display(Object* cast, RichString* out) {
Meter* this = (Meter*)cast;
char buffer[20];
- RichString_prune(out);
+ RichString_init(out);
sprintf(buffer, "%.2f ", ((Meter*)this)->values[0]);
RichString_append(out, CRT_colors[LOAD], buffer);
}
diff --git a/MemoryMeter.c b/MemoryMeter.c
index a0498f51..617fc521 100644
--- a/MemoryMeter.c
+++ b/MemoryMeter.c
@@ -55,7 +55,7 @@ void MemoryMeter_display(Object* cast, RichString* out) {
long int usedMem = this->values[0] / div;
long int buffersMem = this->values[1] / div;
long int cachedMem = this->values[2] / div;
- RichString_prune(out);
+ RichString_init(out);
RichString_append(out, CRT_colors[METER_TEXT], ":");
sprintf(buffer, format, totalMem);
RichString_append(out, CRT_colors[METER_VALUE], buffer);
diff --git a/Meter.c b/Meter.c
index 1d447f87..0e9ef05f 100644
--- a/Meter.c
+++ b/Meter.c
@@ -206,7 +206,7 @@ static inline void Meter_displayToStringBuffer(Meter* this, char* buffer) {
if (display) {
display((Object*)this, &Meter_stringBuffer);
} else {
- RichString_prune(&Meter_stringBuffer);
+ RichString_initVal(Meter_stringBuffer);
RichString_append(&Meter_stringBuffer, CRT_colors[type->attributes[0]], buffer);
}
}
diff --git a/Panel.c b/Panel.c
index fef7018b..f014fca7 100644
--- a/Panel.c
+++ b/Panel.c
@@ -96,16 +96,12 @@ void Panel_init(Panel* this, int x, int y, int w, int h, char* type, bool owner)
void Panel_done(Panel* this) {
assert (this != NULL);
- RichString_delete(this->header);
Vector_delete(this->items);
}
inline void Panel_setRichHeader(Panel* this, RichString header) {
assert (this != NULL);
- if (this->header.len > 0) {
- RichString_delete(this->header);
- }
this->header = header;
this->needsRedraw = true;
}
@@ -274,7 +270,8 @@ void Panel_draw(Panel* this, bool focus) {
for(int i = first, j = 0; j < this->h && i < last; i++, j++) {
Object* itemObj = Vector_get(this->items, i);
- RichString itemRef = RichString_new();
+ RichString itemRef;
+ RichString_initVal(itemRef);
itemObj->display(itemObj, &itemRef);
int amt = MIN(itemRef.len - scrollH, this->w);
if (i == this->selected) {
@@ -296,10 +293,12 @@ void Panel_draw(Panel* this, bool focus) {
} else {
Object* oldObj = Vector_get(this->items, this->oldSelected);
- RichString oldRef = RichString_new();
+ RichString oldRef;
+ RichString_initVal(oldRef);
oldObj->display(oldObj, &oldRef);
Object* newObj = Vector_get(this->items, this->selected);
- RichString newRef = RichString_new();
+ RichString newRef;
+ RichString_initVal(newRef);
newObj->display(newObj, &newRef);
mvhline(y+ this->oldSelected - this->scrollV, x+0, ' ', this->w);
if (scrollH < oldRef.len)
diff --git a/Process.c b/Process.c
index 7707a1a1..9d5e0aa1 100644
--- a/Process.c
+++ b/Process.c
@@ -150,7 +150,7 @@ void Process_delete(Object* cast) {
void Process_display(Object* cast, RichString* out) {
Process* this = (Process*) cast;
ProcessField* fields = this->pl->fields;
- RichString_prune(out);
+ RichString_init(out);
for (int i = 0; fields[i]; i++)
Process_writeField(this, out, fields[i]);
if (this->pl->shadowOtherUsers && this->st_uid != getuid())
diff --git a/ProcessList.c b/ProcessList.c
index d6984568..c2c6433c 100644
--- a/ProcessList.c
+++ b/ProcessList.c
@@ -177,7 +177,7 @@ ProcessList* ProcessList_new(UsersTable* usersTable) {
ProcessList* this;
this = malloc(sizeof(ProcessList));
this->processes = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare);
- this->processTable = Hashtable_new(20, false);
+ this->processTable = Hashtable_new(70, false);
this->prototype = Process_new(this);
this->usersTable = usersTable;
@@ -265,7 +265,8 @@ void ProcessList_invertSortOrder(ProcessList* this) {
}
RichString ProcessList_printHeader(ProcessList* this) {
- RichString out = RichString_new();
+ RichString out;
+ RichString_init(&out);
ProcessField* fields = this->fields;
for (int i = 0; fields[i]; i++) {
char* field = Process_printField(fields[i]);
@@ -505,31 +506,9 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl
process->pid = pid;
if (! ProcessList_readStatusFile(this, process, dirname, name))
goto errorReadingProcess;
- char* username = UsersTable_getRef(this->usersTable, process->st_uid);
- if (username) {
- strncpy(process->user, username, PROCESS_USER_LEN);
- } else {
- snprintf(process->user, PROCESS_USER_LEN, "%d", process->st_uid);
- }
}
process->updated = true;
- int lasttimes = (process->utime + process->stime);
-
- snprintf(statusfilename, MAX_NAME, "%s/%s/stat", dirname, name);
-
- status = ProcessList_fopen(this, statusfilename, "r");
- if (status == NULL)
- goto errorReadingProcess;
-
- int success = ProcessList_readStatFile(this, process, status, command);
- fclose(status);
- if(!success)
- goto errorReadingProcess;
-
- process->percent_cpu = (process->utime + process->stime - lasttimes) /
- period * 100.0;
-
snprintf(statusfilename, MAX_NAME, "%s/%s/statm", dirname, name);
status = ProcessList_fopen(this, statusfilename, "r");
@@ -548,7 +527,27 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl
if (this->hideKernelThreads && process->m_size == 0)
goto errorReadingProcess;
+ int lasttimes = (process->utime + process->stime);
+
+ snprintf(statusfilename, MAX_NAME, "%s/%s/stat", dirname, name);
+
+ status = ProcessList_fopen(this, statusfilename, "r");
+ if (status == NULL)
+ goto errorReadingProcess;
+
+ int success = ProcessList_readStatFile(this, process, status, command);
+ fclose(status);
+ if(!success)
+ goto errorReadingProcess;
+
if(!existingProcess) {
+ char* username = UsersTable_getRef(this->usersTable, process->st_uid);
+ if (username) {
+ strncpy(process->user, username, PROCESS_USER_LEN);
+ } else {
+ snprintf(process->user, PROCESS_USER_LEN, "%d", process->st_uid);
+ }
+
snprintf(statusfilename, MAX_NAME, "%s/%s/cmdline", dirname, name);
status = ProcessList_fopen(this, statusfilename, "r");
if (!status) {
@@ -567,6 +566,9 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl
fclose(status);
}
+ process->percent_cpu = (process->utime + process->stime - lasttimes) /
+ period * 100.0;
+
process->percent_mem = process->m_resident /
(float)(this->usedMem - this->cachedMem - this->buffersMem) *
100.0;
diff --git a/RichString.c b/RichString.c
index 1ee22bfa..3bdc82b4 100644
--- a/RichString.c
+++ b/RichString.c
@@ -12,6 +12,9 @@
/*{
+#define RichString_init(this) (this)->len = 0
+#define RichString_initVal(this) (this).len = 0
+
typedef struct RichString_ {
int len;
chtype chstr[RICHSTRING_MAXLEN+1];
@@ -23,23 +26,8 @@ typedef struct RichString_ {
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
-static WINDOW* workArea = NULL;
-
-RichString RichString_new() {
- RichString this;
- this.len = 0;
- return this;
-}
-
-void RichString_delete(RichString this) {
-}
-
-void RichString_prune(RichString* this) {
- this->len = 0;
-}
-
void RichString_write(RichString* this, int attrs, char* data) {
- this->len = 0;
+ RichString_init(this);
RichString_append(this, attrs, data);
}
@@ -48,35 +36,32 @@ inline void RichString_append(RichString* this, int attrs, char* data) {
}
inline void RichString_appendn(RichString* this, int attrs, char* data, int len) {
- if (!workArea) {
- workArea = newpad(1, RICHSTRING_MAXLEN);
- }
- assert(workArea);
- wattrset(workArea, attrs);
- int maxToWrite = (RICHSTRING_MAXLEN - 1) - this->len;
- int wrote = MIN(maxToWrite, len);
- mvwaddnstr(workArea, 0, 0, data, maxToWrite);
- int oldstrlen = this->len;
- this->len += wrote;
- mvwinchnstr(workArea, 0, 0, this->chstr + oldstrlen, wrote);
- wattroff(workArea, attrs);
+ int last = MIN(RICHSTRING_MAXLEN - 1, len + this->len);
+ for (int i = this->len, j = 0; i < last; i++, j++)
+ this->chstr[i] = data[j] | attrs;
+ this->chstr[last] = 0;
+ this->len = last;
}
void RichString_setAttr(RichString *this, int attrs) {
+ chtype* ch = this->chstr;
for (int i = 0; i < this->len; i++) {
- char c = this->chstr[i];
- this->chstr[i] = c | attrs;
+ *ch = (*ch & 0xff) | attrs;
+ ch++;
}
}
void RichString_applyAttr(RichString *this, int attrs) {
- for (int i = 0; i < this->len - 1; i++) {
- this->chstr[i] |= attrs;
+ chtype* ch = this->chstr;
+ for (int i = 0; i < this->len; i++) {
+ *ch |= attrs;
+ ch++;
}
}
RichString RichString_quickString(int attrs, char* data) {
- RichString str = RichString_new();
+ RichString str;
+ RichString_initVal(str);
RichString_write(&str, attrs, data);
return str;
}
diff --git a/RichString.h b/RichString.h
index 64ad7aff..1f486781 100644
--- a/RichString.h
+++ b/RichString.h
@@ -14,6 +14,9 @@
#define RICHSTRING_MAXLEN 300
+#define RichString_init(this) (this)->len = 0
+#define RichString_initVal(this) (this).len = 0
+
typedef struct RichString_ {
int len;
chtype chstr[RICHSTRING_MAXLEN+1];
@@ -24,12 +27,6 @@ typedef struct RichString_ {
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
-RichString RichString_new();
-
-void RichString_delete(RichString this);
-
-void RichString_prune(RichString* this);
-
void RichString_write(RichString* this, int attrs, char* data);
inline void RichString_append(RichString* this, int attrs, char* data);
diff --git a/SwapMeter.c b/SwapMeter.c
index b66197e1..e7f827be 100644
--- a/SwapMeter.c
+++ b/SwapMeter.c
@@ -46,7 +46,7 @@ void SwapMeter_display(Object* cast, RichString* out) {
char buffer[50];
Meter* this = (Meter*)cast;
long int swap = (long int) this->values[0];
- RichString_prune(out);
+ RichString_init(out);
RichString_append(out, CRT_colors[METER_TEXT], ":");
sprintf(buffer, "%ldM ", (long int) this->total / 1024);
RichString_append(out, CRT_colors[METER_VALUE], buffer);
diff --git a/TasksMeter.c b/TasksMeter.c
index 9766ddfa..5b99432f 100644
--- a/TasksMeter.c
+++ b/TasksMeter.c
@@ -38,7 +38,7 @@ void TasksMeter_setValues(Meter* this, char* buffer, int len) {
void TasksMeter_display(Object* cast, RichString* out) {
Meter* this = (Meter*)cast;
- RichString_prune(out);
+ RichString_init(out);
char buffer[20];
sprintf(buffer, "%d", (int)this->total);
RichString_append(out, CRT_colors[METER_VALUE], buffer);

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