On Tue, 1 Feb 2011 07:30:02 +0100 (CET) Vincent Torri <vto...@univ-evry.fr>
said:

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

thats if you have it as a patch - a commit wont have a patch.. well unless u
dig it out from svn or remember to svn diff before u commit and make a patch..
and that assumes the patch applies. as time goes on patches will apply less
and less, so long-term yes, its possible to make a script, but it will fail
more and more as time goes on... so its savings i believe will be moot.

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


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