procstats: name and feedback thread.
Struggled to read my own code. This seems clearer now.
This commit is contained in:
parent
664b44631d
commit
1f6ab7d860
|
@ -1,4 +1,4 @@
|
||||||
#include <e.h>
|
# include <e.h>
|
||||||
#include "process.h"
|
#include "process.h"
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
||||||
|
@ -6,16 +6,24 @@
|
||||||
# include <sys/sysctl.h>
|
# include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int64_t _mem_total;
|
#define POLL_INTERVAL 2.0
|
||||||
static Eina_List *_clients = NULL;
|
|
||||||
static Ecore_Timer *_clients_timer = NULL;
|
|
||||||
|
|
||||||
#define POLL_TIME 3.0
|
static int64_t _mem_total;
|
||||||
|
|
||||||
typedef struct _Proc_Stats Proc_Stats;
|
typedef struct
|
||||||
struct _Proc_Stats
|
|
||||||
{
|
{
|
||||||
E_Client *client;
|
E_Powersave_Sleeper *sleeper;
|
||||||
|
Ecore_Thread *thread;
|
||||||
|
Eina_List *clients;
|
||||||
|
int poll_interval;
|
||||||
|
E_Module *e_module;
|
||||||
|
} Proc_Stats_Module;
|
||||||
|
|
||||||
|
static Proc_Stats_Module *_this_module = NULL;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
E_Client *ec;
|
||||||
Evas_Object *obj;
|
Evas_Object *obj;
|
||||||
Evas_Object *frame_obj;
|
Evas_Object *frame_obj;
|
||||||
Evas_Object *popup;
|
Evas_Object *popup;
|
||||||
|
@ -24,10 +32,16 @@ struct _Proc_Stats
|
||||||
uint64_t mem_size;
|
uint64_t mem_size;
|
||||||
uint64_t cpu_time;
|
uint64_t cpu_time;
|
||||||
uint64_t cpu_time_prev;
|
uint64_t cpu_time_prev;
|
||||||
};
|
} Proc_Stats_Client;
|
||||||
|
|
||||||
static void _proc_stats_item_display(Proc_Stats *item);
|
static void _proc_stats_client_add(E_Client *ec);
|
||||||
static void _proc_stats_item_remove(Proc_Stats *item);
|
static void _proc_stats_client_display_update(Proc_Stats_Client *client);
|
||||||
|
static void _proc_stats_client_remove(Proc_Stats_Client *client);
|
||||||
|
static Eina_Bool _proc_stats_client_exists(E_Client *ec);
|
||||||
|
static void _proc_stats_client_del(Proc_Stats_Client *client);
|
||||||
|
static Eina_Bool _proc_stats_client_gone(Proc_Stats_Client *client);
|
||||||
|
static void _proc_stats_client_children_update(Eina_List *children, Proc_Stats_Client *client);
|
||||||
|
static void _proc_stats_client_update(Eina_List *procs, Proc_Stats_Client *client);
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_memory_total(void)
|
_memory_total(void)
|
||||||
|
@ -61,84 +75,85 @@ _memory_total(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_proc_stats_item_exists(E_Client *ec)
|
_proc_stats_client_exists(E_Client *ec)
|
||||||
{
|
{
|
||||||
Proc_Stats *item;
|
Proc_Stats_Client *client;
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
|
Proc_Stats_Module *module = _this_module;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(_clients, l, item)
|
EINA_LIST_FOREACH(module->clients, l, client)
|
||||||
{
|
{
|
||||||
if (item->pid == ec->netwm.pid) return 1;
|
if (client->pid == ec->netwm.pid) return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_item_del(Proc_Stats *item)
|
_proc_stats_client_del(Proc_Stats_Client *client)
|
||||||
{
|
{
|
||||||
if (item->popup) evas_object_del(item->popup);
|
if (client->popup) evas_object_del(client->popup);
|
||||||
item->popup = NULL;
|
client->popup = NULL;
|
||||||
edje_object_signal_emit(item->frame_obj, "e,state,procstats,off", "e");
|
edje_object_signal_emit(client->frame_obj, "e,state,procstats,off", "e");
|
||||||
evas_object_del(item->obj);
|
evas_object_del(client->obj);
|
||||||
e_object_delfn_del(E_OBJECT(item->client), item->delfn);
|
e_object_delfn_del(E_OBJECT(client->ec), client->delfn);
|
||||||
|
|
||||||
free(item);
|
free(client);
|
||||||
item = NULL;
|
client = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_client_del_cb(void *data, void *obj EINA_UNUSED)
|
_proc_stats_client_del_cb(void *data, void *obj EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Proc_Stats *item = data;
|
Proc_Stats_Client *client = data;
|
||||||
|
|
||||||
_proc_stats_item_remove(item);
|
_proc_stats_client_remove(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_client_move_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
_proc_stats_client_move_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Proc_Stats *item;
|
Proc_Stats_Client *client;
|
||||||
Evas_Coord ox, oy, ow, oh;
|
Evas_Coord ox, oy, ow, oh;
|
||||||
|
|
||||||
item = data;
|
client = data;
|
||||||
|
|
||||||
if ((!item) || (!item->popup)) return;
|
if ((!client) || (!client->popup)) return;
|
||||||
|
|
||||||
evas_object_geometry_get(item->obj, &ox, &oy, &ow, &oh);
|
evas_object_geometry_get(client->obj, &ox, &oy, &ow, &oh);
|
||||||
evas_object_move(item->popup, ox + (ow / 2), oy);
|
evas_object_move(client->popup, ox + (ow / 2), oy);
|
||||||
|
|
||||||
if ((item->client->hidden) || (item->client->iconic))
|
if ((client->ec->hidden) || (client->ec->iconic))
|
||||||
evas_object_hide(item->popup);
|
evas_object_hide(client->popup);
|
||||||
else
|
else
|
||||||
evas_object_show(item->popup);
|
evas_object_show(client->popup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_icon_clicked_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
_proc_stats_icon_clicked_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
||||||
{
|
{
|
||||||
Evas_Event_Mouse_Up *ev;
|
Evas_Event_Mouse_Up *ev;
|
||||||
Proc_Stats *item;
|
Proc_Stats_Client *client;
|
||||||
Evas_Object *o, *tb;
|
Evas_Object *o, *tb;
|
||||||
Evas_Object *pb;
|
Evas_Object *pb;
|
||||||
Evas_Coord ox, oy, ow, oh;
|
Evas_Coord ox, oy, ow, oh;
|
||||||
|
|
||||||
ev = event_info;
|
ev = event_info;
|
||||||
item = data;
|
client = data;
|
||||||
|
|
||||||
if (ev->button != 1) return;
|
if (ev->button != 1) return;
|
||||||
|
|
||||||
if (!item) return;
|
if (!client) return;
|
||||||
|
|
||||||
if (item->popup)
|
if (client->popup)
|
||||||
{
|
{
|
||||||
evas_object_del(item->popup);
|
evas_object_del(client->popup);
|
||||||
item->popup = NULL;
|
client->popup = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
evas_object_geometry_get(item->obj, &ox, &oy, &ow, &oh);
|
evas_object_geometry_get(client->obj, &ox, &oy, &ow, &oh);
|
||||||
|
|
||||||
item->popup = o = elm_ctxpopup_add(e_comp->elm);
|
client->popup = o = elm_ctxpopup_add(e_comp->elm);
|
||||||
E_FILL(o); E_EXPAND(o);
|
E_FILL(o); E_EXPAND(o);
|
||||||
elm_object_style_set(o, "noblock");
|
elm_object_style_set(o, "noblock");
|
||||||
evas_object_layer_set(o, E_LAYER_MENU);
|
evas_object_layer_set(o, E_LAYER_MENU);
|
||||||
|
@ -162,7 +177,7 @@ _proc_stats_icon_clicked_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
|
||||||
evas_object_data_set(o, "pb_mem", pb);
|
evas_object_data_set(o, "pb_mem", pb);
|
||||||
evas_object_show(pb);
|
evas_object_show(pb);
|
||||||
|
|
||||||
_proc_stats_item_display(item);
|
_proc_stats_client_display_update(client);
|
||||||
|
|
||||||
elm_ctxpopup_direction_priority_set(o, ELM_CTXPOPUP_DIRECTION_UP,
|
elm_ctxpopup_direction_priority_set(o, ELM_CTXPOPUP_DIRECTION_UP,
|
||||||
ELM_CTXPOPUP_DIRECTION_DOWN,
|
ELM_CTXPOPUP_DIRECTION_DOWN,
|
||||||
|
@ -173,27 +188,28 @@ _proc_stats_icon_clicked_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_item_add(E_Client *ec, E_Module *module)
|
_proc_stats_client_add(E_Client *ec)
|
||||||
{
|
{
|
||||||
Evas_Object *o;
|
Evas_Object *o;
|
||||||
Proc_Stats *item;
|
Proc_Stats_Client *client;
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
|
Proc_Stats_Module *module = _this_module;
|
||||||
|
|
||||||
if (ec->internal || ec->netwm.pid == -1) return;
|
if (ec->internal || ec->netwm.pid == -1) return;
|
||||||
if (!ec->frame_object) return;
|
if (!ec->frame_object) return;
|
||||||
if (_proc_stats_item_exists(ec)) return;
|
if (_proc_stats_client_exists(ec)) return;
|
||||||
|
|
||||||
if (!edje_object_part_exists(ec->frame_object, "e.procstats.swallow")) return;
|
if (!edje_object_part_exists(ec->frame_object, "e.procstats.swallow")) return;
|
||||||
|
|
||||||
item = calloc(1, sizeof(Proc_Stats));
|
client = calloc(1, sizeof(Proc_Stats_Client));
|
||||||
EINA_SAFETY_ON_NULL_RETURN(item);
|
EINA_SAFETY_ON_NULL_RETURN(client);
|
||||||
|
|
||||||
o = edje_object_add(e_comp->evas);
|
o = edje_object_add(e_comp->evas);
|
||||||
if (!e_theme_edje_object_set(o, "base/theme/modules/procstats",
|
if (!e_theme_edje_object_set(o, "base/theme/modules/procstats",
|
||||||
"e/modules/procstats/border"))
|
"e/modules/procstats/border"))
|
||||||
{
|
{
|
||||||
evas_object_del(o);
|
evas_object_del(o);
|
||||||
snprintf(buf, sizeof(buf), "%s/e-module-procstats.edj", e_module_dir_get(module));
|
snprintf(buf, sizeof(buf), "%s/e-module-procstats.edj", e_module_dir_get(module->e_module));
|
||||||
o = elm_icon_add(e_comp->elm);
|
o = elm_icon_add(e_comp->elm);
|
||||||
elm_image_file_set(o, buf, "icon");
|
elm_image_file_set(o, buf, "icon");
|
||||||
}
|
}
|
||||||
|
@ -201,65 +217,66 @@ _proc_stats_item_add(E_Client *ec, E_Module *module)
|
||||||
evas_object_size_hint_max_set(o, ELM_SCALE_SIZE(16), ELM_SCALE_SIZE(16));
|
evas_object_size_hint_max_set(o, ELM_SCALE_SIZE(16), ELM_SCALE_SIZE(16));
|
||||||
E_FILL(o); E_EXPAND(o);
|
E_FILL(o); E_EXPAND(o);
|
||||||
|
|
||||||
item->obj = o;
|
client->obj = o;
|
||||||
item->frame_obj = ec->frame_object;
|
client->frame_obj = ec->frame_object;
|
||||||
item->pid = ec->netwm.pid;
|
client->pid = ec->netwm.pid;
|
||||||
item->client = ec;
|
client->ec = ec;
|
||||||
|
|
||||||
edje_object_part_swallow(ec->frame_object, "e.procstats.swallow", item->obj);
|
edje_object_part_swallow(ec->frame_object, "e.procstats.swallow", client->obj);
|
||||||
evas_object_show(item->obj);
|
evas_object_show(client->obj);
|
||||||
edje_object_signal_emit(ec->frame_object, "e,state,procstats,on", "e");
|
edje_object_signal_emit(ec->frame_object, "e,state,procstats,on", "e");
|
||||||
|
|
||||||
item->delfn = e_object_delfn_add(E_OBJECT(ec), _proc_stats_client_del_cb, item);
|
client->delfn = e_object_delfn_add(E_OBJECT(ec), _proc_stats_client_del_cb, client);
|
||||||
evas_object_event_callback_add(item->obj, EVAS_CALLBACK_MOVE, _proc_stats_client_move_cb, item);
|
evas_object_event_callback_add(client->obj, EVAS_CALLBACK_MOVE, _proc_stats_client_move_cb, client);
|
||||||
evas_object_event_callback_add(item->obj, EVAS_CALLBACK_MOUSE_UP, _proc_stats_icon_clicked_cb, item);
|
evas_object_event_callback_add(client->obj, EVAS_CALLBACK_MOUSE_UP, _proc_stats_icon_clicked_cb, client);
|
||||||
|
|
||||||
_clients = eina_list_append(_clients, item);
|
module->clients = eina_list_append(module->clients, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_item_remove(Proc_Stats *item)
|
_proc_stats_client_remove(Proc_Stats_Client *client)
|
||||||
{
|
{
|
||||||
Eina_List *l, *l_next;
|
Eina_List *l, *l_next;
|
||||||
Proc_Stats *it;
|
Proc_Stats_Client *it;
|
||||||
|
Proc_Stats_Module *module = _this_module;
|
||||||
|
|
||||||
EINA_LIST_FOREACH_SAFE(_clients, l, l_next, it)
|
EINA_LIST_FOREACH_SAFE(module->clients, l, l_next, it)
|
||||||
{
|
{
|
||||||
if (it == item)
|
if (it == client)
|
||||||
{
|
{
|
||||||
_proc_stats_item_del(item);
|
_proc_stats_client_del(client);
|
||||||
_clients = eina_list_remove_list(_clients, l);
|
module->clients = eina_list_remove_list(module->clients, l);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_proc_stats_item_gone(Proc_Stats *item)
|
_proc_stats_client_gone(Proc_Stats_Client *client)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
E_Client *ec;
|
E_Client *ec;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(e_comp->clients, l, ec)
|
EINA_LIST_FOREACH(e_comp->clients, l, ec)
|
||||||
{
|
{
|
||||||
if (item->client == ec) return 0;
|
if (client->ec == ec) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_item_children_update(Eina_List *children, Proc_Stats *item)
|
_proc_stats_client_children_update(Eina_List *children, Proc_Stats_Client *client)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
Proc_Info *child;
|
Proc_Info *child;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(children, l, child)
|
EINA_LIST_FOREACH(children, l, child)
|
||||||
{
|
{
|
||||||
item->mem_size += child->mem_size;
|
client->mem_size += child->mem_size;
|
||||||
item->cpu_time += child->cpu_time;
|
client->cpu_time += child->cpu_time;
|
||||||
if (child->children)
|
if (child->children)
|
||||||
_proc_stats_item_children_update(child->children, item);
|
_proc_stats_client_children_update(child->children, client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,7 +314,7 @@ _size_format(unsigned long long bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_item_display(Proc_Stats *item)
|
_proc_stats_client_display_update(Proc_Stats_Client *client)
|
||||||
{
|
{
|
||||||
Edje_Message_Int_Set *msg;
|
Edje_Message_Int_Set *msg;
|
||||||
Evas_Object *pb;
|
Evas_Object *pb;
|
||||||
|
@ -305,28 +322,28 @@ _proc_stats_item_display(Proc_Stats *item)
|
||||||
char *s;
|
char *s;
|
||||||
double val = 0.0;
|
double val = 0.0;
|
||||||
|
|
||||||
if (item->cpu_time_prev > item->cpu_time)
|
if (client->cpu_time_prev > client->cpu_time)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!item->cpu_time_prev) item->cpu_time_prev = item->cpu_time;
|
if (!client->cpu_time_prev) client->cpu_time_prev = client->cpu_time;
|
||||||
|
|
||||||
msg = malloc(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 4));
|
msg = malloc(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 4));
|
||||||
EINA_SAFETY_ON_NULL_RETURN(msg);
|
EINA_SAFETY_ON_NULL_RETURN(msg);
|
||||||
msg->count = 5;
|
msg->count = 5;
|
||||||
msg->val[0] = eina_cpu_count();
|
msg->val[0] = eina_cpu_count();
|
||||||
msg->val[1] = (item->cpu_time - item->cpu_time_prev) / POLL_TIME;
|
msg->val[1] = (client->cpu_time - client->cpu_time_prev) / POLL_INTERVAL;
|
||||||
msg->val[2] = (int) (_mem_total / 4096);
|
msg->val[2] = (int) (_mem_total / 4096);
|
||||||
msg->val[3] = (int) (item->mem_size / 4096);
|
msg->val[3] = (int) (client->mem_size / 4096);
|
||||||
msg->val[4] = 0;
|
msg->val[4] = 0;
|
||||||
edje_object_message_send(item->frame_obj, EDJE_MESSAGE_INT_SET, 1973, msg);
|
edje_object_message_send(client->frame_obj, EDJE_MESSAGE_INT_SET, 1973, msg);
|
||||||
edje_object_message_send(item->obj, EDJE_MESSAGE_INT_SET, 1973, msg);
|
edje_object_message_send(client->obj, EDJE_MESSAGE_INT_SET, 1973, msg);
|
||||||
free(msg);
|
free(msg);
|
||||||
|
|
||||||
if (!item->popup) return;
|
if (!client->popup) return;
|
||||||
|
|
||||||
pb = evas_object_data_get(item->popup, "pb_cpu");
|
pb = evas_object_data_get(client->popup, "pb_cpu");
|
||||||
|
|
||||||
val = ((item->cpu_time - item->cpu_time_prev) / POLL_TIME);
|
val = ((client->cpu_time - client->cpu_time_prev) / POLL_INTERVAL);
|
||||||
elm_progressbar_value_set(pb, val / 100.0);
|
elm_progressbar_value_set(pb, val / 100.0);
|
||||||
|
|
||||||
buf = eina_strbuf_new();
|
buf = eina_strbuf_new();
|
||||||
|
@ -335,11 +352,11 @@ _proc_stats_item_display(Proc_Stats *item)
|
||||||
elm_object_part_text_set(pb, "elm.text.status", eina_strbuf_string_get(buf));
|
elm_object_part_text_set(pb, "elm.text.status", eina_strbuf_string_get(buf));
|
||||||
eina_strbuf_reset(buf);
|
eina_strbuf_reset(buf);
|
||||||
|
|
||||||
pb = evas_object_data_get(item->popup, "pb_mem");
|
pb = evas_object_data_get(client->popup, "pb_mem");
|
||||||
val = item->mem_size / (_mem_total / 100.0);
|
val = client->mem_size / (_mem_total / 100.0);
|
||||||
elm_progressbar_value_set(pb, val / 100.0);
|
elm_progressbar_value_set(pb, val / 100.0);
|
||||||
|
|
||||||
s = _size_format(item->mem_size);
|
s = _size_format(client->mem_size);
|
||||||
eina_strbuf_append_printf(buf, "%s / ", s);
|
eina_strbuf_append_printf(buf, "%s / ", s);
|
||||||
free(s);
|
free(s);
|
||||||
s = _size_format(_mem_total);
|
s = _size_format(_mem_total);
|
||||||
|
@ -351,57 +368,68 @@ _proc_stats_item_display(Proc_Stats *item)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proc_stats_item_update(Eina_List *procs, Proc_Stats *item)
|
_proc_stats_client_update(Eina_List *procs, Proc_Stats_Client *client)
|
||||||
{
|
{
|
||||||
Proc_Info *proc;
|
Proc_Info *proc;
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(procs, l, proc)
|
EINA_LIST_FOREACH(procs, l, proc)
|
||||||
{
|
{
|
||||||
if (proc->pid == item->pid)
|
if (proc->pid == client->pid)
|
||||||
{
|
{
|
||||||
item->cpu_time = item->mem_size = 0;
|
client->cpu_time = client->mem_size = 0;
|
||||||
item->mem_size += proc->mem_size;
|
client->mem_size += proc->mem_size;
|
||||||
item->cpu_time += proc->cpu_time;
|
client->cpu_time += proc->cpu_time;
|
||||||
_proc_stats_item_children_update(proc->children, item);
|
_proc_stats_client_children_update(proc->children, client);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_proc_stats_item_display(item);
|
_proc_stats_client_display_update(client);
|
||||||
item->cpu_time_prev = item->cpu_time;
|
client->cpu_time_prev = client->cpu_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static void
|
||||||
_proc_stats_timer_cb(void *data)
|
_proc_stats_thread_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, void *msgdata)
|
||||||
{
|
{
|
||||||
E_Module *module;
|
Proc_Stats_Module *module;
|
||||||
Eina_List *procs, *l;
|
Eina_List *procs, *l;
|
||||||
E_Client *ec;
|
E_Client *ec;
|
||||||
Proc_Info *proc;
|
Proc_Info *proc;
|
||||||
Proc_Stats *item;
|
Proc_Stats_Client *client;
|
||||||
|
|
||||||
module = data;
|
module = data;
|
||||||
|
procs = msgdata;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(e_comp->clients, l, ec)
|
EINA_LIST_FOREACH(e_comp->clients, l, ec)
|
||||||
{
|
{
|
||||||
if (!_proc_stats_item_exists(ec))
|
if (!_proc_stats_client_exists(ec))
|
||||||
_proc_stats_item_add(ec, module);
|
_proc_stats_client_add(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
procs = proc_info_all_children_get();
|
EINA_LIST_FOREACH(module->clients, l, client)
|
||||||
|
|
||||||
EINA_LIST_FOREACH(_clients, l, item)
|
|
||||||
{
|
{
|
||||||
if (_proc_stats_item_gone(item))
|
if (_proc_stats_client_gone(client))
|
||||||
_proc_stats_item_remove(item);
|
_proc_stats_client_remove(client);
|
||||||
else
|
else
|
||||||
_proc_stats_item_update(procs, item);
|
_proc_stats_client_update(procs, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
EINA_LIST_FREE(procs, proc)
|
EINA_LIST_FREE(procs, proc)
|
||||||
proc_info_free(proc);
|
proc_info_free(proc);
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
static void
|
||||||
|
_proc_stats_thread(void *data, Ecore_Thread *thread)
|
||||||
|
{
|
||||||
|
Proc_Stats_Module *module = data;
|
||||||
|
|
||||||
|
while (!ecore_thread_check(thread))
|
||||||
|
{
|
||||||
|
Eina_List *procs = proc_info_all_children_get();
|
||||||
|
ecore_thread_feedback(thread, procs);
|
||||||
|
usleep(1000000 * module->poll_interval);
|
||||||
|
// e_powersave_sleeper_sleep(module->sleeper, module->poll_interval, EINA_TRUE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
E_API E_Module_Api e_modapi =
|
E_API E_Module_Api e_modapi =
|
||||||
|
@ -413,30 +441,42 @@ E_API E_Module_Api e_modapi =
|
||||||
E_API int
|
E_API int
|
||||||
e_modapi_init(E_Module *m)
|
e_modapi_init(E_Module *m)
|
||||||
{
|
{
|
||||||
|
Proc_Stats_Module *module;
|
||||||
|
|
||||||
if (!_memory_total())
|
if (!_memory_total())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_proc_stats_timer_cb(m);
|
_this_module = module = calloc(1, sizeof(Proc_Stats_Module));
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(module, 0);
|
||||||
|
|
||||||
_clients_timer = ecore_timer_add(POLL_TIME, _proc_stats_timer_cb, m);
|
module->e_module = m;
|
||||||
|
//module->sleeper = e_powersave_sleeper_new();
|
||||||
|
module->poll_interval = POLL_INTERVAL;
|
||||||
|
|
||||||
|
_proc_stats_thread_feedback_cb(module, NULL, proc_info_all_children_get());
|
||||||
|
|
||||||
|
module->thread = ecore_thread_feedback_run(_proc_stats_thread,
|
||||||
|
_proc_stats_thread_feedback_cb,
|
||||||
|
NULL, NULL, module, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
E_API int
|
E_API int
|
||||||
e_modapi_shutdown(E_Module *m EINA_UNUSED)
|
e_modapi_shutdown(E_Module *m EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Proc_Stats *item;
|
Proc_Stats_Client *client;
|
||||||
|
Proc_Stats_Module *module = _this_module;
|
||||||
|
|
||||||
if (_clients_timer)
|
ecore_thread_cancel(module->thread);
|
||||||
ecore_timer_del(_clients_timer);
|
ecore_thread_wait(module->thread, 0.2);
|
||||||
|
|
||||||
_clients_timer = NULL;
|
//e_powersave_sleeper_free(module->sleeper);
|
||||||
|
|
||||||
EINA_LIST_FREE(_clients, item)
|
EINA_LIST_FREE(module->clients, client)
|
||||||
_proc_stats_item_del(item);
|
_proc_stats_client_del(client);
|
||||||
|
|
||||||
_clients = NULL;
|
free(module);
|
||||||
|
_this_module = NULL;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -446,3 +486,4 @@ e_modapi_save(E_Module *m EINA_UNUSED)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,12 +154,14 @@ _mem_size(Proc_Info *proc)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
char path[PATH_MAX];
|
||||||
unsigned int dummy, size, shared, resident, data, text;
|
unsigned int dummy, size, shared, resident, data, text;
|
||||||
static int pagesize = 0;
|
static int pagesize = 0;
|
||||||
|
|
||||||
if (!pagesize) pagesize = getpagesize();
|
if (!pagesize) pagesize = getpagesize();
|
||||||
|
|
||||||
f = fopen(eina_slstr_printf("/proc/%d/statm", proc->pid), "r");
|
snprintf(path, sizeof(path), "/proc/%i/statm", proc->pid);
|
||||||
|
f = fopen(path, "r");
|
||||||
if (!f) return;
|
if (!f) return;
|
||||||
|
|
||||||
if (fgets(buf, sizeof(buf), f))
|
if (fgets(buf, sizeof(buf), f))
|
||||||
|
@ -182,32 +184,44 @@ static void
|
||||||
_cmd_args(Proc_Info *p, char *name, size_t len)
|
_cmd_args(Proc_Info *p, char *name, size_t len)
|
||||||
{
|
{
|
||||||
char line[4096];
|
char line[4096];
|
||||||
|
char path[PATH_MAX];
|
||||||
int pid = p->pid;
|
int pid = p->pid;
|
||||||
|
|
||||||
char *link = ecore_file_readlink(eina_slstr_printf("/proc/%d/exe", pid));
|
snprintf(path, sizeof(path), "/proc/%i/exe", pid);
|
||||||
|
char *link = ecore_file_readlink(path);
|
||||||
if (link)
|
if (link)
|
||||||
{
|
{
|
||||||
snprintf(name, len, "%s", ecore_file_file_get(link));
|
snprintf(name, len, "%s", ecore_file_file_get(link));
|
||||||
free(link);
|
free(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *f = fopen(eina_slstr_printf("/proc/%d/cmdline", pid), "r");
|
snprintf(path, sizeof(path), "/proc/%i/cmdline", pid);
|
||||||
|
FILE *f = fopen(path, "r");
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
if (fgets(line, sizeof(line), f))
|
if (fgets(line, sizeof(line), f))
|
||||||
{
|
{
|
||||||
|
int sz = ftell(f);
|
||||||
Eina_Strbuf *buf = eina_strbuf_new();
|
Eina_Strbuf *buf = eina_strbuf_new();
|
||||||
const char *n;
|
|
||||||
|
|
||||||
if (ecore_file_exists(line))
|
if (ecore_file_exists(line))
|
||||||
snprintf(name, len, "%s", ecore_file_file_get(line));
|
snprintf(name, len, "%s", ecore_file_file_get(line));
|
||||||
|
|
||||||
n = line;
|
const char *cp = line;
|
||||||
while ((n) && (*n) && (*n + 1))
|
for (int i = 0; i < sz; i++)
|
||||||
{
|
{
|
||||||
eina_strbuf_append(buf, n);
|
if (line[i] == '\0')
|
||||||
n = strchr(n, '\0') + 1;
|
{
|
||||||
if ((n) && (*n) && (*n + 1)) eina_strbuf_append(buf, " ");
|
if (*cp)
|
||||||
|
eina_strbuf_append(buf, cp);
|
||||||
|
if ((i + 1) < sz)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
cp = &line[i];
|
||||||
|
if (*cp)
|
||||||
|
eina_strbuf_append(buf, " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
p->arguments = eina_strbuf_release(buf);
|
p->arguments = eina_strbuf_release(buf);
|
||||||
}
|
}
|
||||||
|
@ -225,9 +239,10 @@ _uid(int pid)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
int uid = -1;
|
int uid = -1;
|
||||||
char line[1024];
|
char line[1024], path[PATH_MAX];
|
||||||
|
|
||||||
f = fopen(eina_slstr_printf("/proc/%d/status", pid), "r");
|
snprintf(path, sizeof(path), "/proc/%i/status", pid);
|
||||||
|
f = fopen(path, "r");
|
||||||
if (!f) return -1;
|
if (!f) return -1;
|
||||||
|
|
||||||
while ((fgets(line, sizeof(line), f)) != NULL)
|
while ((fgets(line, sizeof(line), f)) != NULL)
|
||||||
|
@ -324,6 +339,7 @@ _process_list_linux_get(void)
|
||||||
{
|
{
|
||||||
Eina_List *files, *list;
|
Eina_List *files, *list;
|
||||||
char *n;
|
char *n;
|
||||||
|
char path[PATH_MAX];
|
||||||
Stat st;
|
Stat st;
|
||||||
|
|
||||||
list = NULL;
|
list = NULL;
|
||||||
|
@ -336,7 +352,8 @@ _process_list_linux_get(void)
|
||||||
|
|
||||||
if (!pid) continue;
|
if (!pid) continue;
|
||||||
|
|
||||||
if (!_stat(eina_slstr_printf("/proc/%d/stat", pid), &st))
|
snprintf(path, sizeof(path), "/proc/%i/stat", pid);
|
||||||
|
if (!_stat(path, &st))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (st.flags & PF_KTHREAD && !proc_info_kthreads_show_get())
|
if (st.flags & PF_KTHREAD && !proc_info_kthreads_show_get())
|
||||||
|
@ -370,13 +387,16 @@ _proc_thread_info(Proc_Info *p)
|
||||||
Eina_List *files;
|
Eina_List *files;
|
||||||
char *n;
|
char *n;
|
||||||
Stat st;
|
Stat st;
|
||||||
|
char path[PATH_MAX];
|
||||||
|
|
||||||
files = ecore_file_ls(eina_slstr_printf("/proc/%d/task", p->pid));
|
snprintf(path, sizeof(path), "/proc/%i/task", p->pid);
|
||||||
|
files = ecore_file_ls(path);
|
||||||
EINA_LIST_FREE(files, n)
|
EINA_LIST_FREE(files, n)
|
||||||
{
|
{
|
||||||
int tid = atoi(n);
|
int tid = atoi(n);
|
||||||
free(n);
|
free(n);
|
||||||
if (!_stat(eina_slstr_printf("/proc/%d/task/%d/stat", p->pid, tid), &st))
|
snprintf(path, sizeof(path), "/proc/%i/task/%i/stat", p->pid, tid);
|
||||||
|
if (!_stat(path, &st))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Proc_Info *t = calloc(1, sizeof(Proc_Info));
|
Proc_Info *t = calloc(1, sizeof(Proc_Info));
|
||||||
|
@ -401,8 +421,10 @@ Proc_Info *
|
||||||
proc_info_by_pid(int pid)
|
proc_info_by_pid(int pid)
|
||||||
{
|
{
|
||||||
Stat st;
|
Stat st;
|
||||||
|
char path[PATH_MAX];
|
||||||
|
|
||||||
if (!_stat(eina_slstr_printf("/proc/%d/stat", pid), &st))
|
snprintf(path, sizeof(path), "/proc/%i/stat", pid);
|
||||||
|
if (!_stat(path, &st))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
Proc_Info *p = calloc(1, sizeof(Proc_Info));
|
Proc_Info *p = calloc(1, sizeof(Proc_Info));
|
||||||
|
|
Loading…
Reference in New Issue