Enlightenment CVS committal

Author  : tsauerbeck
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore


Modified Files:
        Ecore.h ecore_events.c ecore_private.h ecore_signal.c 


Log Message:
added support for realtime signals. all signal event structs now have a siginfo_t 
member (this might replace the unused void *ext_data). sa_sigaction is now used 
instead of sa_handler
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Ecore.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- Ecore.h     19 Mar 2004 18:40:09 -0000      1.9
+++ Ecore.h     4 Apr 2004 19:53:19 -0000       1.10
@@ -12,6 +12,7 @@
 #include <sys/stat.h>
 #include <dirent.h>
 #include <limits.h>
+#include <signal.h>
 
 #include <Ecore_Data.h>
 
@@ -45,7 +46,8 @@
 #define ECORE_EVENT_SIGNAL_HUP   3 /**< Hup signal event */
 #define ECORE_EVENT_SIGNAL_EXIT  4 /**< Exit signal event */
 #define ECORE_EVENT_SIGNAL_POWER 5 /**< Power signal event */
-#define ECORE_EVENT_COUNT        6
+#define ECORE_EVENT_SIGNAL_REALTIME 6 /**< Realtime signal event */
+#define ECORE_EVENT_COUNT        7
    
 #ifndef _ECORE_PRIVATE_H   
    enum _Ecore_Fd_Handler_Flags
@@ -71,6 +73,7 @@
    typedef struct _Ecore_Event_Signal_Hup   Ecore_Event_Signal_Hup; /**< Hup signal 
event */
    typedef struct _Ecore_Event_Signal_Exit  Ecore_Event_Signal_Exit; /**< Exit signal 
event */
    typedef struct _Ecore_Event_Signal_Power Ecore_Event_Signal_Power; /**< Power 
signal event */
+   typedef struct _Ecore_Event_Signal_Realtime Ecore_Event_Signal_Realtime; /**< 
Realtime signal event */
 
    struct _Ecore_Event_Exe_Exit /** Process exit event */
      {
@@ -81,17 +84,20 @@
        char       exited    : 1; /** < set to 1 if the process exited of its own 
accord */
        char       signalled : 1; /** < set to 1 id the process exited due to uncaught 
signal */
        void      *ext_data; /**< Extension data - not used */
+    siginfo_t  data; /**< Signal info */
      };
 
    struct _Ecore_Event_Signal_User /** User signal event */
      {
        int   number; /**< The signal number. Either 1 or 2 */
        void *ext_data; /**< Extension data - not used */
+    siginfo_t data; /**< Signal info */
      };
    
    struct _Ecore_Event_Signal_Hup /** Hup signal event */
      {
        void *ext_data; /**< Extension data - not used */
+    siginfo_t data; /**< Signal info */
      };
    
    struct _Ecore_Event_Signal_Exit /** Exit request event */
@@ -100,11 +106,19 @@
        int   quit      : 1; /**< set if the exit request was a quit signal */
        int   terminate : 1; /**< Set if the exit request was a terminate singal */
        void *ext_data; /**< Extension data - not used */
+    siginfo_t data; /**< Signal info */
      };
 
    struct _Ecore_Event_Signal_Power /** Power event */
      {
-       void *ext_data; /**< Extension data - not used */
+       void *ext_data; /**< Extension data - not used */
+       siginfo_t data; /**< Signal info */
+     };
+
+   struct _Ecore_Event_Signal_Realtime /** Realtime event */
+     {
+    int num; /**< The realtime signal's number */
+    siginfo_t data; /**< Signal info */
      };
 
    int  ecore_init(void);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_events.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- ecore_events.c      18 Mar 2004 05:29:54 -0000      1.8
+++ ecore_events.c      4 Apr 2004 19:53:19 -0000       1.9
@@ -540,3 +540,15 @@
    e = ev;
    free(e);
 }
+
+void *
+_ecore_event_signal_realtime_new(void)
+{
+   return calloc(1, sizeof(Ecore_Event_Signal_Realtime));
+}
+
+void
+_ecore_event_signal_realtime_free(void *data, void *ev)
+{
+   free(ev);
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_private.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- ecore_private.h     18 Mar 2004 05:29:54 -0000      1.6
+++ ecore_private.h     4 Apr 2004 19:53:19 -0000       1.7
@@ -192,6 +192,8 @@
 void          _ecore_event_signal_exit_free(void *data, void *ev);
 void         *_ecore_event_signal_power_new(void);
 void          _ecore_event_signal_power_free(void *data, void *ev);
+void         * _ecore_event_signal_realtime_new(void);
+void          _ecore_event_signal_realtime_free(void *data, void *ev);
 
 void          _ecore_main_shutdown(void);
     
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_signal.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ecore_signal.c      4 Apr 2004 12:17:32 -0000       1.5
+++ ecore_signal.c      4 Apr 2004 19:53:19 -0000       1.6
@@ -5,18 +5,26 @@
 #include <sys/wait.h>
 #include <signal.h>
 #include <unistd.h>
+#include <assert.h>
 
-static void _ecore_signal_callback_set(int sig, void (*func)(int sig));
-static void _ecore_signal_callback_ignore(int sig);
-static void _ecore_signal_callback_sigchld(int sig);
-static void _ecore_signal_callback_sigusr1(int sig);
-static void _ecore_signal_callback_sigusr2(int sig);
-static void _ecore_signal_callback_sighup(int sig);
-static void _ecore_signal_callback_sigquit(int sig);
-static void _ecore_signal_callback_sigint(int sig);
-static void _ecore_signal_callback_sigterm(int sig);
-static void _ecore_signal_callback_sigpwr(int sig);
+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);
+static void _ecore_signal_callback_sigpwr(int sig, siginfo_t *si, void *foo);
+
+#ifdef SIGRTMIN
+static void _ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo);
+#endif
+
+static volatile sig_atomic_t sig_count = 0;
 static volatile sig_atomic_t sigchld_count = 0;
 static volatile sig_atomic_t sigusr1_count = 0;
 static volatile sig_atomic_t sigusr2_count = 0;
@@ -24,25 +32,44 @@
 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 = {0};
+static volatile siginfo_t sigusr1_info = {0};
+static volatile siginfo_t sigusr2_info = {0};
+static volatile siginfo_t sighup_info = {0};
+static volatile siginfo_t sigquit_info = {0};
+static volatile siginfo_t sigint_info = {0};
+static volatile siginfo_t sigterm_info = {0};
+
+#ifdef SIGPWR
 static volatile sig_atomic_t sigpwr_count = 0;
+static volatile siginfo_t sigpwr_info = {0};
+#endif
 
-static volatile sig_atomic_t sig_count = 0;
+#ifdef SIGRTMIN
+static volatile sig_atomic_t *sigrt_count = NULL;
+static volatile siginfo_t *sigrt_info = NULL;
+#endif
 
 void
 _ecore_signal_shutdown(void)
 {
-   _ecore_signal_callback_set(SIGPIPE, SIG_DFL);
-   _ecore_signal_callback_set(SIGALRM, SIG_DFL);
-   _ecore_signal_callback_set(SIGCHLD, SIG_DFL);
-   _ecore_signal_callback_set(SIGUSR1, SIG_DFL);
-   _ecore_signal_callback_set(SIGUSR2, SIG_DFL);
-   _ecore_signal_callback_set(SIGHUP,  SIG_DFL);
-   _ecore_signal_callback_set(SIGQUIT, SIG_DFL);
-   _ecore_signal_callback_set(SIGINT,  SIG_DFL);
-   _ecore_signal_callback_set(SIGTERM, SIG_DFL);
-   #ifdef SIGPWR
-   _ecore_signal_callback_set(SIGPWR,  SIG_DFL);
-   #endif
+#ifdef SIGRTMIN
+   int i, num = SIGRTMAX - SIGRTMIN;
+#endif
+
+   _ecore_signal_callback_set(SIGPIPE, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGALRM, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGCHLD, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGUSR1, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGUSR2, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGHUP,  (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGQUIT, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGINT,  (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGTERM, (Signal_Handler) SIG_DFL);
+#ifdef SIGPWR
+   _ecore_signal_callback_set(SIGPWR, (Signal_Handler) SIG_DFL);
+#endif
    sigchld_count = 0;
    sigusr1_count = 0;
    sigusr2_count = 0;
@@ -52,11 +79,32 @@
    sigterm_count = 0;
    sigpwr_count = 0;
    sig_count = 0;
+
+#ifdef SIGRTMIN
+   for (i = 0; i < num; i++) {
+      _ecore_signal_callback_set(SIGRTMIN + i, (Signal_Handler) SIG_DFL);
+      sigrt_count[i] = 0;
+   }
+
+   if (sigrt_count) {
+      free((sig_atomic_t *) sigrt_count);
+      sigrt_count = NULL;
+   }
+
+   if (sigrt_info) {
+      free((siginfo_t *) sigrt_info);
+      sigrt_info = NULL;
+   }
+#endif
 }
 
 void
 _ecore_signal_init(void)
 {
+#ifdef SIGRTMIN
+   int i, num = SIGRTMAX - SIGRTMIN;
+#endif
+
    _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);
@@ -66,9 +114,20 @@
    _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);
-   #ifdef SIGPWR
+#ifdef SIGPWR
    _ecore_signal_callback_set(SIGPWR,  _ecore_signal_callback_sigpwr);
-   #endif
+#endif
+
+#ifdef SIGRTMIN
+   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 < num; i++)
+      _ecore_signal_callback_set(SIGRTMIN + i, _ecore_signal_callback_sigrt);
+#endif
 }
 
 int
@@ -80,6 +139,10 @@
 void
 _ecore_signal_call(void)
 {
+#ifdef SIGRTMIN
+   int i, num = SIGRTMAX - SIGRTMIN;
+#endif
+
    while (sigchld_count > 0)
      {
        pid_t pid;
@@ -104,6 +167,7 @@
                    }
                  e->pid = pid;
                  e->exe = _ecore_exe_find(pid);
+          e->data = sigchld_info;
                  _ecore_event_add(ECORE_EVENT_EXE_EXIT, e, 
                                   _ecore_event_exe_exit_free, NULL);
               }
@@ -119,6 +183,7 @@
        if (e)
          {
             e->number = 1;
+            e->data = sigusr1_info;     
             _ecore_event_add(ECORE_EVENT_SIGNAL_USER, e,
                              _ecore_event_signal_user_free, NULL);
          }
@@ -133,6 +198,7 @@
        if (e)
          {
             e->number = 2;
+            e->data = sigusr2_info;     
             _ecore_event_add(ECORE_EVENT_SIGNAL_USER, e,
                              _ecore_event_signal_user_free, NULL);
          }
@@ -146,6 +212,7 @@
        e = _ecore_event_signal_hup_new();
        if (e)
          {
+           e->data = sighup_info;
             _ecore_event_add(ECORE_EVENT_SIGNAL_HUP, e,
                              _ecore_event_signal_hup_free, NULL);
          }
@@ -160,6 +227,7 @@
        if (e)
          {
             e->quit = 1;
+            e->data = sigquit_info;
             _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
                              _ecore_event_signal_exit_free, NULL);
          }
@@ -174,6 +242,7 @@
        if (e)
          {
             e->interrupt = 1;
+            e->data = sigint_info;
             _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
                              _ecore_event_signal_exit_free, NULL);
          }
@@ -188,12 +257,14 @@
        if (e)
          {
             e->terminate = 1;
+            e->data = sigterm_info;
             _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
                              _ecore_event_signal_exit_free, NULL);
          }
        sigterm_count--;
        sig_count--;
      }
+#ifdef SIGPWR
    while (sigpwr_count > 0)
      {
        Ecore_Event_Signal_Power *e;
@@ -201,82 +272,120 @@
        e = _ecore_event_signal_power_new();
        if (e)
          {
+            e->data = sigpwr_info;
             _ecore_event_add(ECORE_EVENT_SIGNAL_POWER, e,
                              _ecore_event_signal_power_free, NULL);
          }
        sigpwr_count--;
        sig_count--;
      }
+#endif
+
+#ifdef SIGRTMIN
+   for (i = 0; i < num; i++)
+      while (sigrt_count[i] > 0) {
+         Ecore_Event_Signal_Realtime *e;
+
+         if ((e = _ecore_event_signal_realtime_new())) {
+            e->data = sigrt_info[i];
+            _ecore_event_add(ECORE_EVENT_SIGNAL_REALTIME, e,
+                             _ecore_event_signal_realtime_free, NULL);
+         }
+
+         sigrt_count[i]--;
+         sig_count--;
+      }
+#endif
 }
 
 static void
-_ecore_signal_callback_set(int sig, void (*func)(int sig))
+_ecore_signal_callback_set(int sig, Signal_Handler func)
 {
    struct sigaction  sa;
 
-   sa.sa_handler = func;
-   sa.sa_flags = SA_RESTART;
+   sa.sa_sigaction = func;
+   sa.sa_flags = SA_RESTART | SA_SIGINFO;
    sigemptyset(&sa.sa_mask);
-   sigaction(sig, &sa, NULL);   
+   sigaction(sig, &sa, NULL); 
 }
 
 static void
-_ecore_signal_callback_ignore(int sig)
+_ecore_signal_callback_ignore(int sig, siginfo_t *si, void *foo)
 {
 }
 
 static void
-_ecore_signal_callback_sigchld(int sig)
+_ecore_signal_callback_sigchld(int sig, siginfo_t *si, void *foo)
 {
+   sigchld_info = *si;
    sigchld_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigusr1(int sig)
+_ecore_signal_callback_sigusr1(int sig, siginfo_t *si, void *foo)
 {
+   sigusr1_info = *si;
    sigusr1_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigusr2(int sig)
+_ecore_signal_callback_sigusr2(int sig, siginfo_t *si, void *foo)
 {
+   sigusr2_info = *si;
    sigusr2_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sighup(int sig)
+_ecore_signal_callback_sighup(int sig, siginfo_t *si, void *foo)
 {
+   sighup_info = *si;
    sighup_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigquit(int sig)
+_ecore_signal_callback_sigquit(int sig, siginfo_t *si, void *foo)
 {
+   sigquit_info = *si;
    sigquit_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigint(int sig)
+_ecore_signal_callback_sigint(int sig, siginfo_t *si, void *foo)
 {
+   sigint_info = *si;
    sigint_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigterm(int sig)
+_ecore_signal_callback_sigterm(int sig, siginfo_t *si, void *foo)
 {
+   sigterm_info = *si;
    sigterm_count++;
    sig_count++;
 }
 
+#ifdef SIGPWR
 static void
-_ecore_signal_callback_sigpwr(int sig)
+_ecore_signal_callback_sigpwr(int sig, siginfo_t *si, void *foo)
 {
+   sigpwr_info = *si;
    sigpwr_count++;
    sig_count++;
 }
+#endif
+
+#ifdef SIGRTMIN
+static void
+_ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo)
+{
+   sigrt_info[sig - SIGRTMIN] = *si;
+   sigrt_count[sig - SIGRTMIN]++;
+   sig_count++;
+}
+#endif




-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to