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