proc: files

This commit is contained in:
Alastair Poole 2021-02-26 08:14:58 +00:00
parent 8fbf26f0ff
commit ceeb71c90a
5 changed files with 118 additions and 21 deletions

View File

@ -299,6 +299,19 @@ _stat(const char *path, Stat *st)
return 1;
}
static int
_n_files(Proc_Info *p)
{
char buf[4096];
snprintf(buf, sizeof(buf), "/proc/%d/fd", p->pid);
p->fds = ecore_file_ls(buf);
if (p->fds)
p->numfiles = eina_list_count(p->fds);
return p->numfiles;
}
static Eina_List *
_process_list_linux_get(void)
{
@ -334,13 +347,14 @@ _process_list_linux_get(void)
p->cpu_id = st.psr;
p->start = st.start_time;
p->run_time = st.run_time;
if (toupper(st.state) == 'S') p->ssleep = 1;
if (toupper(st.state) == 'S') p->ssleep = 1;
state = _process_state_name(st.state);
snprintf(p->state, sizeof(p->state), "%s", state);
p->cpu_time = st.utime + st.stime;
p->nice = st.nice;
p->priority = st.pri;
p->numthreads = st.numthreads;
p->numfiles = _n_files(p);
if (st.flags & PF_KTHREAD)
p->is_kernel = 1;
_mem_size(p);
@ -374,7 +388,7 @@ _proc_thread_info(Proc_Info *p)
Proc_Info *t = calloc(1, sizeof(Proc_Info));
if (!t) continue;
t->cpu_id = st.psr;
if (toupper(st.state) == 'S') p->ssleep = 1;
if (toupper(st.state) == 'S') p->ssleep = 1;
state = _process_state_name(st.state);
snprintf(t->state, sizeof(t->state), "%s", state);
t->cpu_time = st.utime + st.stime;
@ -418,6 +432,7 @@ proc_info_by_pid(int pid)
p->priority = st.pri;
p->nice = st.nice;
p->numthreads = st.numthreads;
p->numfiles = _n_files(p);
if (st.flags & PF_KTHREAD) p->is_kernel = 1;
_mem_size(p);
_cmd_args(p, st.name, sizeof(st.name));
@ -1089,13 +1104,12 @@ void
proc_info_free(Proc_Info *proc)
{
Proc_Info *t;
char *s;
if (!proc) return;
EINA_LIST_FREE(proc->threads, t)
{
proc_info_free(t);
}
proc_info_free(t);
if (proc->command)
free(proc->command);
@ -1104,6 +1118,9 @@ proc_info_free(Proc_Info *proc)
if (proc->thread_name)
free(proc->thread_name);
EINA_LIST_FREE(proc->fds, s)
free(s);
free(proc);
}
@ -1291,6 +1308,16 @@ proc_sort_by_threads(const void *p1, const void *p2)
return inf1->numthreads - inf2->numthreads;
}
int
proc_sort_by_files(const void *p1, const void *p2)
{
const Proc_Info *inf1, *inf2;
inf1 = p1; inf2 = p2;
return inf1->numfiles - inf2->numfiles;
}
int
proc_sort_by_size(const void *p1, const void *p2)
{

View File

@ -33,6 +33,9 @@ typedef struct _Proc_Info
int ssleep;
char state[32];
Eina_List *fds;
int numfiles;
short is_kernel;
int tid;
char *thread_name;
@ -83,6 +86,9 @@ proc_sort_by_cpu(const void *p1, const void *p2);
int
proc_sort_by_threads(const void *p1, const void *p2);
int
proc_sort_by_files(const void *p1, const void *p2);
int
proc_sort_by_size(const void *p1, const void *p2);

View File

@ -66,6 +66,7 @@ typedef struct
Evas_Object *btn_cpu;
Evas_Object *btn_pri;
Evas_Object *btn_nice;
Evas_Object *btn_files;
Evas_Object *btn_size;
Evas_Object *btn_virt;
Evas_Object *btn_rss;
@ -122,14 +123,16 @@ _field_name(Proc_Field id)
return _("Priority");
case PROC_FIELD_NICE:
return _("Nice");
case PROC_FIELD_FILES:
return _("Open files");
case PROC_FIELD_SIZE:
return _("Size");
return _("Memory Size");
case PROC_FIELD_VIRT:
return _("Virtual");
return _("Memory Virtual");
case PROC_FIELD_RSS:
return _("Reserved");
return _("Memory Reserved");
case PROC_FIELD_SHARED:
return _("Shared");
return _("Memory Shared");
case PROC_FIELD_STATE:
return _("State");
case PROC_FIELD_TIME:
@ -390,6 +393,11 @@ _item_create(Evas_Object *obj)
lb = _item_column_add(tb, "proc_nice", i++);
evas_object_size_hint_align_set(lb, 1.0, FILL);
}
if (_field_enabled(PROC_FIELD_FILES))
{
lb = _item_column_add(tb, "proc_files", i++);
evas_object_size_hint_align_set(lb, 1.0, FILL);
}
if (_field_enabled(PROC_FIELD_SIZE))
{
lb = _item_column_add(tb, "proc_size", i++);
@ -583,6 +591,18 @@ _content_get(void *data, Evas_Object *obj, const char *source)
evas_object_show(lb);
}
if (_field_enabled(PROC_FIELD_FILES))
{
evas_object_geometry_get(pd->btn_nice, NULL, NULL, &w, NULL);
lb = evas_object_data_get(it->obj, "proc_files");
snprintf(buf, sizeof(buf), "%d", proc->numfiles);
if (strcmp(buf, elm_object_text_get(lb)))
elm_object_text_set(lb, buf);
rec = evas_object_data_get(lb, "rec");
evas_object_size_hint_min_set(rec, w, 1);
evas_object_show(lb);
}
if (_field_enabled(PROC_FIELD_SIZE))
{
evas_object_geometry_get(pd->btn_size, NULL, NULL, &w, NULL);
@ -1122,6 +1142,19 @@ _btn_nice_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
_btn_clicked_state_save(pd, pd->btn_nice);
}
static void
_btn_files_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Data *pd = data;
Ui *ui = pd->ui;
if (ui->proc.sort_type == PROC_SORT_BY_FILES)
ui->proc.sort_reverse = !ui->proc.sort_reverse;
ui->proc.sort_type = PROC_SORT_BY_FILES;
_btn_clicked_state_save(pd, pd->btn_files);
}
static void
_btn_size_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
@ -1608,6 +1641,19 @@ _content_add(Ui_Data *pd, Evas_Object *parent)
_btn_nice_clicked_cb, pd);
_fields[PROC_FIELD_NICE].btn = btn;
pd->btn_files = btn = elm_button_add(parent);
_btn_icon_state_init(btn,
(ui->proc.sort_type == PROC_SORT_BY_FILES ?
ui->proc.sort_reverse : 0),
ui->proc.sort_type == PROC_SORT_BY_FILES);
evas_object_size_hint_weight_set(btn, 1.0, 0);
evas_object_size_hint_align_set(btn, FILL, FILL);
elm_object_text_set(btn, _("files"));
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked",
_btn_files_clicked_cb, pd);
_fields[PROC_FIELD_FILES].btn = btn;
pd->btn_size = btn = elm_button_add(parent);
_btn_icon_state_init(btn,
(ui->proc.sort_type == PROC_SORT_BY_SIZE ?
@ -2064,12 +2110,13 @@ static void
_init(Ui_Data *pd)
{
pd->sorters[PROC_SORT_BY_NONE].sort_cb = proc_sort_by_pid;
pd->sorters[PROC_SORT_BY_PID].sort_cb = proc_sort_by_pid;
pd->sorters[PROC_SORT_BY_UID].sort_cb = proc_sort_by_uid;
pd->sorters[PROC_SORT_BY_NICE].sort_cb = proc_sort_by_nice;
pd->sorters[PROC_SORT_BY_PRI].sort_cb = proc_sort_by_pri;
pd->sorters[PROC_SORT_BY_CPU].sort_cb = proc_sort_by_cpu;
pd->sorters[PROC_SORT_BY_PID].sort_cb = proc_sort_by_pid;
pd->sorters[PROC_SORT_BY_THREADS].sort_cb = proc_sort_by_threads;
pd->sorters[PROC_SORT_BY_CPU].sort_cb = proc_sort_by_cpu;
pd->sorters[PROC_SORT_BY_PRI].sort_cb = proc_sort_by_pri;
pd->sorters[PROC_SORT_BY_NICE].sort_cb = proc_sort_by_nice;
pd->sorters[PROC_SORT_BY_FILES].sort_cb = proc_sort_by_files;
pd->sorters[PROC_SORT_BY_SIZE].sort_cb = proc_sort_by_size;
pd->sorters[PROC_SORT_BY_VIRT].sort_cb = proc_sort_by_virt;
pd->sorters[PROC_SORT_BY_RSS].sort_cb = proc_sort_by_rss;

View File

@ -13,6 +13,7 @@ typedef enum
PROC_SORT_BY_CPU,
PROC_SORT_BY_PRI,
PROC_SORT_BY_NICE,
PROC_SORT_BY_FILES,
PROC_SORT_BY_SIZE,
PROC_SORT_BY_VIRT,
PROC_SORT_BY_RSS,
@ -32,14 +33,15 @@ typedef enum
PROC_FIELD_CPU = 5,
PROC_FIELD_PRI = 6,
PROC_FIELD_NICE = 7,
PROC_FIELD_SIZE = 8,
PROC_FIELD_VIRT = 9,
PROC_FIELD_RSS = 10,
PROC_FIELD_SHARED = 11,
PROC_FIELD_STATE = 12,
PROC_FIELD_TIME = 13,
PROC_FIELD_CPU_USAGE = 14,
PROC_FIELD_MAX = 15,
PROC_FIELD_FILES = 8,
PROC_FIELD_SIZE = 9,
PROC_FIELD_VIRT = 10,
PROC_FIELD_RSS = 11,
PROC_FIELD_SHARED = 12,
PROC_FIELD_STATE = 13,
PROC_FIELD_TIME = 14,
PROC_FIELD_CPU_USAGE = 15,
PROC_FIELD_MAX = 16,
} Proc_Field;
void

View File

@ -39,6 +39,7 @@ typedef struct
Evas_Object *entry_uid;
Evas_Object *entry_cpu;
Evas_Object *entry_threads;
Evas_Object *entry_files;
Evas_Object *entry_virt;
Evas_Object *entry_rss;
Evas_Object *entry_shared;
@ -838,6 +839,8 @@ static void
_general_view_update(Ui_Data *pd, Proc_Info *proc)
{
struct passwd *pwd_entry;
Eina_List *l;
char *s;
if (!strcmp(proc->state, "stop"))
{
@ -869,6 +872,13 @@ _general_view_update(Ui_Data *pd, Proc_Info *proc)
elm_object_text_set(pd->general.entry_ppid, eina_slstr_printf("%d", proc->ppid));
elm_object_text_set(pd->general.entry_threads,
eina_slstr_printf("%d", proc->numthreads));
Eina_Strbuf *b = eina_strbuf_new();
EINA_LIST_FOREACH(proc->fds, l, s)
eina_strbuf_append_printf(b, "%s ", s);
if (eina_strbuf_length_get(b))
elm_object_text_set(pd->general.entry_files, eina_strbuf_string_get(b));
eina_strbuf_free(b);
elm_object_text_set(pd->general.entry_virt, evisum_size_format(proc->mem_virt));
elm_object_text_set(pd->general.entry_rss, evisum_size_format(proc->mem_rss));
#if !defined(__linux__)
@ -1117,6 +1127,11 @@ _general_tab_add(Evas_Object *parent, Ui_Data *pd)
pd->general.entry_threads = entry = _entry_add(parent);
elm_table_pack(tb, entry, 1, i++, 1, 1);
lb = _lb_add(parent, _("Files:"));
elm_table_pack(tb, lb, 0, i, 1, 1);
pd->general.entry_files = entry = _entry_add(parent);
elm_table_pack(tb, entry, 1, i++, 1, 1);
lb = _lb_add(parent, _(" Memory :"));
elm_table_pack(tb, lb, 0, i, 1, 1);
pd->general.entry_size = entry = _entry_add(parent);