Enlightenment CVS committal Author : raster Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore Modified Files: ecore_signal.c Log Message: gak! al the siginfo handlign was wrong. u'd get bogus siginfo data from whatever child exited last - not the one u wanted, not to mention all other signals. now there's a queue at least. 256 long. moight be a bit too long. =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/ecore_signal.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -3 -r1.37 -r1.38 --- ecore_signal.c 24 Feb 2008 08:42:39 -0000 1.37 +++ ecore_signal.c 3 May 2008 08:15:15 -0000 1.38 @@ -33,6 +33,9 @@ static int _ecore_signal_exe_exit_delay(void *data); +//#define MAXSIGQ 256 // 32k +#define MAXSIGQ 64 // 8k + static volatile sig_atomic_t sig_count = 0; static volatile sig_atomic_t sigchld_count = 0; static volatile sig_atomic_t sigusr1_count = 0; @@ -41,23 +44,25 @@ static volatile sig_atomic_t sigquit_count = 0; static volatile sig_atomic_t sigint_count = 0; static volatile sig_atomic_t sigterm_count = 0; - -static volatile siginfo_t sigchld_info; -static volatile siginfo_t sigusr1_info; -static volatile siginfo_t sigusr2_info; -static volatile siginfo_t sighup_info; -static volatile siginfo_t sigquit_info; -static volatile siginfo_t sigint_info; -static volatile siginfo_t sigterm_info; - #ifdef SIGPWR static volatile sig_atomic_t sigpwr_count = 0; -static volatile siginfo_t sigpwr_info = {0}; #endif - #ifdef SIGRTMIN static volatile sig_atomic_t *sigrt_count = NULL; -static volatile siginfo_t *sigrt_info = NULL; +#endif + +static volatile siginfo_t sigchld_info[MAXSIGQ]; +static volatile siginfo_t sigusr1_info[MAXSIGQ]; +static volatile siginfo_t sigusr2_info[MAXSIGQ]; +static volatile siginfo_t sighup_info[MAXSIGQ]; +static volatile siginfo_t sigquit_info[MAXSIGQ]; +static volatile siginfo_t sigint_info[MAXSIGQ]; +static volatile siginfo_t sigterm_info[MAXSIGQ]; +#ifdef SIGPWR +static volatile siginfo_t sigpwr_info[MAXSIGQ]; +#endif +#ifdef SIGRTMIN +static volatile siginfo_t *sigrt_info[MAXSIGQ]; #endif void @@ -102,10 +107,13 @@ sigrt_count = NULL; } - if (sigrt_info) + for (i = 0; i < MAXSIGQ; i++) { - free((siginfo_t *) sigrt_info); - sigrt_info = NULL; + if (sigrt_info[i]) + { + free((siginfo_t *) sigrt_info[i]); + sigrt_info[i] = NULL; + } } #endif } @@ -134,8 +142,11 @@ sigrt_count = calloc(1, sizeof(sig_atomic_t) * num); assert(sigrt_count); - sigrt_info = calloc(1, sizeof(siginfo_t) * num); - assert(sigrt_info); + for (i = 0; i < MAXSIGQ; i++) + { + sigrt_info[i] = calloc(1, sizeof(siginfo_t) * num); + assert(sigrt_info[i]); + } for (i = 0; i < num; i++) _ecore_signal_callback_set(SIGRTMIN + i, _ecore_signal_callback_sigrt); @@ -154,8 +165,32 @@ #ifdef SIGRTMIN int i, num = SIGRTMAX - SIGRTMIN; #endif - - while (sigchld_count > 0) + volatile sig_atomic_t n; + sigset_t oldset, newset; + + if (sig_count == 0) return; + sigemptyset(&newset); + sigaddset(&newset, SIGPIPE); + sigaddset(&newset, SIGALRM); + sigaddset(&newset, SIGCHLD); + sigaddset(&newset, SIGUSR1); + sigaddset(&newset, SIGUSR2); + sigaddset(&newset, SIGHUP); + sigaddset(&newset, SIGQUIT); + sigaddset(&newset, SIGINT); + sigaddset(&newset, SIGTERM); +#ifdef SIGPWR + sigaddset(&newset, SIGPWR); +#endif +#ifdef SIGRTMIN + for (i = 0; i < num; i++) + sigaddset(&newset, SIGRTMIN + i); +#endif + sigprocmask(SIG_BLOCK, &newset, &oldset); + if (sigchld_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGCHLD in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sigchld_count, MAXSIGQ); + for (n = 0; n < sigchld_count; n++) { pid_t pid; int status; @@ -183,8 +218,8 @@ e->pid = pid; e->exe = _ecore_exe_find(pid); - if (sigchld_info.si_signo) - e->data = sigchld_info; /* No need to clone this. */ + if ((n < MAXSIGQ) && (sigchld_info[n].si_signo)) + e->data = sigchld_info[n]; /* No need to clone this. */ if ((e->exe) && (e->exe->flags & (ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR))) { @@ -220,10 +255,14 @@ } } } - sigchld_count--; sig_count--; } - while (sigusr1_count > 0) + sigchld_count = 0; + + if (sigusr1_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGUSR1 in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sigusr1_count, MAXSIGQ); + for (n = 0; n < sigusr1_count; n++) { Ecore_Event_Signal_User *e; @@ -232,15 +271,19 @@ { e->number = 1; - if (sigusr1_info.si_signo) - e->data = sigusr1_info; + if ((n < MAXSIGQ) && (sigusr1_info[n].si_signo)) + e->data = sigusr1_info[n]; ecore_event_add(ECORE_EVENT_SIGNAL_USER, e, NULL, NULL); } - sigusr1_count--; sig_count--; } - while (sigusr2_count > 0) + sigusr1_count = 0; + + if (sigusr2_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGUSR2 in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sigusr2_count, MAXSIGQ); + for (n = 0; n < sigusr2_count; n++) { Ecore_Event_Signal_User *e; @@ -249,30 +292,38 @@ { e->number = 2; - if (sigusr2_info.si_signo) - e->data = sigusr2_info; + if ((n < MAXSIGQ) && (sigusr2_info[n].si_signo)) + e->data = sigusr2_info[n]; ecore_event_add(ECORE_EVENT_SIGNAL_USER, e, NULL, NULL); } - sigusr2_count--; sig_count--; } - while (sighup_count > 0) + sigusr2_count = 0; + + if (sighup_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGHUP in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sighup_count, MAXSIGQ); + for (n = 0; n < sighup_count; n++) { Ecore_Event_Signal_Hup *e; e = _ecore_event_signal_hup_new(); if (e) { - if (sighup_info.si_signo) - e->data = sighup_info; + if ((n < MAXSIGQ) && (sighup_info[n].si_signo)) + e->data = sighup_info[n]; ecore_event_add(ECORE_EVENT_SIGNAL_HUP, e, NULL, NULL); } - sighup_count--; sig_count--; } - while (sigquit_count > 0) + sighup_count = 0; + + if (sigquit_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGQUIT in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sigquit_count, MAXSIGQ); + for (n = 0; n < sigquit_count; n++) { Ecore_Event_Signal_Exit *e; @@ -281,15 +332,19 @@ { e->quit = 1; - if (sigquit_info.si_signo) - e->data = sigquit_info; + if ((n < MAXSIGQ) && (sigquit_info[n].si_signo)) + e->data = sigquit_info[n]; ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL); } - sigquit_count--; sig_count--; } - while (sigint_count > 0) + sigquit_count = 0; + + if (sigint_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGINT in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sigint_count, MAXSIGQ); + for (n = 0; n < sigint_count; n++) { Ecore_Event_Signal_Exit *e; @@ -298,15 +353,19 @@ { e->interrupt = 1; - if (sigint_info.si_signo) - e->data = sigint_info; + if ((n < MAXSIGQ) && (sigint_info[n].si_signo)) + e->data = sigint_info[n]; ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL); } - sigint_count--; sig_count--; } - while (sigterm_count > 0) + sigint_count = 0; + + if (sigterm_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGTERM in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sigterm_count, MAXSIGQ); + for (n = 0; n < sigterm_count; n++) { Ecore_Event_Signal_Exit *e; @@ -315,36 +374,43 @@ { e->terminate = 1; - if (sigterm_info.si_signo) - e->data = sigterm_info; + if ((n < MAXSIGQ) && (sigterm_info[n].si_signo)) + e->data = sigterm_info[n]; ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL); } - sigterm_count--; sig_count--; } + sigterm_count = 0; + #ifdef SIGPWR - while (sigpwr_count > 0) + if (sigpwr_count > MAXSIGQ) + printf("ECORE WARNING. %i SIGPWR in queue. max queue size %i. losing " + "siginfo for extra signals.\n", sigpwr_count, MAXSIGQ); + for (n = 0; n < sigpwr_count; n++) { Ecore_Event_Signal_Power *e; e = _ecore_event_signal_power_new(); if (e) { - if (sigpwr_info.si_signo) - e->data = sigpwr_info; + if ((n < MAXSIGQ) && (sigpwr_info[n].si_signo)) + e->data = sigpwr_info[n]; ecore_event_add(ECORE_EVENT_SIGNAL_POWER, e, NULL, NULL); } - sigpwr_count--; sig_count--; } + sigpwr_count = 0; #endif #ifdef SIGRTMIN for (i = 0; i < num; i++) { - while (sigrt_count[i] > 0) + if (sigrt_count[i] > MAXSIGQ) + printf("ECORE WARNING. %i SIGRT%i in queue. max queue size %i. losing " + "siginfo for extra signals.\n", i + 1, sigrt_count[i], MAXSIGQ); + for (n = 0; n < sigrt_count[i]; n++) { Ecore_Event_Signal_Realtime *e; @@ -352,17 +418,17 @@ { e->num = i; - if (sigrt_info[i].si_signo) - e->data = sigrt_info[i]; + if ((n < MAXSIGQ) && (sigrt_info[n][i].si_signo)) + e->data = sigrt_info[n][i]; ecore_event_add(ECORE_EVENT_SIGNAL_REALTIME, e, NULL, NULL); } - - sigrt_count[i]--; sig_count--; } + sigrt_count[i] = 0; } #endif + sigprocmask(SIG_SETMASK, &oldset, NULL); } static void @@ -384,10 +450,15 @@ static void _ecore_signal_callback_sigchld(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigchld_info = *si; - else - sigchld_info.si_signo = 0; + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sigchld_info[n] = *si; + else + sigchld_info[n].si_signo = 0; + } sigchld_count++; sig_count++; @@ -396,11 +467,15 @@ static void _ecore_signal_callback_sigusr1(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigusr1_info = *si; - else - sigusr1_info.si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sigusr1_info[n] = *si; + else + sigusr1_info[n].si_signo = 0; + } sigusr1_count++; sig_count++; } @@ -408,11 +483,15 @@ static void _ecore_signal_callback_sigusr2(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigusr2_info = *si; - else - sigusr2_info.si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sigusr2_info[n] = *si; + else + sigusr2_info[n].si_signo = 0; + } sigusr2_count++; sig_count++; } @@ -420,11 +499,15 @@ static void _ecore_signal_callback_sighup(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sighup_info = *si; - else - sighup_info.si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sighup_info[n] = *si; + else + sighup_info[n].si_signo = 0; + } sighup_count++; sig_count++; } @@ -432,11 +515,15 @@ static void _ecore_signal_callback_sigquit(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigquit_info = *si; - else - sigquit_info.si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sigquit_info[n] = *si; + else + sigquit_info[n].si_signo = 0; + } sigquit_count++; sig_count++; } @@ -444,11 +531,15 @@ static void _ecore_signal_callback_sigint(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigint_info = *si; - else - sigint_info.si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sigint_info[n] = *si; + else + sigint_info[n].si_signo = 0; + } sigint_count++; sig_count++; } @@ -456,11 +547,15 @@ static void _ecore_signal_callback_sigterm(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigterm_info = *si; - else - sigterm_info.si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sigterm_info[n] = *si; + else + sigterm_info[n].si_signo = 0; + } sigterm_count++; sig_count++; } @@ -469,11 +564,15 @@ static void _ecore_signal_callback_sigpwr(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigpwr_info = *si; - else - sigpwr_info.si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + if (n < MAXSIGQ) + { + if (si) + sigpwr_info[n] = *si; + else + sigpwr_info[n].si_signo = 0; + } sigpwr_count++; sig_count++; } @@ -483,11 +582,15 @@ static void _ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo __UNUSED__) { - if (si) - sigrt_info[sig - SIGRTMIN] = *si; - else - sigrt_info[sig - SIGRTMIN].si_signo = 0; - + volatile sig_atomic_t n; + n = sigchld_count; + 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++; } ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs