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
============

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_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' ])
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 "configuration.h"
#include "ui.h"
static void
@ -47,6 +48,7 @@ main(int argc, char **argv)
eina_init();
ecore_init();
config_init();
elm_init(argc, argv);
ui = _win_add();
@ -57,6 +59,7 @@ main(int argc, char **argv)
}
elm_shutdown();
config_shutdown();
ecore_shutdown();
eina_shutdown();

View File

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

View File

@ -9,7 +9,9 @@
# include <sys/proc.h>
#endif
#if defined(__OpenBSD__)
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
# include <unistd.h>
# include <fcntl.h>
# include <kvm.h>
# include <limits.h>
# include <sys/proc.h>
@ -34,6 +36,10 @@
#include <Ecore.h>
#include <Ecore_File.h>
#if defined(__linux__) && !defined(PF_KTHREAD)
# define PF_KTHREAD 0x00200000
#endif
static const char *
_process_state_name(char state)
{
@ -142,7 +148,7 @@ _process_list_linux_get(void)
FILE *f;
char *name, *link, state, line[4096], program_name[1024];
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();
list = NULL;
@ -165,9 +171,8 @@ _process_list_linux_get(void)
end = strchr(line, ')');
strncpy(program_name, start, end - start);
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",
&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,
&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 (flags & PF_KTHREAD) continue;
f = fopen(eina_slstr_printf("/proc/%d/status", pid), "r");
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));
if (!p) return NULL;
@ -489,7 +499,7 @@ proc_info_by_pid(int pid)
#if defined(__FreeBSD__) || defined(__DragonFly__)
static Eina_List *
_process_list_freebsd_get(void)
_process_list_freebsd_fallback_get(void)
{
Eina_List *list;
struct rusage *usage;
@ -546,6 +556,36 @@ _process_list_freebsd_get(void)
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_info_by_pid(int pid)
{

View File

@ -38,7 +38,11 @@
#include <sys/stat.h>
#include <sys/types.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/socket.h>
#include <net/if.h>
@ -1271,14 +1275,16 @@ _network_transfer_get_thread_cb(void *arg)
return (void *)0;
}
void
system_stats_get(results_t *results)
results_t *
system_stats_get(void)
{
results_t *results;
void *ret;
pthread_t tid;
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);
@ -1298,5 +1304,7 @@ system_stats_get(results_t *results)
ret = NULL;
pthread_join(tid, ret);
}
return results;
}

View File

@ -61,8 +61,8 @@ struct results_t
int temperature;
};
void
system_stats_get(results_t *results);
results_t *
system_stats_get(void);
int
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__
#include <Elementary.h>
#include "process.h"
#include "configuration.h"
#define EVISUM_SIZE_WIDTH 500
#define EVISUM_SIZE_HEIGHT 600
#define EVISUM_SIZE_WIDTH 600
#define EVISUM_SIZE_HEIGHT 520
typedef enum
{
@ -90,14 +91,6 @@ typedef struct Ui
Evas_Object *progress_mem_shared;
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_uid;
Evas_Object *btn_size;
@ -105,7 +98,16 @@ typedef struct Ui
Evas_Object *btn_cmd;
Evas_Object *btn_state;
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_user;
@ -135,6 +137,7 @@ typedef struct Ui
Evas_Object *list_pid;
Eina_Bool skip_wait;
Eina_Bool ready;
Eina_List *cpu_times;
int64_t pid_cpu_time;
@ -146,6 +149,7 @@ typedef struct Ui
Eina_Bool panel_visible;
Eina_Bool shutting_down;
Eina_Bool searching;
Eina_Bool show_self;
uint64_t incoming_max;
uint64_t outgoing_max;