mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-11-17 18:45:10 +00:00
index processes in a hash table for faster lookup
This commit is contained in:
parent
596449c902
commit
d163293f66
87
src/top.c
87
src/top.c
@ -36,6 +36,73 @@ static unsigned long g_time = 0;
|
|||||||
static unsigned long long previous_total = 0;
|
static unsigned long long previous_total = 0;
|
||||||
static struct process *first_process = 0;
|
static struct process *first_process = 0;
|
||||||
|
|
||||||
|
/* a simple hash table to speed up find_process() */
|
||||||
|
struct proc_hash_entry {
|
||||||
|
struct proc_hash_entry *next;
|
||||||
|
struct process *proc;
|
||||||
|
};
|
||||||
|
static struct proc_hash_entry proc_hash_table[256];
|
||||||
|
|
||||||
|
static void hash_process(struct process *p)
|
||||||
|
{
|
||||||
|
struct proc_hash_entry *phe;
|
||||||
|
static char first_run = 1;
|
||||||
|
|
||||||
|
/* better make sure all next pointers are zero upon first access */
|
||||||
|
if (first_run) {
|
||||||
|
memset(proc_hash_table, 0, sizeof(struct proc_hash_entry) * 256);
|
||||||
|
first_run = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the bucket head */
|
||||||
|
phe = &proc_hash_table[p->pid % 256];
|
||||||
|
|
||||||
|
/* find the bucket's end */
|
||||||
|
while (phe->next)
|
||||||
|
phe = phe->next;
|
||||||
|
|
||||||
|
/* append process */
|
||||||
|
phe->next = malloc(sizeof(struct proc_hash_entry));
|
||||||
|
memset(phe->next, 0, sizeof(struct proc_hash_entry));
|
||||||
|
phe->next->proc = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void unhash_process(struct process *p)
|
||||||
|
{
|
||||||
|
struct proc_hash_entry *phe, *tmp;
|
||||||
|
|
||||||
|
/* get the bucket head */
|
||||||
|
phe = &proc_hash_table[p->pid % 256];
|
||||||
|
|
||||||
|
/* find the entry pointing to p and drop it */
|
||||||
|
while (phe->next) {
|
||||||
|
if (phe->next->proc == p) {
|
||||||
|
tmp = phe->next;
|
||||||
|
phe->next = phe->next->next;
|
||||||
|
free(tmp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
phe = phe->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __unhash_all_processes(struct proc_hash_entry *phe)
|
||||||
|
{
|
||||||
|
if (phe->next)
|
||||||
|
__unhash_all_processes(phe->next);
|
||||||
|
free(phe->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void unhash_all_processes(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
__unhash_all_processes(&proc_hash_table[i]);
|
||||||
|
proc_hash_table[i].next = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct process *get_first_process(void)
|
struct process *get_first_process(void)
|
||||||
{
|
{
|
||||||
return first_process;
|
return first_process;
|
||||||
@ -54,6 +121,9 @@ void free_all_processes(void)
|
|||||||
pr = next;
|
pr = next;
|
||||||
}
|
}
|
||||||
first_process = NULL;
|
first_process = NULL;
|
||||||
|
|
||||||
|
/* drop the whole hash table */
|
||||||
|
unhash_all_processes();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct process *get_process_by_name(const char *name)
|
struct process *get_process_by_name(const char *name)
|
||||||
@ -70,13 +140,13 @@ struct process *get_process_by_name(const char *name)
|
|||||||
|
|
||||||
static struct process *find_process(pid_t pid)
|
static struct process *find_process(pid_t pid)
|
||||||
{
|
{
|
||||||
struct process *p = first_process;
|
struct proc_hash_entry *phe;
|
||||||
|
|
||||||
while (p) {
|
phe = &proc_hash_table[pid % 256];
|
||||||
if (p->pid == pid) {
|
while (phe->next) {
|
||||||
return p;
|
if (phe->next->proc->pid == pid)
|
||||||
}
|
return phe->next->proc;
|
||||||
p = p->next;
|
phe = phe->next;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -111,6 +181,9 @@ static struct process *new_process(int p)
|
|||||||
|
|
||||||
/* process_find_name(process); */
|
/* process_find_name(process); */
|
||||||
|
|
||||||
|
/* add the process to the hash table */
|
||||||
|
hash_process(process);
|
||||||
|
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,6 +488,8 @@ static void delete_process(struct process *p)
|
|||||||
if (p->name) {
|
if (p->name) {
|
||||||
free(p->name);
|
free(p->name);
|
||||||
}
|
}
|
||||||
|
/* remove the process from the hash table */
|
||||||
|
unhash_process(p);
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user