[Xenomai-git] Gilles Chanteperdrix : skins: add per-skin user-space signal handler, and dispatch function.

2009-12-02 Thread GIT version control
Module: xenomai-head
Branch: master
Commit: b5204f9aa6d64b96f80202433d816727dc4e3743
URL:
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=b5204f9aa6d64b96f80202433d816727dc4e3743

Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org
Date:   Sun Nov 22 23:07:21 2009 +0100

skins: add per-skin user-space signal handler, and dispatch function.

---

 include/asm-generic/bits/bind.h |   12 ++--
 include/asm-generic/syscall.h   |   58 ++-
 src/skins/common/bind.c |   23 +++-
 src/skins/native/init.c |2 +-
 src/skins/posix/init.c  |3 +-
 src/skins/psos+/init.c  |3 +-
 src/skins/rtai/init.c   |3 +-
 src/skins/rtdm/init.c   |3 +-
 src/skins/uitron/init.c |3 +-
 src/skins/vrtx/init.c   |2 +-
 src/skins/vxworks/init.c|2 +-
 11 files changed, 94 insertions(+), 20 deletions(-)

diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h
index 7da2c43..7267e0d 100644
--- a/include/asm-generic/bits/bind.h
+++ b/include/asm-generic/bits/bind.h
@@ -5,15 +5,21 @@
 #include stdlib.h
 #include signal.h
 
+union xnsiginfo;
+
+typedef void xnsighandler(union xnsiginfo *si);
+
 void xeno_handle_mlock_alert(int sig);
 
 int 
-xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module);
+xeno_bind_skin_opt(unsigned skin_magic, const char *skin, 
+  const char *module, xnsighandler *sighandler);
 
 static inline int 
-xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module)
+xeno_bind_skin(unsigned skin_magic, const char *skin, 
+  const char *module, xnsighandler *sighandler)
 {
-   int muxid = xeno_bind_skin_opt(skin_magic, skin, module);
+   int muxid = xeno_bind_skin_opt(skin_magic, skin, module, sighandler);
struct sigaction sa;
 
if (muxid == -1) {
diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h
index 09c9128..926498b 100644
--- a/include/asm-generic/syscall.h
+++ b/include/asm-generic/syscall.h
@@ -21,6 +21,16 @@
 #define _XENO_ASM_GENERIC_SYSCALL_H
 
 #include asm/xenomai/features.h
+#ifdef __KERNEL__
+#include linux/types.h
+#include linux/signal.h
+#include asm/uaccess.h
+#include asm/xenomai/wrappers.h
+#include asm/xenomai/hal.h
+#else /* !__KERNEL__ */
+#include sys/types.h
+#include signal.h
+#endif /* !__KERNEL__ */
 
 /* Xenomai multiplexer syscall. */
 #define __xn_sys_mux   555 /* Must fit within 15bit */
@@ -35,6 +45,7 @@
 #define __xn_sys_sem_heap  7
 #define __xn_sys_current   8   /* threadh = xnthread_handle(cur) */
 #define __xn_sys_current_info  9   /* r = xnshadow_current_info(info) */
+#define __xn_sys_get_next_sigs 10  /* only unqueue pending signals. */
 
 #define XENOMAI_LINUX_DOMAIN  0
 #define XENOMAI_XENO_DOMAIN   1
@@ -51,12 +62,20 @@ typedef struct xnsysinfo {
 #define sigshadow_arg(code) (((code)  8)  0xff)
 #define sigshadow_int(action, arg) ((action) | ((arg)  8))
 
-#ifdef __KERNEL__
+union xnsiginfo {
+   struct siginfo pse51_si;
+};
 
-#include linux/types.h
-#include asm/uaccess.h
-#include asm/xenomai/wrappers.h
-#include asm/xenomai/hal.h
+struct xnsig {
+   unsigned nsigs;
+   unsigned remaining;
+   struct {
+   unsigned muxid;
+   union xnsiginfo si;
+   } pending[16];
+};
+
+#ifdef __KERNEL__
 
 struct task_struct;
 struct pt_regs;
@@ -137,8 +156,33 @@ static inline int __xn_safe_strncpy_from_user(char *dst,
 }
 
 #else /* !__KERNEL__ */
-#include sys/types.h
-#endif /* __KERNEL__ */
+
+#ifdef __cplusplus
+extern C
+#endif /* __cplusplus */
+int __xnsig_dispatch(struct xnsig *sigs, int cumulated_error, int last_error);
+
+/* Called to dispatch signals which interrupted a system call. */
+static inline int xnsig_dispatch(struct xnsig *sigs, int cumul, int last)
+{
+   if (sigs-nsigs)
+   return __xnsig_dispatch(sigs, cumul, last);
+   return last;
+}
+
+/* Called to dispatch additional signals (received with the special
+   system call __xn_sys_get_next_sigs), it may happen that this
+   syscall was in fact called whereas no additional signal was
+   pending, in this case, ignore the syscall return value (last) and
+   preserve the cumulated error. */
+static inline int xnsig_dispatch_next(struct xnsig *sigs, int cumul, int last)
+{
+   if (sigs-nsigs)
+   return __xnsig_dispatch(sigs, cumul, last);
+   return cumul;
+}
+
+#endif /* !__KERNEL__ */
 
 typedef struct xncompletion {
long syncflag;  /* Semaphore variable. */
diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c
index 1315840..e4a4c3c 100644
--- a/src/skins/common/bind.c
+++ b/src/skins/common/bind.c
@@ -9,6 +9,8 @@
 #include asm-generic/xenomai/bits/current.h
 #include sem_heap.h
 
+static xnsighandler *xnsig_handlers[32];
+
 void __attribute__((weak)) xeno_sigill_handler(int sig)
 

[Xenomai-git] Gilles Chanteperdrix : skins: add per-skin user-space signal handler, and dispatch function.

2009-12-01 Thread GIT version control
Module: xenomai-gch
Branch: for-head
Commit: b5204f9aa6d64b96f80202433d816727dc4e3743
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=b5204f9aa6d64b96f80202433d816727dc4e3743

Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org
Date:   Sun Nov 22 23:07:21 2009 +0100

skins: add per-skin user-space signal handler, and dispatch function.

---

 include/asm-generic/bits/bind.h |   12 ++--
 include/asm-generic/syscall.h   |   58 ++-
 src/skins/common/bind.c |   23 +++-
 src/skins/native/init.c |2 +-
 src/skins/posix/init.c  |3 +-
 src/skins/psos+/init.c  |3 +-
 src/skins/rtai/init.c   |3 +-
 src/skins/rtdm/init.c   |3 +-
 src/skins/uitron/init.c |3 +-
 src/skins/vrtx/init.c   |2 +-
 src/skins/vxworks/init.c|2 +-
 11 files changed, 94 insertions(+), 20 deletions(-)

diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h
index 7da2c43..7267e0d 100644
--- a/include/asm-generic/bits/bind.h
+++ b/include/asm-generic/bits/bind.h
@@ -5,15 +5,21 @@
 #include stdlib.h
 #include signal.h
 
+union xnsiginfo;
+
+typedef void xnsighandler(union xnsiginfo *si);
+
 void xeno_handle_mlock_alert(int sig);
 
 int 
-xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module);
+xeno_bind_skin_opt(unsigned skin_magic, const char *skin, 
+  const char *module, xnsighandler *sighandler);
 
 static inline int 
-xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module)
+xeno_bind_skin(unsigned skin_magic, const char *skin, 
+  const char *module, xnsighandler *sighandler)
 {
-   int muxid = xeno_bind_skin_opt(skin_magic, skin, module);
+   int muxid = xeno_bind_skin_opt(skin_magic, skin, module, sighandler);
struct sigaction sa;
 
if (muxid == -1) {
diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h
index 09c9128..926498b 100644
--- a/include/asm-generic/syscall.h
+++ b/include/asm-generic/syscall.h
@@ -21,6 +21,16 @@
 #define _XENO_ASM_GENERIC_SYSCALL_H
 
 #include asm/xenomai/features.h
+#ifdef __KERNEL__
+#include linux/types.h
+#include linux/signal.h
+#include asm/uaccess.h
+#include asm/xenomai/wrappers.h
+#include asm/xenomai/hal.h
+#else /* !__KERNEL__ */
+#include sys/types.h
+#include signal.h
+#endif /* !__KERNEL__ */
 
 /* Xenomai multiplexer syscall. */
 #define __xn_sys_mux   555 /* Must fit within 15bit */
@@ -35,6 +45,7 @@
 #define __xn_sys_sem_heap  7
 #define __xn_sys_current   8   /* threadh = xnthread_handle(cur) */
 #define __xn_sys_current_info  9   /* r = xnshadow_current_info(info) */
+#define __xn_sys_get_next_sigs 10  /* only unqueue pending signals. */
 
 #define XENOMAI_LINUX_DOMAIN  0
 #define XENOMAI_XENO_DOMAIN   1
@@ -51,12 +62,20 @@ typedef struct xnsysinfo {
 #define sigshadow_arg(code) (((code)  8)  0xff)
 #define sigshadow_int(action, arg) ((action) | ((arg)  8))
 
-#ifdef __KERNEL__
+union xnsiginfo {
+   struct siginfo pse51_si;
+};
 
-#include linux/types.h
-#include asm/uaccess.h
-#include asm/xenomai/wrappers.h
-#include asm/xenomai/hal.h
+struct xnsig {
+   unsigned nsigs;
+   unsigned remaining;
+   struct {
+   unsigned muxid;
+   union xnsiginfo si;
+   } pending[16];
+};
+
+#ifdef __KERNEL__
 
 struct task_struct;
 struct pt_regs;
@@ -137,8 +156,33 @@ static inline int __xn_safe_strncpy_from_user(char *dst,
 }
 
 #else /* !__KERNEL__ */
-#include sys/types.h
-#endif /* __KERNEL__ */
+
+#ifdef __cplusplus
+extern C
+#endif /* __cplusplus */
+int __xnsig_dispatch(struct xnsig *sigs, int cumulated_error, int last_error);
+
+/* Called to dispatch signals which interrupted a system call. */
+static inline int xnsig_dispatch(struct xnsig *sigs, int cumul, int last)
+{
+   if (sigs-nsigs)
+   return __xnsig_dispatch(sigs, cumul, last);
+   return last;
+}
+
+/* Called to dispatch additional signals (received with the special
+   system call __xn_sys_get_next_sigs), it may happen that this
+   syscall was in fact called whereas no additional signal was
+   pending, in this case, ignore the syscall return value (last) and
+   preserve the cumulated error. */
+static inline int xnsig_dispatch_next(struct xnsig *sigs, int cumul, int last)
+{
+   if (sigs-nsigs)
+   return __xnsig_dispatch(sigs, cumul, last);
+   return cumul;
+}
+
+#endif /* !__KERNEL__ */
 
 typedef struct xncompletion {
long syncflag;  /* Semaphore variable. */
diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c
index 1315840..e4a4c3c 100644
--- a/src/skins/common/bind.c
+++ b/src/skins/common/bind.c
@@ -9,6 +9,8 @@
 #include asm-generic/xenomai/bits/current.h
 #include sem_heap.h
 
+static xnsighandler *xnsig_handlers[32];
+
 void __attribute__((weak)) xeno_sigill_handler(int sig)
 

[Xenomai-git] Gilles Chanteperdrix : skins: add per-skin user-space signal handler, and dispatch function.

2009-11-24 Thread GIT version control
Module: xenomai-gch
Branch: for-head
Commit: f01fa99b5e0764ea0805259ce9144ae655aa3231
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=f01fa99b5e0764ea0805259ce9144ae655aa3231

Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org
Date:   Sun Nov 22 23:07:21 2009 +0100

skins: add per-skin user-space signal handler, and dispatch function.

---

 include/asm-generic/bits/bind.h |   12 ++--
 include/asm-generic/syscall.h   |   55 ++-
 src/skins/common/bind.c |   23 +++-
 src/skins/native/init.c |2 +-
 src/skins/posix/init.c  |3 +-
 src/skins/psos+/init.c  |3 +-
 src/skins/rtai/init.c   |3 +-
 src/skins/rtdm/init.c   |3 +-
 src/skins/uitron/init.c |3 +-
 src/skins/vrtx/init.c   |2 +-
 src/skins/vxworks/init.c|2 +-
 11 files changed, 91 insertions(+), 20 deletions(-)

diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h
index 7da2c43..7267e0d 100644
--- a/include/asm-generic/bits/bind.h
+++ b/include/asm-generic/bits/bind.h
@@ -5,15 +5,21 @@
 #include stdlib.h
 #include signal.h
 
+union xnsiginfo;
+
+typedef void xnsighandler(union xnsiginfo *si);
+
 void xeno_handle_mlock_alert(int sig);
 
 int 
-xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module);
+xeno_bind_skin_opt(unsigned skin_magic, const char *skin, 
+  const char *module, xnsighandler *sighandler);
 
 static inline int 
-xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module)
+xeno_bind_skin(unsigned skin_magic, const char *skin, 
+  const char *module, xnsighandler *sighandler)
 {
-   int muxid = xeno_bind_skin_opt(skin_magic, skin, module);
+   int muxid = xeno_bind_skin_opt(skin_magic, skin, module, sighandler);
struct sigaction sa;
 
if (muxid == -1) {
diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h
index 09c9128..157a97c 100644
--- a/include/asm-generic/syscall.h
+++ b/include/asm-generic/syscall.h
@@ -21,6 +21,16 @@
 #define _XENO_ASM_GENERIC_SYSCALL_H
 
 #include asm/xenomai/features.h
+#ifdef __KERNEL__
+#include linux/types.h
+#include linux/signal.h
+#include asm/uaccess.h
+#include asm/xenomai/wrappers.h
+#include asm/xenomai/hal.h
+#else /* !__KERNEL__ */
+#include sys/types.h
+#include signal.h
+#endif /* !__KERNEL__ */
 
 /* Xenomai multiplexer syscall. */
 #define __xn_sys_mux   555 /* Must fit within 15bit */
@@ -35,6 +45,7 @@
 #define __xn_sys_sem_heap  7
 #define __xn_sys_current   8   /* threadh = xnthread_handle(cur) */
 #define __xn_sys_current_info  9   /* r = xnshadow_current_info(info) */
+#define __xn_sys_get_next_sigs 10  /* only unqueue pending signals. */
 
 #define XENOMAI_LINUX_DOMAIN  0
 #define XENOMAI_XENO_DOMAIN   1
@@ -51,12 +62,20 @@ typedef struct xnsysinfo {
 #define sigshadow_arg(code) (((code)  8)  0xff)
 #define sigshadow_int(action, arg) ((action) | ((arg)  8))
 
-#ifdef __KERNEL__
+union xnsiginfo {
+   struct siginfo pse51_si;
+};
 
-#include linux/types.h
-#include asm/uaccess.h
-#include asm/xenomai/wrappers.h
-#include asm/xenomai/hal.h
+struct xnsig {
+   unsigned nsigs;
+   unsigned remaining;
+   struct {
+   unsigned muxid;
+   union xnsiginfo si;
+   } pending[16];
+};
+
+#ifdef __KERNEL__
 
 struct task_struct;
 struct pt_regs;
@@ -137,8 +156,30 @@ static inline int __xn_safe_strncpy_from_user(char *dst,
 }
 
 #else /* !__KERNEL__ */
-#include sys/types.h
-#endif /* __KERNEL__ */
+
+int __xnsig_dispatch(struct xnsig *sigs, int cumulated_error, int last_error);
+
+/* Called to dispatch signals which interrupted a system call. */
+static inline int xnsig_dispatch(struct xnsig *sigs, int cumul, int last)
+{
+   if (sigs-nsigs)
+   return __xnsig_dispatch(sigs, cumul, last);
+   return last;
+}
+
+/* Called to dispatch additional signals (received with the special
+   system call __xn_sys_get_next_sigs), it may happen that this
+   syscall was in fact called whereas no additional signal was
+   pending, in this case, ignore the syscall return value (last) and
+   preserve the cumulated error. */
+static inline int xnsig_dispatch_next(struct xnsig *sigs, int cumul, int last)
+{
+   if (sigs-nsigs)
+   return __xnsig_dispatch(sigs, cumul, last);
+   return cumul;
+}
+
+#endif /* !__KERNEL__ */
 
 typedef struct xncompletion {
long syncflag;  /* Semaphore variable. */
diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c
index 1775f17..b8883d9 100644
--- a/src/skins/common/bind.c
+++ b/src/skins/common/bind.c
@@ -8,6 +8,8 @@
 #include asm-generic/xenomai/bits/bind.h
 #include sem_heap.h
 
+static xnsighandler *xnsig_handlers[32];
+
 void __attribute__((weak)) xeno_sigill_handler(int sig)
 {
fprintf(stderr, Xenomai or