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

Reply via email to