From: raster Date: Mon, 13 Aug 2012 08:52:23 +0000 (+0000) Subject: fix async event fd after fork. pipe re-create X-Git-Tag: submit/trunk/20120815.174732~8 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8c6ae8a872682e0b37c40c397f15dc38ca479639;p=profile%2Fivi%2Fevas.git fix async event fd after fork. pipe re-create git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@75193 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/ChangeLog b/ChangeLog index f6c0754..3dc79f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -953,3 +953,7 @@ 2012-08-07 Cedric Bail * Properly warn when user try to link object from different canvas. + +2012-08-13 Carsten Haitzler (The Rasterman) + + * Fix async fd stuff to generate new pipe after a fork (pid mismatch) diff --git a/src/lib/canvas/evas_async_events.c b/src/lib/canvas/evas_async_events.c index bd2e3a8..1002d3d 100644 --- a/src/lib/canvas/evas_async_events.c +++ b/src/lib/canvas/evas_async_events.c @@ -19,6 +19,7 @@ static int _fd_write = -1; static int _fd_read = -1; +static pid_t _fd_pid = 0; static int _init_evas_event = 0; @@ -40,6 +41,8 @@ evas_async_events_init(void) _init_evas_event++; if (_init_evas_event > 1) return _init_evas_event; + _fd_pid = getpid(); + if (pipe(filedes) == -1) { _init_evas_event = 0; @@ -68,12 +71,23 @@ evas_async_events_shutdown(void) return _init_evas_event; } +static void +_evas_async_events_fork_handle(void) +{ + int i, count = _init_evas_event; + + if (getpid() == _fd_pid) return; + for (i = 0; i < count; i++) evas_async_events_shutdown(); + for (i = 0; i < count; i++) evas_async_events_init(); +} + #endif EAPI int evas_async_events_fd_get(void) { #ifdef BUILD_ASYNC_EVENTS + _evas_async_events_fork_handle(); return _fd_read; #else return -1; @@ -90,6 +104,8 @@ evas_async_events_process(void) if (_fd_read == -1) return 0; + _evas_async_events_fork_handle(); + do { check = read(_fd_read, &ev, sizeof (Evas_Event_Async *)); @@ -134,6 +150,8 @@ evas_async_events_put(const void *target, Evas_Callback_Type type, void *event_i if (!func) return 0; if (_fd_write == -1) return 0; + _evas_async_events_fork_handle(); + ev = calloc(1, sizeof (Evas_Event_Async)); if (!ev) return 0;