powersave sleep - use fd's and seletc. ecore pipe cant be used

This commit is contained in:
Carsten Haitzler 2017-07-22 22:23:33 +09:00
parent 3c106c6b81
commit 70d08a770e
1 changed files with 48 additions and 18 deletions

View File

@ -1,4 +1,5 @@
#include "e.h" #include "e.h"
#include <sys/select.h>
struct _E_Powersave_Deferred_Action struct _E_Powersave_Deferred_Action
{ {
@ -7,6 +8,12 @@ struct _E_Powersave_Deferred_Action
unsigned char delete_me : 1; unsigned char delete_me : 1;
}; };
struct _E_Powersave_Sleeper
{
Ecore_Pipe *pipe;
int fd;
};
/* local subsystem functions */ /* local subsystem functions */
static void _e_powersave_sleeper_cb_dummy(void *data EINA_UNUSED, void *buffer EINA_UNUSED, unsigned int bytes EINA_UNUSED); static void _e_powersave_sleeper_cb_dummy(void *data EINA_UNUSED, void *buffer EINA_UNUSED, unsigned int bytes EINA_UNUSED);
static Eina_Bool _e_powersave_cb_deferred_timer(void *data); static Eina_Bool _e_powersave_cb_deferred_timer(void *data);
@ -130,35 +137,57 @@ e_powersave_mode_unforce(void)
E_API E_Powersave_Sleeper * E_API E_Powersave_Sleeper *
e_powersave_sleeper_new(void) e_powersave_sleeper_new(void)
{ {
Ecore_Pipe *pipe; E_Powersave_Sleeper *sleeper;
pipe = ecore_pipe_add(_e_powersave_sleeper_cb_dummy, NULL); sleeper = E_NEW(E_Powersave_Sleeper, 1);
powersave_sleepers = eina_list_append(powersave_sleepers, pipe); sleeper->pipe = ecore_pipe_add(_e_powersave_sleeper_cb_dummy, NULL);
return (E_Powersave_Sleeper *)pipe; ecore_pipe_freeze(sleeper->pipe);
powersave_sleepers = eina_list_append(powersave_sleepers, sleeper);
return (E_Powersave_Sleeper *)sleeper;
} }
E_API void E_API void
e_powersave_sleeper_free(E_Powersave_Sleeper *sleeper) e_powersave_sleeper_free(E_Powersave_Sleeper *sleeper)
{ {
Ecore_Pipe *pipe = (Ecore_Pipe *)sleeper; if (!sleeper) return;
ecore_pipe_del(sleeper->pipe);
if (!pipe) return; powersave_sleepers = eina_list_remove(powersave_sleepers, sleeper);
powersave_sleepers = eina_list_remove(powersave_sleepers, pipe); eina_freeq_ptr_add(eina_freeq_main_get(), sleeper, free, sizeof(*sleeper));
ecore_pipe_del(pipe);
} }
E_API void E_API void
e_powersave_sleeper_sleep(E_Powersave_Sleeper *sleeper, int poll_interval) e_powersave_sleeper_sleep(E_Powersave_Sleeper *sleeper, int poll_interval)
{ {
Ecore_Pipe *pipe = (Ecore_Pipe *)sleeper; unsigned int tim;
double tim, now; fd_set rfds, wfds, exfds;
struct timeval tv;
int ret;
char buf[1] = { 1 };
if (!pipe) return; if (!sleeper) return;
if (e_powersave_mode_get() == E_POWERSAVE_MODE_FREEZE) tim = 3600; if (e_powersave_mode_get() == E_POWERSAVE_MODE_FREEZE) tim = 3600;
else tim = (double)poll_interval / 8.0; else tim = (double)poll_interval / 8.0;
now = ecore_time_get(); FD_ZERO(&rfds);
tim = fmod(now, tim); FD_ZERO(&wfds);
ecore_pipe_wait(pipe, 1, tim); FD_ZERO(&exfds);
FD_SET(sleeper->fd, &rfds);
tim = (fmod(ecore_time_get(), tim) * 1000000.0);
tv.tv_sec = tim / 1000000;
tv.tv_usec = tim % 1000000;
for (;;)
{
ret = select(sleeper->fd + 1, &rfds, &wfds, &exfds, &tv);
if ((ret == 1) && (FD_ISSET(sleeper->fd, &rfds)))
{
read(sleeper->fd, buf, 1);
return;
}
else if (ret == 0)
{
return;
}
}
} }
/* local subsystem functions */ /* local subsystem functions */
@ -166,13 +195,14 @@ e_powersave_sleeper_sleep(E_Powersave_Sleeper *sleeper, int poll_interval)
static void static void
_e_powersave_sleepers_wake(void) _e_powersave_sleepers_wake(void)
{ {
Ecore_Pipe *pipe; E_Powersave_Sleeper *sleeper;
Eina_List *l; Eina_List *l;
char buf[1] = { 1 }; char buf[1] = { 1 };
EINA_LIST_FOREACH(powersave_sleepers, l, pipe) EINA_LIST_FOREACH(powersave_sleepers, l, sleeper)
{ {
ecore_pipe_write(pipe, buf, 1); write(ecore_pipe_write_fd(sleeper->pipe), buf, 1);
ecore_pipe_write(sleeper->pipe, buf, 1);
} }
} }