#ifdef BUILD_ASYNC_EVENTS
-#ifndef _MSC_VER
-# include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <errno.h>
+# ifndef _MSC_VER
+# include <unistd.h>
+# endif
+# include <fcntl.h>
+# include <errno.h>
static int _fd_write = -1;
static int _fd_read = -1;
evas_async_events_init(void)
{
int filedes[2];
-
+
_init_evas_event++;
if (_init_evas_event > 1) return _init_evas_event;
-
+
if (pipe(filedes) == -1)
{
_init_evas_event = 0;
return 0;
}
-
+
_fd_read = filedes[0];
_fd_write = filedes[1];
-
+
fcntl(_fd_read, F_SETFL, O_NONBLOCK);
-
+
return _init_evas_event;
}
{
_init_evas_event--;
if (_init_evas_event > 0) return _init_evas_event;
-
+
close(_fd_read);
close(_fd_write);
_fd_read = -1;
_fd_write = -1;
-
+
return _init_evas_event;
}
Evas_Event_Async *ev;
int check;
int count = 0;
-
+
if (_fd_read == -1) return 0;
-
- do
+
+ do
{
check = read(_fd_read, &ev, sizeof (Evas_Event_Async *));
free(ev);
count++;
}
- }
+ }
while (check > 0);
-
+
evas_cache_image_wakeup();
-
+
if (check < 0)
{
switch (errno)
_fd_read = -1;
}
}
-
+
return count;
#else
return 0;
Evas_Event_Async *ev;
ssize_t check;
Eina_Bool result = EINA_FALSE;
-
+
if (!func) return 0;
if (_fd_write == -1) return 0;
-
+
ev = calloc(1, sizeof (Evas_Event_Async));
if (!ev) return 0;
-
+
ev->func = func;
ev->target = target;
ev->type = type;
ev->event_info = event_info;
-
- do
+
+ do
{
check = write(_fd_write, &ev, sizeof (Evas_Event_Async*));
}
- while ((check != sizeof (Evas_Event_Async*)) &&
+ while ((check != sizeof (Evas_Event_Async*)) &&
((errno == EINTR) || (errno == EAGAIN)));
-
+
evas_cache_image_wakeup();
-
+
if (check == sizeof (Evas_Event_Async*))
result = EINA_TRUE;
else
_fd_write = -1;
}
}
-
+
return result;
#else
func(target, type, event_info);