On Tue, 1 Feb 2011 07:13:20 +0100 (CET) Vincent Torri <vto...@univ-evry.fr> said:
in this case i dont intend to apply to the branch. its a slightly "major" change. > > 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 > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ 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