everything: Changes.

This commit is contained in:
Alastair Poole 2020-04-14 18:24:27 +01:00
parent 0ff9d44b39
commit a597212e9f
12 changed files with 692 additions and 374 deletions

13
NEWS
View File

@ -1,3 +1,16 @@
============
Evisum 0.3.4
============
* Offer kvm_openfiles means of obtaining PID list on
FreeBSD-based platforms. This requires specific
permissions (s+g kmem). We fallback if that fails.
* Get rid of the horrible entry-based process list and
use a genlist (meh).
* Save settings upon exit (kb/mb/gb) and sorting.
* UI Changes (Too many labels and progress bars).
* Other stuff.
============ ============
Evisum 0.3.2 Evisum 0.3.2
============ ============

View File

@ -1 +1 @@
0.3.2 0.3.4

View File

@ -12,7 +12,7 @@ host_os = host_machine.system()
deps = dependency('elementary', version: efl_version) deps = dependency('elementary', version: efl_version)
deps_os = declare_dependency(link_args : [] ) deps_os = declare_dependency(link_args : [] )
if host_os == 'openbsd' if host_os == 'openbsd' or host_os == 'freebsd' or host_os == 'dragonfly'
deps_os = declare_dependency(link_args : [ '-lkvm' ]) deps_os = declare_dependency(link_args : [ '-lkvm' ])
endif endif

70
src/bin/configuration.c Normal file
View File

@ -0,0 +1,70 @@
#include "config.h"
#include "configuration.h"
#include <Eina.h>
#include <Ecore_File.h>
#include <Efreet.h>
static const char *
_config_file_path(void)
{
const char *path = eina_slstr_printf("%s/evisum", efreet_config_home_get());
if (!ecore_file_exists(path))
ecore_file_mkpath(path);
path = eina_slstr_printf("%s/evisum/evisum.cfg", efreet_config_home_get());
return path;
}
void
config_init(void)
{
efreet_init();
}
void
config_shutdown(void)
{
efreet_shutdown();
}
Evisum_Config *
config_load(void)
{
Eet_File *f;
int size;
Evisum_Config *cfg = NULL;
const char *path = _config_file_path();
if (!ecore_file_exists(path))
{
cfg = calloc(1, sizeof(Evisum_Config));
cfg->version = CONFIG_VERSION;
f = eet_open(path, EET_FILE_MODE_WRITE);
eet_write(f, "Config", cfg, sizeof(Evisum_Config), 0);
eet_close(f);
}
else
{
f = eet_open(path, EET_FILE_MODE_READ);
if (!f) exit(127);
cfg = eet_read(f, "Config", &size);
eet_close(f);
}
return cfg;
}
Eina_Bool
config_save(Evisum_Config *cfg)
{
Eet_File *f;
const char *path = _config_file_path();
f = eet_open(path, EET_FILE_MODE_WRITE);
if (!f) exit(127);
eet_write(f, "Config", cfg, sizeof(Evisum_Config), 0);
eet_close(f);
return EINA_TRUE;
}

21
src/bin/configuration.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef __CONFIGURATION_H__
#define __CONFIGURATION_H__
#include "ui.h"
#define CONFIG_VERSION 0x0001
typedef struct _Evisum_Config
{
int version;
int sort_type;
Eina_Bool sort_reverse;
int data_unit;
} Evisum_Config;
void config_init(void);
void config_shutdown(void);
Evisum_Config *config_load(void);
Eina_Bool config_save(Evisum_Config *);
#endif

View File

@ -7,6 +7,7 @@
*/ */
#include "config.h" #include "config.h"
#include "configuration.h"
#include "ui.h" #include "ui.h"
static void static void
@ -47,6 +48,7 @@ main(int argc, char **argv)
eina_init(); eina_init();
ecore_init(); ecore_init();
config_init();
elm_init(argc, argv); elm_init(argc, argv);
ui = _win_add(); ui = _win_add();
@ -57,6 +59,7 @@ main(int argc, char **argv)
} }
elm_shutdown(); elm_shutdown();
config_shutdown();
ecore_shutdown(); ecore_shutdown();
eina_shutdown(); eina_shutdown();

View File

@ -1,6 +1,8 @@
inc = include_directories('.', '../..') inc = include_directories('.', '../..')
executable('evisum', [ executable('evisum', [
'configuration.c',
'configuration.h',
'disks.c', 'disks.c',
'disks.h', 'disks.h',
'process.c', 'process.c',

View File

@ -9,7 +9,9 @@
# include <sys/proc.h> # include <sys/proc.h>
#endif #endif
#if defined(__OpenBSD__) #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
# include <unistd.h>
# include <fcntl.h>
# include <kvm.h> # include <kvm.h>
# include <limits.h> # include <limits.h>
# include <sys/proc.h> # include <sys/proc.h>
@ -34,6 +36,10 @@
#include <Ecore.h> #include <Ecore.h>
#include <Ecore_File.h> #include <Ecore_File.h>
#if defined(__linux__) && !defined(PF_KTHREAD)
# define PF_KTHREAD 0x00200000
#endif
static const char * static const char *
_process_state_name(char state) _process_state_name(char state)
{ {
@ -142,7 +148,7 @@ _process_list_linux_get(void)
FILE *f; FILE *f;
char *name, *link, state, line[4096], program_name[1024]; char *name, *link, state, line[4096], program_name[1024];
int pid, res, utime, stime, cutime, cstime, uid, psr, pri, nice, numthreads; int pid, res, utime, stime, cutime, cstime, uid, psr, pri, nice, numthreads;
unsigned int mem_size, mem_rss; unsigned int mem_size, mem_rss, flags;
int pagesize = getpagesize(); int pagesize = getpagesize();
list = NULL; list = NULL;
@ -165,9 +171,8 @@ _process_list_linux_get(void)
end = strchr(line, ')'); end = strchr(line, ')');
strncpy(program_name, start, end - start); strncpy(program_name, start, end - start);
program_name[end - start] = '\0'; program_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", 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, &dummy, &dummy, &dummy, &dummy, &dummy, &utime, &stime, &cutime, &cstime, &state, &dummy, &dummy, &dummy, &dummy, &dummy, &flags, &dummy, &dummy, &dummy, &dummy, &utime, &stime, &cutime, &cstime,
&pri, &nice, &numthreads, &dummy, &dummy, &mem_size, &mem_rss, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &pri, &nice, &numthreads, &dummy, &dummy, &mem_size, &mem_rss, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy,
&dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &psr, &dummy, &dummy, &dummy, &dummy, &dummy); &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &psr, &dummy, &dummy, &dummy, &dummy, &dummy);
} }
@ -176,6 +181,8 @@ _process_list_linux_get(void)
if (res != 42) continue; if (res != 42) continue;
if (flags & PF_KTHREAD) continue;
f = fopen(eina_slstr_printf("/proc/%d/status", pid), "r"); f = fopen(eina_slstr_printf("/proc/%d/status", pid), "r");
if (!f) continue; if (!f) continue;
@ -210,6 +217,9 @@ _process_list_linux_get(void)
} }
} }
char *end = strchr(program_name, ' ');
if (end) *end = '\0';
Proc_Stats *p = calloc(1, sizeof(Proc_Stats)); Proc_Stats *p = calloc(1, sizeof(Proc_Stats));
if (!p) return NULL; if (!p) return NULL;
@ -489,7 +499,7 @@ proc_info_by_pid(int pid)
#if defined(__FreeBSD__) || defined(__DragonFly__) #if defined(__FreeBSD__) || defined(__DragonFly__)
static Eina_List * static Eina_List *
_process_list_freebsd_get(void) _process_list_freebsd_fallback_get(void)
{ {
Eina_List *list; Eina_List *list;
struct rusage *usage; struct rusage *usage;
@ -546,6 +556,36 @@ _process_list_freebsd_get(void)
return list; return list;
} }
static Eina_List *
_process_list_freebsd_get(void)
{
kvm_t *kern;
Eina_List *list = NULL;
struct kinfo_proc *kp;
char errbuf[_POSIX2_LINE_MAX];
int pid_count;
kern = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
if (!kern)
return _process_list_freebsd_fallback_get();
kp = kvm_getprocs(kern, KERN_PROC_PROC, 0, &pid_count);
if (!kp) return _process_list_freebsd_fallback_get();
for (int i = 0; i < pid_count; i++)
{
if (kp[i].ki_flag & P_KPROC)
continue;
Proc_Stats *p = proc_info_by_pid(kp[i].ki_pid);
if (!p) continue;
list = eina_list_append(list, p);
}
return list;
}
Proc_Stats * Proc_Stats *
proc_info_by_pid(int pid) proc_info_by_pid(int pid)
{ {

View File

@ -38,7 +38,11 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/sysctl.h> #if defined(__linux__)
# define BORING_USER 1
#else
# include <sys/sysctl.h>
#endif
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <net/if.h> #include <net/if.h>
@ -1271,14 +1275,16 @@ _network_transfer_get_thread_cb(void *arg)
return (void *)0; return (void *)0;
} }
void results_t *
system_stats_get(results_t *results) system_stats_get(void)
{ {
results_t *results;
void *ret; void *ret;
pthread_t tid; pthread_t tid;
int error; int error;
memset(results, 0, sizeof(results_t)); results = calloc(1, sizeof(results_t));
if (!results) return NULL;
results->cores = _cpu_cores_state_get(&results->cpu_count); results->cores = _cpu_cores_state_get(&results->cpu_count);
@ -1298,5 +1304,7 @@ system_stats_get(results_t *results)
ret = NULL; ret = NULL;
pthread_join(tid, ret); pthread_join(tid, ret);
} }
return results;
} }

View File

@ -61,8 +61,8 @@ struct results_t
int temperature; int temperature;
}; };
void results_t *
system_stats_get(results_t *results); system_stats_get(void);
int int
system_cpu_memory_get(double *percent_cpu, long *memory_total, long *memory_used); system_cpu_memory_get(double *percent_cpu, long *memory_total, long *memory_used);

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,12 @@
#ifndef __UI_H__ #ifndef __UI_H__
#define __UI_H__ #define __UI_H__
#include <Elementary.h> #include <Elementary.h>
#include "process.h" #include "process.h"
#include "configuration.h"
#define EVISUM_SIZE_WIDTH 500 #define EVISUM_SIZE_WIDTH 600
#define EVISUM_SIZE_HEIGHT 600 #define EVISUM_SIZE_HEIGHT 520
typedef enum typedef enum
{ {
@ -90,14 +91,6 @@ typedef struct Ui
Evas_Object *progress_mem_shared; Evas_Object *progress_mem_shared;
Evas_Object *progress_mem_swap; Evas_Object *progress_mem_swap;
Evas_Object *entry_pid;
Evas_Object *entry_uid;
Evas_Object *entry_size;
Evas_Object *entry_rss;
Evas_Object *entry_cmd;
Evas_Object *entry_state;
Evas_Object *entry_cpu_usage;
Evas_Object *btn_pid; Evas_Object *btn_pid;
Evas_Object *btn_uid; Evas_Object *btn_uid;
Evas_Object *btn_size; Evas_Object *btn_size;
@ -105,7 +98,16 @@ typedef struct Ui
Evas_Object *btn_cmd; Evas_Object *btn_cmd;
Evas_Object *btn_state; Evas_Object *btn_state;
Evas_Object *btn_cpu_usage; Evas_Object *btn_cpu_usage;
Evas_Object *btn_expand;
char *long_pid;
char *long_uid;
char *long_size;
char *long_rss;
char *long_cmd;
char *long_state;
char *long_cpu;
Evas_Object *genlist_procs;
Evas_Object *entry_pid_cmd; Evas_Object *entry_pid_cmd;
Evas_Object *entry_pid_user; Evas_Object *entry_pid_user;
@ -135,6 +137,7 @@ typedef struct Ui
Evas_Object *list_pid; Evas_Object *list_pid;
Eina_Bool skip_wait; Eina_Bool skip_wait;
Eina_Bool ready;
Eina_List *cpu_times; Eina_List *cpu_times;
int64_t pid_cpu_time; int64_t pid_cpu_time;
@ -146,6 +149,7 @@ typedef struct Ui
Eina_Bool panel_visible; Eina_Bool panel_visible;
Eina_Bool shutting_down; Eina_Bool shutting_down;
Eina_Bool searching; Eina_Bool searching;
Eina_Bool show_self;
uint64_t incoming_max; uint64_t incoming_max;
uint64_t outgoing_max; uint64_t outgoing_max;