diff --git a/src/bin/process.c b/src/bin/process.c index 1c762b0..3dcf352 100644 --- a/src/bin/process.c +++ b/src/bin/process.c @@ -164,16 +164,74 @@ _mem_size(Proc_Info *proc, int pid) fclose(f); } +static void +_cmd_args(Proc_Info *p, int pid, char *name, size_t len) +{ + char line[4096]; + + char *link = ecore_file_readlink(eina_slstr_printf("/proc/%d/exe", pid)); + if (link) + { + snprintf(name, len, "%s", ecore_file_file_get(link)); + free(link); + } + else + { + FILE *f = fopen(eina_slstr_printf("/proc/%d/cmdline", pid), "r"); + if (f) + { + if (fgets(line, sizeof(line), f)) + { + if (ecore_file_exists(line)) + snprintf(name, len, "%s", ecore_file_file_get(line)); + p->arguments = strdup(line); + } + fclose(f); + } + } + + char *end = strchr(name, ' '); + if (end) *end = '\0'; + + p->command = strdup(name); +} + +static int +_uid(int pid) +{ + FILE *f; + int uid; + char line[1024]; + + f = fopen(eina_slstr_printf("/proc/%d/status", pid), "r"); + if (!f) return -1; + + while ((fgets(line, sizeof(line), f)) != NULL) + { + if (!strncmp(line, "Uid:", 4)) + { + uid = _parse_line(line); + break; + } + } + + fclose(f); + + return uid; +} + static Eina_List * _process_list_linux_get(void) { Eina_List *files, *list; FILE *f; - char *n, *link, state, line[4096], name[1024]; - int pid, res, utime, stime, cutime, cstime, uid, psr, pri, nice, numthreads; + char *n; + char state, line[4096], name[1024]; + int pid, res, utime, stime, cutime, cstime, psr, pri, nice, numthreads, dummy; unsigned int mem_virt, mem_rss, flags; int pagesize = getpagesize(); + res = 0; list = NULL; files = ecore_file_ls("/proc"); @@ -189,78 +247,41 @@ _process_list_linux_get(void) if (fgets(line, sizeof(line), f)) { - int dummy; char *end, *start = strchr(line, '(') + 1; end = strchr(line, ')'); + strncpy(name, start, end - start); name[end - start] = '\0'; + res = sscanf(end + 2, "%c %d %d %d %d %d %u %u %u %u %u %d %d %d %d %d %d %u %u %d %u %u %u %u %u %u %u %u %d %d %d %d %u %d %d %d %d %d %d %d %d %d", &state, &dummy, &dummy, &dummy, &dummy, &dummy, &flags, &dummy, &dummy, &dummy, &dummy, &utime, &stime, &cutime, &cstime, &pri, &nice, &numthreads, &dummy, &dummy, &mem_virt, &mem_rss, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &psr, &dummy, &dummy, &dummy, &dummy, &dummy); } - fclose(f); if (res != 42) continue; - if (flags & PF_KTHREAD) continue; - f = fopen(eina_slstr_printf("/proc/%d/status", pid), "r"); - if (!f) continue; - - while ((fgets(line, sizeof(line), f)) != NULL) - { - if (!strncmp(line, "Uid:", 4)) - { - uid = _parse_line(line); - break; - } - } - - fclose(f); - Proc_Info *p = calloc(1, sizeof(Proc_Info)); if (!p) return NULL; - _mem_size(p, pid); - - link = ecore_file_readlink(eina_slstr_printf("/proc/%d/exe", pid)); - if (link) - { - snprintf(name, sizeof(name), "%s", ecore_file_file_get(link)); - free(link); - } - else - { - f = fopen(eina_slstr_printf("/proc/%d/cmdline", pid), "r"); - if (f) - { - if (fgets(line, sizeof(line), f)) - { - if (ecore_file_exists(line)) - snprintf(name, sizeof(name), "%s", ecore_file_file_get(line)); - p->arguments = strdup(line); - } - fclose(f); - } - } - - char *end = strchr(name, ' '); - if (end) *end = '\0'; - p->pid = pid; - p->uid = uid; + p->uid = _uid(pid); p->cpu_id = psr; - p->command = strdup(name); p->state = _process_state_name(state); p->cpu_time = utime + stime; - p->mem_virt = mem_virt; - p->mem_rss = mem_rss * pagesize; p->nice = nice; p->priority = pri; p->numthreads = numthreads; + p->mem_virt = mem_virt; + p->mem_rss = mem_rss * pagesize; + _mem_size(p, pid); + p->mem_size -= p->mem_rss; + + _cmd_args(p, pid, name, sizeof(name)); + list = eina_list_append(list, p); } @@ -274,8 +295,8 @@ Proc_Info * proc_info_by_pid(int pid) { FILE *f; - char *link, state, line[4096], name[1024]; - int res, dummy, utime, stime, cutime, cstime, uid, psr; + char line[4096], name[1024], state; + int res, dummy, utime, stime, cutime, cstime, psr; unsigned int mem_virt, mem_rss, pri, nice, numthreads; f = fopen(eina_slstr_printf("/proc/%d/stat", pid), "r"); @@ -297,57 +318,26 @@ proc_info_by_pid(int pid) if (res != 42) return NULL; - f = fopen(eina_slstr_printf("/proc/%d/status", pid), "r"); - if (!f) return NULL; - - while ((fgets(line, sizeof(line), f)) != NULL) - { - if (!strncmp(line, "Uid:", 4)) - { - uid = _parse_line(line); - break; - } - } - fclose(f); - Proc_Info *p = calloc(1, sizeof(Proc_Info)); if (!p) return NULL; - _mem_size(p, pid); - - link = ecore_file_readlink(eina_slstr_printf("/proc/%d/exe", pid)); - if (link) - { - snprintf(name, sizeof(name), "%s", ecore_file_file_get(link)); - free(link); - } - else - { - f = fopen(eina_slstr_printf("/proc/%d/cmdline", pid), "r"); - if (f) - { - if (fgets(line, sizeof(line), f)) - { - if (ecore_file_exists(line)) - snprintf(name, sizeof(name), "%s", ecore_file_file_get(line)); - p->arguments = strdup(line); - } - fclose(f); - } - } - p->pid = pid; - p->uid = uid; + p->uid = _uid(pid); p->cpu_id = psr; - p->command = strdup(name); p->state = _process_state_name(state); p->cpu_time = utime + stime; + p->mem_virt = mem_virt; p->mem_rss = mem_rss * getpagesize(); + _mem_size(p, pid); + p->mem_size -= p->mem_rss; + p->priority = pri; p->nice = nice; p->numthreads = numthreads; + _cmd_args(p, pid, name, sizeof(name)); + return p; } diff --git a/src/bin/ui.c b/src/bin/ui.c index 2b9953a..8947825 100644 --- a/src/bin/ui.c +++ b/src/bin/ui.c @@ -60,7 +60,7 @@ _system_stats(void *data, Ecore_Thread *thread) results_t *results = system_stats_get(); if (!results) { - ui_shutdown(ui); + ecore_main_loop_quit(); return; } @@ -1067,8 +1067,6 @@ _process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, void *ms ui = data; - if (ui->shutting_down) return; - eina_lock_take(&_lock); list = proc_info_all_get(); @@ -1088,12 +1086,6 @@ _process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, void *ms } } - if (ui->shutting_down) - { - eina_lock_release(&_lock); - return; - } - _genlist_ensure_n_items(ui->genlist_procs, eina_list_count(list)); it = elm_genlist_first_item_get(ui->genlist_procs); @@ -1370,9 +1362,6 @@ _process_panel_update(void *data) ui = data; - if (ui->shutting_down) - return ECORE_CALLBACK_CANCEL; - proc = proc_info_by_pid(ui->selected_pid); if (!proc) { @@ -2836,7 +2825,7 @@ _evisum_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) if (!strcmp(ev->keyname, "Escape")) { - ui_shutdown(ui); + ecore_main_loop_quit(); return; } @@ -2872,7 +2861,8 @@ ui_shutdown(Ui *ui) evas_object_del(ui->win); - ui->shutting_down = EINA_TRUE; + if (ui->timer_pid) + ecore_timer_del(ui->timer_pid); if (ui->thread_system) ecore_thread_cancel(ui->thread_system); @@ -2900,8 +2890,6 @@ ui_shutdown(Ui *ui) eina_list_free(ui->item_cache); eina_lock_free(&_lock); - - ecore_main_loop_quit(); } static void diff --git a/src/bin/ui.h b/src/bin/ui.h index 9aa8014..6c1665b 100644 --- a/src/bin/ui.h +++ b/src/bin/ui.h @@ -145,7 +145,6 @@ typedef struct Ui Sort_Type sort_type; Eina_Bool sort_reverse; Eina_Bool panel_visible; - Eina_Bool shutting_down; Eina_Bool searching; Eina_Bool show_self;