Philippe Gerum wrote:
 > Looks good. Additionally, we might end up moving common portions of the 
 > various library constructors into a single file in order to reduce code 
 > duplication.

The attached patch tries to do that. The single file is named
include/nucleus/skin_init.h. 

-- 


                                            Gilles Chanteperdrix.
Index: include/asm-generic/syscall.h
===================================================================
--- include/asm-generic/syscall.h       (revision 940)
+++ include/asm-generic/syscall.h       (working copy)
@@ -112,7 +112,7 @@
 #include <sys/types.h>
 #include <asm/xenomai/features.h>
 
-#endif /* __KERNEL__ */
+#endif /* !__KERNEL__ */
 
 typedef struct xncompletion {
 
Index: include/asm-i386/features.h
===================================================================
--- include/asm-i386/features.h (revision 940)
+++ include/asm-i386/features.h (working copy)
@@ -76,4 +76,35 @@
     }
 }
 
+#ifndef __KERNEL__
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static inline void xeno_x86_features_check(void)
+{
+#ifdef CONFIG_XENO_X86_SEP
+  size_t n = confstr(_CS_GNU_LIBPTHREAD_VERSION, NULL, 0);
+  if (n > 0)
+      {
+      char *buf = malloc(n);
+      int isnptl;
+      
+      confstr (_CS_GNU_LIBPTHREAD_VERSION, buf, n);
+      isnptl = strstr (buf, "NPTL");
+      free(buf);
+
+      if (isnptl)
+          return;
+      }
+
+  fprintf(stderr, "Xenomai: SEP instruction needs NPTL and NPTL was not 
detected"
+          "\nplease install NPTL or recompile Xenomai without enabling 
SEP.\n");
+  exit(1);
+#endif /* CONFIG_XENO_X86_SEP */
+}
+#define xeno_arch_features_check() xeno_x86_features_check()
+#endif /* __KERNEL__ */
+
 #endif /* !_XENO_ASM_I386_FEATURES_H */
Index: include/nucleus/Makefile.am
===================================================================
--- include/nucleus/Makefile.am (revision 940)
+++ include/nucleus/Makefile.am (working copy)
@@ -22,3 +22,5 @@
        types.h \
        version.h \
        xenomai.h
+
+EXTRA_DIST = skin_init.h
Index: src/skins/rtai/init.c
===================================================================
--- src/skins/rtai/init.c       (revision 940)
+++ src/skins/rtai/init.c       (working copy)
@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <nucleus/skin_init.h>
 #include <rtai/syscall.h>
 
 int __rtai_muxid = -1;
@@ -26,45 +27,5 @@
 static __attribute__((constructor)) void __init_rtai_interface(void)
 
 {
-    xnfeatinfo_t finfo;
-    int muxid;
-
-    muxid = XENOMAI_SYSBIND(RTAI_SKIN_MAGIC,
-                           XENOMAI_FEAT_DEP,
-                           XENOMAI_ABI_REV,
-                           &finfo);
-    switch (muxid)
-       {
-       case -EINVAL:
-
-           fprintf(stderr,"Xenomai: incompatible feature set\n");
-           fprintf(stderr,"(required=\"%s\", present=\"%s\", 
missing=\"%s\").\n",
-                   finfo.feat_man_s,finfo.feat_all_s,finfo.feat_mis_s);
-           exit(1);
-
-       case -ENOEXEC:
-
-           fprintf(stderr,"Xenomai: incompatible ABI revision level\n");
-           fprintf(stderr,"(needed=%lu, current=%lu).\n",
-                   XENOMAI_ABI_REV,finfo.abirev);
-           exit(1);
-
-       case -ENOSYS:
-       case -ESRCH:
-
-           fprintf(stderr,"Xenomai: RTAI skin or CONFIG_XENO_OPT_PERVASIVE 
disabled.\n");
-           fprintf(stderr,"(modprobe xeno_rtai?)\n");
-           exit(1);
-
-       default:
-
-           if (muxid < 0)
-               {
-               fprintf(stderr,"Xenomai: binding failed: 
%s.\n",strerror(-muxid));
-               exit(1);
-               }
-
-           __rtai_muxid = muxid;
-           break;
-       }
+    __rtai_muxid = xeno_user_skin_init(RTAI_SKIN_MAGIC, "RTAI", "xeno_rtai");
 }
Index: src/skins/posix/init.c
===================================================================
--- src/skins/posix/init.c      (revision 940)
+++ src/skins/posix/init.c      (working copy)
@@ -23,6 +23,7 @@
 #include <limits.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <nucleus/skin_init.h>
 #include <posix/posix.h>
 #include <posix/syscall.h>
 #include <rtdm/syscall.h>
@@ -31,60 +32,14 @@
 int __rtdm_muxid  = -1;
 int __rtdm_fd_start = INT_MAX;
 
-void __handle_lock_alert (int sig)
-
-{
-    fprintf(stderr,"Xenomai: process memory not locked (missing mlockall?)\n");
-    fflush(stderr);
-    exit(4);
-}
-
 static __attribute__((constructor)) void __init_posix_interface(void)
 
 {
     struct sigaction sa;
-    xnfeatinfo_t finfo;
     int muxid;
+    
+    __pse51_muxid = xeno_user_skin_init(PSE51_SKIN_MAGIC, "POSIX", 
"xeno_posix");
 
-    muxid = XENOMAI_SYSBIND(PSE51_SKIN_MAGIC,
-                           XENOMAI_FEAT_DEP,
-                           XENOMAI_ABI_REV,
-                           &finfo);
-    switch (muxid)
-       {
-       case -EINVAL:
-
-           fprintf(stderr,"Xenomai: incompatible feature set\n");
-           fprintf(stderr,"(required=\"%s\", present=\"%s\", 
missing=\"%s\").\n",
-                   finfo.feat_man_s,finfo.feat_all_s,finfo.feat_mis_s);
-           exit(1);
-
-       case -ENOEXEC:
-
-           fprintf(stderr,"Xenomai: incompatible ABI revision level\n");
-           fprintf(stderr,"(needed=%lu, current=%lu).\n",
-                   XENOMAI_ABI_REV,finfo.abirev);
-           exit(1);
-
-       case -ENOSYS:
-       case -ESRCH:
-
-           fprintf(stderr,"Xenomai: POSIX skin or CONFIG_XENO_OPT_PERVASIVE 
disabled.\n");
-           fprintf(stderr,"(modprobe xeno_posix?)\n");
-           exit(1);
-
-       default:
-
-           if (muxid < 0)
-               {
-               fprintf(stderr,"Xenomai: binding failed: 
%s.\n",strerror(-muxid));
-               exit(1);
-               }
-
-           __pse51_muxid = muxid;
-           break;
-       }
-
     muxid = XENOMAI_SYSBIND(RTDM_SKIN_MAGIC,
                            XENOMAI_FEAT_DEP,
                            XENOMAI_ABI_REV,
@@ -96,11 +51,4 @@
                                                          __rtdm_fdcount);
         }
 
-    /* Install a SIGXCPU handler to intercept alerts about unlocked
-       process memory. */
-
-    sa.sa_handler = &__handle_lock_alert;
-    sigemptyset(&sa.sa_mask);
-    sa.sa_flags = 0;
-    sigaction(SIGXCPU,&sa,NULL);
 }
Index: src/skins/vxworks/init.c
===================================================================
--- src/skins/vxworks/init.c    (revision 940)
+++ src/skins/vxworks/init.c    (working copy)
@@ -22,20 +22,13 @@
 #include <string.h>
 #include <stdlib.h>
 #include <pthread.h>
+#include <nucleus/skin_init.h>
 #include <vxworks/vxworks.h>
 
 pthread_key_t __vxworks_tskey;
 
 int __vxworks_muxid = -1;
 
-void __handle_lock_alert (int sig)
-
-{
-    fprintf(stderr,"Xenomai: process memory not locked (missing mlockall?)\n");
-    fflush(stderr);
-    exit(4);
-}
-
 static void __flush_tsd (void *tsd)
 
 {
@@ -46,62 +39,15 @@
 static __attribute__((constructor)) void __init_xeno_interface(void)
 
 {
-    struct sigaction sa;
-    xnfeatinfo_t finfo;
-    int muxid;
-
-    muxid = XENOMAI_SYSBIND(VXWORKS_SKIN_MAGIC,
-                           XENOMAI_FEAT_DEP,
-                           XENOMAI_ABI_REV,
-                           &finfo);
-    switch (muxid)
-       {
-       case -EINVAL:
-
-           fprintf(stderr,"Xenomai: incompatible feature set\n");
-           fprintf(stderr,"(required=\"%s\", present=\"%s\", 
missing=\"%s\").\n",
-                   finfo.feat_man_s,finfo.feat_all_s,finfo.feat_mis_s);
-           exit(1);
-
-       case -ENOEXEC:
-
-           fprintf(stderr,"Xenomai: incompatible ABI revision level\n");
-           fprintf(stderr,"(needed=%lu, current=%lu).\n",
-                   XENOMAI_ABI_REV,finfo.abirev);
-           exit(1);
-
-       case -ENOSYS:
-       case -ESRCH:
-
-           fprintf(stderr,"Xenomai: VxWorks skin or CONFIG_XENO_OPT_PERVASIVE 
disabled.\n");
-           fprintf(stderr,"(modprobe xeno_vxworks?)\n");
-           exit(1);
-
-       default:
-
-           if (muxid < 0)
-               {
-               fprintf(stderr,"Xenomai: binding failed: 
%s.\n",strerror(-muxid));
-               exit(1);
-               }
-
-           /* Allocate a TSD key for indexing self task pointers. */
-
-           if (pthread_key_create(&__vxworks_tskey,&__flush_tsd) != 0)
-               {
-               fprintf(stderr,"Xenomai: failed to allocate new TSD key?!\n");
-               exit(1);
-               }
-
-           __vxworks_muxid = muxid;
-           break;
-       }
-
-    /* Install a SIGXCPU handler to intercept alerts about unlocked
-       process memory. */
-
-    sa.sa_handler = &__handle_lock_alert;
-    sigemptyset(&sa.sa_mask);
-    sa.sa_flags = 0;
-    sigaction(SIGXCPU,&sa,NULL);
+    __vxworks_muxid = xeno_user_skin_init(VXWORKS_SKIN_MAGIC,
+                                          "VxWorks",
+                                          "xeno_vxworks");
+    
+    /* Allocate a TSD key for indexing self task pointers. */
+    
+    if (pthread_key_create(&__vxworks_tskey,&__flush_tsd) != 0)
+        {
+        fprintf(stderr,"Xenomai: failed to allocate new TSD key?!\n");
+        exit(1);
+        }
 }
Index: src/skins/vrtx/init.c
===================================================================
--- src/skins/vrtx/init.c       (revision 940)
+++ src/skins/vrtx/init.c       (working copy)
@@ -22,20 +22,13 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
+#include <nucleus/skin_init.h>
 #include <vrtx/vrtx.h>
 
 pthread_key_t __vrtx_tskey;
 
 int __vrtx_muxid = -1;
 
-void __handle_lock_alert (int sig)
-
-{
-    fprintf(stderr,"Xenomai: process memory not locked (missing mlockall?)\n");
-    fflush(stderr);
-    exit(4);
-}
-
 static void __flush_tsd (void *tsd)
 
 {
@@ -46,69 +39,25 @@
 static __attribute__((constructor)) void __init_xeno_interface(void)
 
 {
-    struct sigaction sa;
-    xnfeatinfo_t finfo;
-    int muxid;
     TCB *tcb;
 
-    muxid = XENOMAI_SYSBIND(VRTX_SKIN_MAGIC,
-                           XENOMAI_FEAT_DEP,
-                           XENOMAI_ABI_REV,
-                           &finfo);
-    switch (muxid)
-       {
-       case -EINVAL:
+    __vrtx_muxid = xeno_user_skin_init(VRTX_SKIN_MAGIC, "VRTX", "xeno_vrtx");
+    
+    /* Allocate a TSD key for indexing self task pointers. */
 
-           fprintf(stderr,"Xenomai: incompatible feature set\n");
-           fprintf(stderr,"(required=\"%s\", present=\"%s\", 
missing=\"%s\").\n",
-                   finfo.feat_man_s,finfo.feat_all_s,finfo.feat_mis_s);
-           exit(1);
+    if (pthread_key_create(&__vrtx_tskey,&__flush_tsd) != 0)
+        {
+        fprintf(stderr,"Xenomai: failed to allocate new TSD key?!\n");
+        exit(1);
+        }
 
-       case -ENOEXEC:
-
-           fprintf(stderr,"Xenomai: incompatible ABI revision level\n");
-           fprintf(stderr,"(needed=%lu, current=%lu).\n",
-                   XENOMAI_ABI_REV,finfo.abirev);
-           exit(1);
-
-       case -ENOSYS:
-       case -ESRCH:
-
-           fprintf(stderr,"Xenomai: VRTX skin or CONFIG_XENO_OPT_PERVASIVE 
disabled.\n");
-           fprintf(stderr,"(modprobe xeno_vrtx?)\n");
-           exit(1);
-
-       default:
-
-           if (muxid < 0)
-               {
-               fprintf(stderr,"Xenomai: binding failed: 
%s.\n",strerror(-muxid));
-               exit(1);
-               }
-
-           /* Allocate a TSD key for indexing self task pointers. */
-
-           if (pthread_key_create(&__vrtx_tskey,&__flush_tsd) != 0)
-               {
-               fprintf(stderr,"Xenomai: failed to allocate new TSD key?!\n");
-               exit(1);
-               }
-
-           tcb = (TCB *)malloc(sizeof(*tcb));
-
-           if (!tcb)
-               {
-               fprintf(stderr,"Xenomai: failed to allocate local TCB?!\n");
-               exit(1);
-               }
-
-           pthread_setspecific(__vrtx_tskey,tcb);
-           __vrtx_muxid = muxid;
-           break;
-       }
-
-    sa.sa_handler = &__handle_lock_alert;
-    sigemptyset(&sa.sa_mask);
-    sa.sa_flags = 0;
-    sigaction(SIGXCPU,&sa,NULL);
+    tcb = (TCB *)malloc(sizeof(*tcb));
+    
+    if (!tcb)
+        {
+        fprintf(stderr,"Xenomai: failed to allocate local TCB?!\n");
+        exit(1);
+        }
+    
+    pthread_setspecific(__vrtx_tskey,tcb);
 }
Index: src/skins/native/init.c
===================================================================
--- src/skins/native/init.c     (revision 940)
+++ src/skins/native/init.c     (working copy)
@@ -22,6 +22,7 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
+#include <nucleus/skin_init.h>
 #include <native/syscall.h>
 #include <native/task.h>
 
@@ -29,14 +30,6 @@
 
 int __native_muxid = -1;
 
-void __handle_lock_alert (int sig)
-
-{
-    fprintf(stderr,"Xenomai: process memory not locked (missing mlockall?)\n");
-    fflush(stderr);
-    exit(4);
-}
-
 static void __flush_tsd (void *tsd)
 
 {
@@ -47,62 +40,13 @@
 static __attribute__((constructor)) void __init_xeno_interface(void)
 
 {
-    struct sigaction sa;
-    xnfeatinfo_t finfo;
-    int muxid;
+    __native_muxid = 
xeno_user_skin_init(XENO_SKIN_MAGIC,"native","xeno_native");
+    
+    /* Allocate a TSD key for indexing self task pointers. */
 
-    muxid = XENOMAI_SYSBIND(XENO_SKIN_MAGIC,
-                           XENOMAI_FEAT_DEP,
-                           XENOMAI_ABI_REV,
-                           &finfo);
-    switch (muxid)
-       {
-       case -EINVAL:
-
-           fprintf(stderr,"Xenomai: incompatible feature set\n");
-           fprintf(stderr,"(required=\"%s\", present=\"%s\", 
missing=\"%s\").\n",
-                   finfo.feat_man_s,finfo.feat_all_s,finfo.feat_mis_s);
-           exit(1);
-
-       case -ENOEXEC:
-
-           fprintf(stderr,"Xenomai: incompatible ABI revision level\n");
-           fprintf(stderr,"(needed=%lu, current=%lu).\n",
-                   XENOMAI_ABI_REV,finfo.abirev);
-           exit(1);
-
-       case -ENOSYS:
-       case -ESRCH:
-
-           fprintf(stderr,"Xenomai: native skin or CONFIG_XENO_OPT_PERVASIVE 
disabled.\n");
-           fprintf(stderr,"(modprobe xeno_native?)\n");
-           exit(1);
-
-       default:
-
-           if (muxid < 0)
-               {
-               fprintf(stderr,"Xenomai: binding failed: 
%s.\n",strerror(-muxid));
-               exit(1);
-               }
-
-           /* Allocate a TSD key for indexing self task pointers. */
-
-           if (pthread_key_create(&__native_tskey,&__flush_tsd) != 0)
-               {
-               fprintf(stderr,"Xenomai: failed to allocate new TSD key?!\n");
-               exit(1);
-               }
-
-           __native_muxid = muxid;
-           break;
-       }
-
-    /* Install a SIGXCPU handler to intercept alerts about unlocked
-       process memory. */
-
-    sa.sa_handler = &__handle_lock_alert;
-    sigemptyset(&sa.sa_mask);
-    sa.sa_flags = 0;
-    sigaction(SIGXCPU,&sa,NULL);
+    if (pthread_key_create(&__native_tskey,&__flush_tsd) != 0)
+        {
+        fprintf(stderr,"Xenomai: failed to allocate new TSD key?!\n");
+        exit(1);
+        }    
 }
Index: src/skins/rtdm/init.c
===================================================================
--- src/skins/rtdm/init.c       (revision 940)
+++ src/skins/rtdm/init.c       (working copy)
@@ -30,6 +30,10 @@
     xnfeatinfo_t finfo;
     int muxid;
 
+#ifdef xeno_arch_features_check
+    xeno_arch_features_check();
+#endif /* xeno_arch_features_check */
+
     muxid = XENOMAI_SYSBIND(RTDM_SKIN_MAGIC,
                            XENOMAI_FEAT_DEP,
                            XENOMAI_ABI_REV,
Index: src/skins/uvm/init.c
===================================================================
--- src/skins/uvm/init.c        (revision 940)
+++ src/skins/uvm/init.c        (working copy)
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <nucleus/skin_init.h>
 #include <asm-uvm/syscall.h>
 
 int __uvm_muxid = -1;
@@ -32,43 +33,7 @@
     xnfeatinfo_t finfo;
     int muxid;
 
-    muxid = XENOMAI_SYSBIND(UVM_SKIN_MAGIC,
-                           XENOMAI_FEAT_DEP,
-                           XENOMAI_ABI_REV,
-                           &finfo);
-    switch (muxid)
-       {
-       case -EINVAL:
+    __uvm_muxid = xeno_user_skin_init(UVM_SKIN_MAGIC, "UVM", "xeno_uvm");
 
-           fprintf(stderr,"Xenomai: incompatible feature set\n");
-           fprintf(stderr,"(required=\"%s\", present=\"%s\", 
missing=\"%s\").\n",
-                   finfo.feat_man_s,finfo.feat_all_s,finfo.feat_mis_s);
-           exit(1);
-
-       case -ENOEXEC:
-
-           fprintf(stderr,"Xenomai: incompatible ABI revision level\n");
-           fprintf(stderr,"(needed=%lu, current=%lu).\n",
-                   XENOMAI_ABI_REV,finfo.abirev);
-           exit(1);
-
-       case -ENOSYS:
-       case -ESRCH:
-
-           fprintf(stderr,"Xenomai: UVM skin or CONFIG_XENO_OPT_PERVASIVE 
disabled.\n");
-           fprintf(stderr,"(modprobe xeno_uvm?)\n");
-           exit(1);
-
-       default:
-
-           if (muxid < 0)
-               {
-               fprintf(stderr,"Xenomai: binding failed: 
%s.\n",strerror(-muxid));
-               exit(1);
-               }
-
-           XENOMAI_SYSCALL2(__xn_sys_info,muxid,&__uvm_info);
-           __uvm_muxid = muxid;
-           break;
-       }
+    XENOMAI_SYSCALL2(__xn_sys_info,muxid,&__uvm_info);
 }
--- /dev/null   2006-04-16 14:39:13.372574250 +0200
+++ include/nucleus/skin_init.h 2006-04-17 19:05:58.000000000 +0200
@@ -0,0 +1,73 @@
+#ifndef _XENO_NUCLEUS_SKIN_INIT_H
+#define _XENO_NUCLEUS_SKIN_INIT_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <asm/xenomai/syscall.h>
+
+static void __handle_lock_alert (int sig)
+
+{
+    fprintf(stderr,"Xenomai: process memory not locked (missing mlockall?)\n");
+    fflush(stderr);
+    exit(4);
+}
+
+static int
+xeno_user_skin_init(unsigned skin_magic, const char *skin, const char *module)
+{
+    xnfeatinfo_t finfo;
+    int muxid;
+
+#ifdef xeno_arch_features_check
+    xeno_arch_features_check();
+#endif /* xeno_arch_features_check */
+    
+    muxid = XENOMAI_SYSBIND(skin_magic,
+                           XENOMAI_FEAT_DEP,
+                           XENOMAI_ABI_REV,
+                           &finfo);
+    switch (muxid)
+       {
+       case -EINVAL:
+
+           fprintf(stderr,"Xenomai: incompatible feature set\n");
+           fprintf(stderr,"(required=\"%s\", present=\"%s\", 
missing=\"%s\").\n",
+                   finfo.feat_man_s,finfo.feat_all_s,finfo.feat_mis_s);
+           exit(1);
+
+       case -ENOEXEC:
+
+           fprintf(stderr,"Xenomai: incompatible ABI revision level\n");
+           fprintf(stderr,"(needed=%lu, current=%lu).\n",
+                   XENOMAI_ABI_REV,finfo.abirev);
+           exit(1);
+
+       case -ENOSYS:
+       case -ESRCH:
+
+           fprintf(stderr,"Xenomai: %s skin or CONFIG_XENO_OPT_PERVASIVE 
disabled.\n"
+                    "(modprobe %s?)\n", skin, module);
+           exit(1);
+        }
+    
+    if (muxid < 0)
+        {
+        fprintf(stderr,"Xenomai: binding failed: %s.\n",strerror(-muxid));
+        exit(1);
+        }
+
+    /* Install a SIGXCPU handler to intercept alerts about unlocked
+       process memory. */
+
+    sa.sa_handler = &__handle_lock_alert;
+    sigemptyset(&sa.sa_mask);
+    sa.sa_flags = 0;
+    sigaction(SIGXCPU,&sa,NULL);
+
+    return muxid;
+}
+
+#endif /* _XENO_NUCLEUS_SKIN_INIT_H */
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to