forked from enlightenment/efl
parent
a82325e41d
commit
707f908ba1
|
@ -210,3 +210,7 @@
|
||||||
|
|
||||||
* Add ecore_pipe_freeze/thaw to suspend and restart watching the pipe
|
* Add ecore_pipe_freeze/thaw to suspend and restart watching the pipe
|
||||||
inside the main loop.
|
inside the main loop.
|
||||||
|
|
||||||
|
2011-06-09 Cedric Bail
|
||||||
|
|
||||||
|
* Add ecore_pipe_wait (should only called from outside of the main loop).
|
||||||
|
|
|
@ -788,6 +788,7 @@ extern "C" {
|
||||||
EAPI void ecore_pipe_read_close(Ecore_Pipe *p);
|
EAPI void ecore_pipe_read_close(Ecore_Pipe *p);
|
||||||
EAPI void ecore_pipe_thaw(Ecore_Pipe *p);
|
EAPI void ecore_pipe_thaw(Ecore_Pipe *p);
|
||||||
EAPI void ecore_pipe_freeze(Ecore_Pipe *p);
|
EAPI void ecore_pipe_freeze(Ecore_Pipe *p);
|
||||||
|
EAPI int ecore_pipe_wait(Ecore_Pipe *p, int message_count, double wait);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
|
|
|
@ -147,9 +147,9 @@ static Eina_Bool win32_handlers_delete_me = EINA_FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static Ecore_Select_Function main_loop_select = _ecore_main_win32_select;
|
Ecore_Select_Function main_loop_select = _ecore_main_win32_select;
|
||||||
#else
|
#else
|
||||||
static Ecore_Select_Function main_loop_select = select;
|
Ecore_Select_Function main_loop_select = select;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef USE_G_MAIN_LOOP
|
#ifndef USE_G_MAIN_LOOP
|
||||||
|
|
|
@ -5,6 +5,28 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_ISFINITE
|
||||||
|
# define ECORE_FINITE(t) isfinite(t)
|
||||||
|
#else
|
||||||
|
# ifdef _MSC_VER
|
||||||
|
# define ECORE_FINITE(t) _finite(t)
|
||||||
|
# else
|
||||||
|
# define ECORE_FINITE(t) finite(t)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FIX_HZ 1
|
||||||
|
|
||||||
|
#ifdef FIX_HZ
|
||||||
|
# ifndef _MSC_VER
|
||||||
|
# include <sys/param.h>
|
||||||
|
# endif
|
||||||
|
# ifndef HZ
|
||||||
|
# define HZ 100
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_EVIL
|
#ifdef HAVE_EVIL
|
||||||
# include <Evil.h>
|
# include <Evil.h>
|
||||||
|
@ -60,6 +82,7 @@ struct _Ecore_Pipe
|
||||||
int handling;
|
int handling;
|
||||||
size_t already_read;
|
size_t already_read;
|
||||||
void *passed_data;
|
void *passed_data;
|
||||||
|
int message;
|
||||||
Eina_Bool delete_me : 1;
|
Eina_Bool delete_me : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -413,6 +436,94 @@ ecore_pipe_thaw(Ecore_Pipe *p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Wait from another thread on the read side of a pipe.
|
||||||
|
*
|
||||||
|
* @param p The pipe to watch on.
|
||||||
|
* @param message_count The minimal number of message to wait before exiting.
|
||||||
|
* @param wait The amount of time in second to wait before exiting.
|
||||||
|
* @return the number of message catched during that wait call.
|
||||||
|
*
|
||||||
|
* Negative value for @p wait means infite wait.
|
||||||
|
*/
|
||||||
|
EAPI int
|
||||||
|
ecore_pipe_wait(Ecore_Pipe *p, int message_count, double wait)
|
||||||
|
{
|
||||||
|
struct timeval tv, *t;
|
||||||
|
fd_set rset;
|
||||||
|
double end = 0.0;
|
||||||
|
double timeout;
|
||||||
|
int ret;
|
||||||
|
int total = 0;
|
||||||
|
|
||||||
|
if (p->fd_read == PIPE_FD_INVALID)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
FD_ZERO(&rset);
|
||||||
|
FD_SET(p->fd_read, &rset);
|
||||||
|
|
||||||
|
if (wait >= 0.0)
|
||||||
|
end = ecore_time_get() + wait;
|
||||||
|
timeout = wait;
|
||||||
|
|
||||||
|
while (message_count > 0 && (timeout > 0.0 || wait <= 0.0))
|
||||||
|
{
|
||||||
|
if (wait >= 0.0)
|
||||||
|
{
|
||||||
|
/* finite() tests for NaN, too big, too small, and infinity. */
|
||||||
|
if ((!ECORE_FINITE(timeout)) || (timeout == 0.0))
|
||||||
|
{
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
}
|
||||||
|
else if (timeout > 0.0)
|
||||||
|
{
|
||||||
|
int sec, usec;
|
||||||
|
#ifdef FIX_HZ
|
||||||
|
timeout += (0.5 / HZ);
|
||||||
|
sec = (int)timeout;
|
||||||
|
usec = (int)((timeout - (double)sec) * 1000000);
|
||||||
|
#else
|
||||||
|
sec = (int)timeout;
|
||||||
|
usec = (int)((timeout - (double)sec) * 1000000);
|
||||||
|
#endif
|
||||||
|
tv.tv_sec = sec;
|
||||||
|
tv.tv_usec = usec;
|
||||||
|
}
|
||||||
|
t = &tv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = main_loop_select(p->fd_read + 1, &rset, NULL, NULL, t);
|
||||||
|
|
||||||
|
if (ret > 0)
|
||||||
|
{
|
||||||
|
_ecore_pipe_read(p, NULL);
|
||||||
|
message_count -= p->message;
|
||||||
|
total += p->message;
|
||||||
|
p->message = 0;
|
||||||
|
}
|
||||||
|
else if (ret == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (errno != EINTR)
|
||||||
|
{
|
||||||
|
close(p->fd_read);
|
||||||
|
p->fd_read = PIPE_FD_INVALID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wait >= 0.0)
|
||||||
|
timeout = end - ecore_time_get();
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the write end of an Ecore_Pipe object created with ecore_pipe_add().
|
* Close the write end of an Ecore_Pipe object created with ecore_pipe_add().
|
||||||
*
|
*
|
||||||
|
@ -642,6 +753,7 @@ _ecore_pipe_read(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
|
||||||
p->passed_data = NULL;
|
p->passed_data = NULL;
|
||||||
p->already_read = 0;
|
p->already_read = 0;
|
||||||
p->len = 0;
|
p->len = 0;
|
||||||
|
p->message++;
|
||||||
}
|
}
|
||||||
else if (ret >= 0)
|
else if (ret >= 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -198,5 +198,6 @@ void _ecore_main_loop_shutdown(void);
|
||||||
extern int _ecore_fps_debug;
|
extern int _ecore_fps_debug;
|
||||||
extern double _ecore_time_loop_time;
|
extern double _ecore_time_loop_time;
|
||||||
extern Eina_Bool _ecore_glib_always_integrate;
|
extern Eina_Bool _ecore_glib_always_integrate;
|
||||||
|
extern Ecore_Select_Function main_loop_select;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue