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

Reply via email to