ui: waste not want not.

We can use a list to store PID cpu times.
This commit is contained in:
Alastair Poole 2020-02-24 17:22:22 +00:00
parent 71d161f4a1
commit 4258353949
2 changed files with 116 additions and 45 deletions

View File

@ -13,33 +13,6 @@
static Eina_Lock _lock;
void
ui_shutdown(Ui *ui)
{
evas_object_del(ui->win);
ui->shutting_down = EINA_TRUE;
if (ui->thread_system)
ecore_thread_cancel(ui->thread_system);
if (ui->thread_process)
ecore_thread_cancel(ui->thread_process);
if (ui->thread_system)
ecore_thread_wait(ui->thread_system, 1.0);
if (ui->thread_process)
ecore_thread_wait(ui->thread_process, 1.0);
for (int i = 0; i < PROCESS_INFO_FIELDS; i++)
free(ui->text_fields[i]);
eina_lock_free(&_lock);
ecore_main_loop_quit();
}
static void
_system_stats(void *data, Ecore_Thread *thread)
{
@ -590,16 +563,6 @@ _sort_by_state(const void *p1, const void *p2)
return strcmp(inf1->state, inf2->state);
}
static void
_text_fields_init(Ui *ui)
{
for (int i = 0; i < PROCESS_INFO_FIELDS; i++)
{
ui->text_fields[i] = malloc(TEXT_FIELD_MAX * sizeof(char));
ui->text_fields[i][0] = '\0';
}
}
static void
_entry_cmd_size_set(Ui *ui)
{
@ -625,6 +588,16 @@ _entry_cmd_size_set(Ui *ui)
}
}
static void
_text_fields_init(Ui *ui)
{
for (int i = 0; i < PROCESS_INFO_FIELDS; i++)
{
ui->text_fields[i] = malloc(TEXT_FIELD_MAX * sizeof(char));
ui->text_fields[i][0] = '\0';
}
}
static void
_text_fields_append(Ui *ui, Proc_Stats *proc)
{
@ -689,6 +662,13 @@ _text_fields_clear(Ui *ui)
ui->text_fields[i][0] = '\0';
}
static void
_text_fields_free(Ui *ui)
{
for (int i = 0; i < PROCESS_INFO_FIELDS; i++)
free(ui->text_fields[i]);
}
static Eina_List *
_list_sort(Ui *ui, Eina_List *list)
{
@ -746,6 +726,72 @@ _list_sort(Ui *ui, Eina_List *list)
return list;
}
typedef struct {
pid_t pid;
int64_t cpu_time_prev;
} pid_cpu_time_t;
static void
_proc_pid_cpu_times_free(Ui *ui)
{
pid_cpu_time_t *tmp;
EINA_LIST_FREE(ui->cpu_times, tmp)
{
free(tmp);
}
if (ui->cpu_times)
eina_list_free(ui->cpu_times);
}
static void
_proc_pid_cpu_time_save(Ui *ui, Proc_Stats *proc)
{
Eina_List *l;
pid_cpu_time_t *tmp;
EINA_LIST_FOREACH(ui->cpu_times, l, tmp)
{
if (tmp->pid == proc->pid)
{
tmp->cpu_time_prev = proc->cpu_time;
return;
}
}
tmp = calloc(1, sizeof(pid_cpu_time_t));
if (tmp)
{
tmp->pid = proc->pid;
tmp->cpu_time_prev = proc->cpu_time;
ui->cpu_times = eina_list_append(ui->cpu_times, tmp);
}
}
static void
_proc_pid_cpu_usage_get(Ui *ui, Proc_Stats *proc)
{
Eina_List *l;
pid_cpu_time_t *tmp;
EINA_LIST_FOREACH(ui->cpu_times, l, tmp)
{
if (tmp->pid == proc->pid)
{
if (tmp->cpu_time_prev && proc->cpu_time > tmp->cpu_time_prev)
{
proc->cpu_usage = (double) (proc->cpu_time - tmp->cpu_time_prev) /
ui->poll_delay;
}
_proc_pid_cpu_time_save(ui, proc);
return;
}
}
_proc_pid_cpu_time_save(ui, proc);
}
static void
_process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, void *msg EINA_UNUSED)
{
@ -761,10 +807,7 @@ _process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, void *ms
EINA_LIST_FOREACH(list, l, proc)
{
int64_t time_prev = ui->cpu_times[proc->pid];
if (time_prev && proc->cpu_time > time_prev)
proc->cpu_usage = (double)(proc->cpu_time - time_prev) / ui->poll_delay;
ui->cpu_times[proc->pid] = proc->cpu_time;
_proc_pid_cpu_usage_get(ui, proc);
}
list = _list_sort(ui, list);
@ -778,11 +821,11 @@ _process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, void *ms
if (list)
eina_list_free(list);
_entry_cmd_size_set(ui);
_text_fields_show(ui);
_text_fields_clear(ui);
_entry_cmd_size_set(ui);
eina_lock_release(&_lock);
}
@ -837,6 +880,7 @@ _btn_icon_state_set(Evas_Object *button, Eina_Bool reverse)
elm_icon_standard_set(icon, _icon_path_get("go-up"));
elm_object_part_content_set(button, "icon", icon);
evas_object_show(icon);
}
@ -2351,6 +2395,33 @@ _evisum_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
ui->data_unit = DATA_UNIT_GB;
}
void
ui_shutdown(Ui *ui)
{
evas_object_del(ui->win);
ui->shutting_down = EINA_TRUE;
if (ui->thread_system)
ecore_thread_cancel(ui->thread_system);
if (ui->thread_process)
ecore_thread_cancel(ui->thread_process);
if (ui->thread_system)
ecore_thread_wait(ui->thread_system, 1.0);
if (ui->thread_process)
ecore_thread_wait(ui->thread_process, 1.0);
_text_fields_free(ui);
_proc_pid_cpu_times_free(ui);
eina_lock_free(&_lock);
ecore_main_loop_quit();
}
static void
_ui_launch(Ui *ui)
{
@ -2391,7 +2462,7 @@ _ui_init(Evas_Object *parent)
_text_fields_init(ui);
memset(ui->cpu_times, 0, PID_MAX * sizeof(int64_t));
ui->cpu_times = NULL;
/* UI content creation */
_ui_tabs_add(parent, ui);

View File

@ -136,7 +136,7 @@ typedef struct Ui
Eina_Bool skip_wait;
int64_t cpu_times[PID_MAX];
Eina_List *cpu_times;
int64_t pid_cpu_time;
int poll_delay;