wouldn't it be possible to do a script that apply a patch against trunk and a branch if needed ?
Vincent On Mon, 31 Jan 2011, Enlightenment SVN wrote: > Log: > From: Mike McCormack <mj.mccorm...@samsung.com> > Subject: Re: [E-devel] [PATCH] Handle ecore signals with a pipe > > This removes a race condition in the main loop where > a signal could come after the signal check, and before > entering the select loop, possibly resulting in a hang. > > In practice, this hang wouldn't be seen due to other activity > in the main loop. > > > > Author: raster > Date: 2011-01-31 21:56:15 -0800 (Mon, 31 Jan 2011) > New Revision: 56613 > Trac: http://trac.enlightenment.org/e/changeset/56613 > > Modified: > trunk/ecore/ChangeLog trunk/ecore/src/lib/ecore/ecore_signal.c > > Modified: trunk/ecore/ChangeLog > =================================================================== > --- trunk/ecore/ChangeLog 2011-01-31 18:57:13 UTC (rev 56612) > +++ trunk/ecore/ChangeLog 2011-02-01 05:56:15 UTC (rev 56613) > @@ -15,3 +15,7 @@ > * Fix: ecore-evas CAN send "render done" messages even if not > waiting for sync counter when using gl engine. new semi-sync > mode to account for that. > + > +2011-02-01 Mike McCormack > + > + * Use pipe to catch signals to avoid signal loss race > > Modified: trunk/ecore/src/lib/ecore/ecore_signal.c > =================================================================== > --- trunk/ecore/src/lib/ecore/ecore_signal.c 2011-01-31 18:57:13 UTC (rev > 56612) > +++ trunk/ecore/src/lib/ecore/ecore_signal.c 2011-02-01 05:56:15 UTC (rev > 56613) > @@ -17,20 +17,13 @@ > /* valgrind in some versions/setups uses SIGRT's... hmmm */ > #undef SIGRTMIN > > +static int _ecore_signal_pipe[2]; > + > typedef void (*Signal_Handler)(int sig, siginfo_t *si, void *foo); > > static void _ecore_signal_callback_set(int sig, Signal_Handler func); > static void _ecore_signal_callback_ignore(int sig, siginfo_t *si, void *foo); > -static void _ecore_signal_callback_sigchld(int sig, siginfo_t *si, void > *foo); > -static void _ecore_signal_callback_sigusr1(int sig, siginfo_t *si, void > *foo); > -static void _ecore_signal_callback_sigusr2(int sig, siginfo_t *si, void > *foo); > -static void _ecore_signal_callback_sighup(int sig, siginfo_t *si, void *foo); > -static void _ecore_signal_callback_sigquit(int sig, siginfo_t *si, void > *foo); > -static void _ecore_signal_callback_sigint(int sig, siginfo_t *si, void *foo); > -static void _ecore_signal_callback_sigterm(int sig, siginfo_t *si, void > *foo); > -#ifdef SIGPWR > -static void _ecore_signal_callback_sigpwr(int sig, siginfo_t *si, void *foo); > -#endif > +static void _ecore_signal_callback_write_pipe(int sig, siginfo_t *si, void > *foo); > > #ifdef SIGRTMIN > static void _ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo); > @@ -99,6 +92,9 @@ > sigterm_count = 0; > sig_count = 0; > > + close(_ecore_signal_pipe[0]); > + close(_ecore_signal_pipe[1]); > + > #ifdef SIGRTMIN > for (i = 0; i < num; i++) > { > @@ -123,24 +119,110 @@ > #endif > } > > +Eina_Bool > +_ecore_signal_pipe_read(void *data, Ecore_Fd_Handler *fdh) > +{ > + siginfo_t si; > + int sig = -1; > + int r; > + int n; > + > + r = read(_ecore_signal_pipe[0], &si, sizeof si); > + if (r != sizeof si) > + { > + WRN("failed to read signal\n"); > + return; > + } > + > + sig = si.si_signo; > + > + switch (sig) > + { > + case SIGCHLD: > + n = sigchld_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sigchld_info[n] = si; > + break; > + case SIGUSR1: > + n = sigusr1_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sigusr1_info[n] = si; > + break; > + case SIGUSR2: > + n = sigusr2_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sigusr2_info[n] = si; > + break; > + case SIGHUP: > + n = sighup_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sighup_info[n] = si; > + break; > + case SIGQUIT: > + n = sigquit_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sigquit_info[n] = si; > + break; > + case SIGINT: > + n = sigint_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sigint_info[n] = si; > + break; > + case SIGTERM: > + n = sigterm_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sigterm_info[n] = si; > + break; > +#ifdef SIGPWR > + case SIGPWR: > + n = sigpwr_count++; > + sig_count++; > + if (n < MAXSIGQ) > + sigpwr_info[n] = si; > + break; > +#endif > + default: > + ERR("unknown signal %d\n", sig); > + break; > + } > +} > + > void > _ecore_signal_init(void) > { > #ifdef SIGRTMIN > int i, num = SIGRTMAX - SIGRTMIN; > #endif > + int pfd[2]; > + int r; > > + r = pipe(_ecore_signal_pipe); > + if (r < 0) > + { > + ERR("pipe failed (%d)\n", r); > + exit(1); > + } > + ecore_main_fd_handler_add(_ecore_signal_pipe[0], ECORE_FD_READ, > + &_ecore_signal_pipe_read, NULL, NULL, NULL); > + > _ecore_signal_callback_set(SIGPIPE, _ecore_signal_callback_ignore); > _ecore_signal_callback_set(SIGALRM, _ecore_signal_callback_ignore); > - _ecore_signal_callback_set(SIGCHLD, _ecore_signal_callback_sigchld); > - _ecore_signal_callback_set(SIGUSR1, _ecore_signal_callback_sigusr1); > - _ecore_signal_callback_set(SIGUSR2, _ecore_signal_callback_sigusr2); > - _ecore_signal_callback_set(SIGHUP, _ecore_signal_callback_sighup); > - _ecore_signal_callback_set(SIGQUIT, _ecore_signal_callback_sigquit); > - _ecore_signal_callback_set(SIGINT, _ecore_signal_callback_sigint); > - _ecore_signal_callback_set(SIGTERM, _ecore_signal_callback_sigterm); > + _ecore_signal_callback_set(SIGCHLD, _ecore_signal_callback_write_pipe); > + _ecore_signal_callback_set(SIGUSR1, _ecore_signal_callback_write_pipe); > + _ecore_signal_callback_set(SIGUSR2, _ecore_signal_callback_write_pipe); > + _ecore_signal_callback_set(SIGHUP, _ecore_signal_callback_write_pipe); > + _ecore_signal_callback_set(SIGQUIT, _ecore_signal_callback_write_pipe); > + _ecore_signal_callback_set(SIGINT, _ecore_signal_callback_write_pipe); > + _ecore_signal_callback_set(SIGTERM, _ecore_signal_callback_write_pipe); > #ifdef SIGPWR > - _ecore_signal_callback_set(SIGPWR, _ecore_signal_callback_sigpwr); > + _ecore_signal_callback_set(SIGPWR, _ecore_signal_callback_write_pipe); > #endif > > #ifdef SIGRTMIN > @@ -450,160 +532,29 @@ > sigaction(sig, &sa, NULL); > } > > -static void > -_ecore_signal_callback_ignore(int sig __UNUSED__, siginfo_t *si __UNUSED__, > void *foo __UNUSED__) > -{ > -} > > static void > -_ecore_signal_callback_sigchld(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > +_ecore_signal_callback_write_pipe(int sig __UNUSED__, siginfo_t *si > __UNUSED__, void *foo __UNUSED__) > { > - volatile sig_atomic_t n; > - n = sigchld_count; > - if (n < MAXSIGQ) > - { > - if (si) > - sigchld_info[n] = *si; > - else > - sigchld_info[n].si_signo = 0; > - } > + int r; > + siginfo_t dummy = {0}; > > - sigchld_count++; > - sig_count++; > -} > + if (!si) > + si = &dummy; > > -static void > -_ecore_signal_callback_sigusr1(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > -{ > - volatile sig_atomic_t n; > - n = sigusr1_count; > - if (n < MAXSIGQ) > + r = write(_ecore_signal_pipe[1], si, sizeof *si); > + if (r != sizeof *si) > { > - if (si) > - sigusr1_info[n] = *si; > - else > - sigusr1_info[n].si_signo = 0; > + ERR("failed to write signal pipe\n"); > + _exit(1); > } > - sigusr1_count++; > - sig_count++; > } > > static void > -_ecore_signal_callback_sigusr2(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > +_ecore_signal_callback_ignore(int sig __UNUSED__, siginfo_t *si __UNUSED__, > void *foo __UNUSED__) > { > - volatile sig_atomic_t n; > - n = sigusr2_count; > - if (n < MAXSIGQ) > - { > - if (si) > - sigusr2_info[n] = *si; > - else > - sigusr2_info[n].si_signo = 0; > - } > - sigusr2_count++; > - sig_count++; > } > > -static void > -_ecore_signal_callback_sighup(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > -{ > - volatile sig_atomic_t n; > - n = sighup_count; > - if (n < MAXSIGQ) > - { > - if (si) > - sighup_info[n] = *si; > - else > - sighup_info[n].si_signo = 0; > - } > - sighup_count++; > - sig_count++; > -} > - > -static void > -_ecore_signal_callback_sigquit(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > -{ > - volatile sig_atomic_t n; > - n = sigquit_count; > - if (n < MAXSIGQ) > - { > - if (si) > - sigquit_info[n] = *si; > - else > - sigquit_info[n].si_signo = 0; > - } > - sigquit_count++; > - sig_count++; > -} > - > -static void > -_ecore_signal_callback_sigint(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > -{ > - volatile sig_atomic_t n; > - n = sigint_count; > - if (n < MAXSIGQ) > - { > - if (si) > - sigint_info[n] = *si; > - else > - sigint_info[n].si_signo = 0; > - } > - sigint_count++; > - sig_count++; > -} > - > -static void > -_ecore_signal_callback_sigterm(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > -{ > - volatile sig_atomic_t n; > - n = sigterm_count; > - if (n < MAXSIGQ) > - { > - if (si) > - sigterm_info[n] = *si; > - else > - sigterm_info[n].si_signo = 0; > - } > - sigterm_count++; > - sig_count++; > -} > - > -#ifdef SIGPWR > -static void > -_ecore_signal_callback_sigpwr(int sig __UNUSED__, siginfo_t *si, void *foo > __UNUSED__) > -{ > - volatile sig_atomic_t n; > - n = sigpwr_count; > - if (n < MAXSIGQ) > - { > - if (si) > - sigpwr_info[n] = *si; > - else > - sigpwr_info[n].si_signo = 0; > - } > - sigpwr_count++; > - sig_count++; > -} > -#endif > - > -#ifdef SIGRTMIN > -static void > -_ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo __UNUSED__) > -{ > - volatile sig_atomic_t n; > - n = sigrt_count[sig - SIGRTMIN]; > - if (n < MAXSIGQ) > - { > - if (si) > - sigrt_info[n][sig - SIGRTMIN] = *si; > - else > - sigrt_info[n][sig - SIGRTMIN].si_signo = 0; > - } > - sigrt_count[sig - SIGRTMIN]++; > - sig_count++; > -} > -#endif > - > static Eina_Bool > _ecore_signal_exe_exit_delay(void *data) > { > > > ------------------------------------------------------------------------------ > Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! > Finally, a world-class log management solution at an even better price-free! > Download using promo code Free_Logger_4_Dev2Dev. Offer expires > February 28th, so secure your free ArcSight Logger TODAY! > http://p.sf.net/sfu/arcsight-sfd2d > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > > ------------------------------------------------------------------------------ Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! Finally, a world-class log management solution at an even better price-free! Download using promo code Free_Logger_4_Dev2Dev. Offer expires February 28th, so secure your free ArcSight Logger TODAY! http://p.sf.net/sfu/arcsight-sfd2d _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel