On Tue, 1 Feb 2011, Carsten Haitzler (The Rasterman) wrote:

> 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.

ok. And about my question ?

Vincent

>
>>
>> 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