--- include/nucleus/bind.h | 43 +++++++++++++++++++++++------------- src/skins/native/init.c | 2 - src/skins/posix/init.c | 2 - src/skins/rtai/init.c | 2 - src/skins/rtdm/init.c | 55 ++++++++--------------------------------------- src/skins/uvm/init.c | 3 +- src/skins/vrtx/init.c | 2 - src/skins/vxworks/init.c | 2 - 8 files changed, 45 insertions(+), 66 deletions(-) Index: xenomai/include/nucleus/bind.h =================================================================== --- xenomai.orig/include/nucleus/bind.h +++ xenomai/include/nucleus/bind.h @@ -9,6 +9,9 @@ #include #include +#define XNSKIN_LAZY_BIND_FAIL 0x01 /* do not fail on missing skin */ + +#ifndef XNSKIN_NO_MLOCK_ALERT __attribute__((weak)) int xeno_sigxcpu_no_mlock = 1; static void xeno_handle_mlock_alert (int sig) @@ -34,18 +37,19 @@ static void xeno_handle_mlock_alert (in pthread_kill(pthread_self(),SIGXCPU); } } +#endif /* !XNSKIN_NO_MLOCK_ALERT */ static inline int -xeno_user_skin_init(unsigned skin_magic, const char *skin, const char *module) +xeno_user_skin_init(unsigned skin_magic, const char *skin, const char *module, + int flags) { - struct sigaction sa; xnfeatinfo_t finfo; - int muxid; + int muxid = -1; #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, @@ -69,24 +73,33 @@ xeno_user_skin_init(unsigned skin_magic, case -ENOSYS: case -ESRCH: + if (flags & XNSKIN_LAZY_BIND_FAIL) + break; /* We are ordered to ignore the missing skin. */ + fprintf(stderr,"Xenomai: %s skin or CONFIG_XENO_OPT_PERVASIVE disabled.\n" - "(modprobe %s?)\n", skin, module); + "(modprobe %s?)\n", skin, module); exit(1); - } - - if (muxid < 0) - { - fprintf(stderr,"Xenomai: binding failed: %s.\n",strerror(-muxid)); - exit(1); + + default: + if (muxid < 0) + { + fprintf(stderr,"Xenomai: binding failed: %s.\n",strerror(-muxid)); + exit(1); + } } +#ifndef XNSKIN_NO_MLOCK_ALERT /* Install a SIGXCPU handler to intercept alerts about unlocked process memory. */ + { + struct sigaction sa; - sa.sa_handler = &xeno_handle_mlock_alert; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sigaction(SIGXCPU,&sa,NULL); + sa.sa_handler = &xeno_handle_mlock_alert; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sigaction(SIGXCPU,&sa,NULL); + } +#endif /* !XNSKIN_NO_MLOCK_ALERT */ return muxid; } Index: xenomai/src/skins/native/init.c =================================================================== --- xenomai.orig/src/skins/native/init.c +++ xenomai/src/skins/native/init.c @@ -39,7 +39,7 @@ static __attribute__ ((constructor)) void __init_xeno_interface(void) { __native_muxid = - xeno_user_skin_init(XENO_SKIN_MAGIC, "native", "xeno_native"); + xeno_user_skin_init(XENO_SKIN_MAGIC, "native", "xeno_native", 0); /* Allocate a TSD key for indexing self task pointers. */ Index: xenomai/src/skins/posix/init.c =================================================================== --- xenomai.orig/src/skins/posix/init.c +++ xenomai/src/skins/posix/init.c @@ -40,7 +40,7 @@ void __init_posix_interface(void) int muxid, err; __pse51_muxid = - xeno_user_skin_init(PSE51_SKIN_MAGIC, "POSIX", "xeno_posix"); + xeno_user_skin_init(PSE51_SKIN_MAGIC, "POSIX", "xeno_posix", 0); muxid = XENOMAI_SYSBIND(RTDM_SKIN_MAGIC, XENOMAI_FEAT_DEP, XENOMAI_ABI_REV, NULL); Index: xenomai/src/skins/rtai/init.c =================================================================== --- xenomai.orig/src/skins/rtai/init.c +++ xenomai/src/skins/rtai/init.c @@ -27,5 +27,5 @@ static __attribute__ ((constructor)) void __init_rtai_interface(void) { __rtai_muxid = - xeno_user_skin_init(RTAI_SKIN_MAGIC, "RTAI", "xeno_rtai"); + xeno_user_skin_init(RTAI_SKIN_MAGIC, "RTAI", "xeno_rtai", 0); } Index: xenomai/src/skins/rtdm/init.c =================================================================== --- xenomai.orig/src/skins/rtdm/init.c +++ xenomai/src/skins/rtdm/init.c @@ -20,6 +20,11 @@ #include #include #include + +/* Checking for mlockall is only done by skins that create real-time + user-space threads, which we do not. */ +#define XNSKIN_NO_MLOCK_ALERT +#include #include int __rtdm_muxid = -1; @@ -27,49 +32,9 @@ int __rtdm_muxid = -1; static __attribute__((constructor)) void __init_rtdm_interface(void) { - 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, - &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: - - /* we ignore this and fail later when the user tries to open - a device or socket. */ - break; - - default: - - if (muxid < 0) - { - fprintf(stderr,"Xenomai: binding failed: %s.\n",strerror(-muxid)); - exit(1); - } - - __rtdm_muxid = muxid; - break; - } + /* We ignore a missing skin and fail later when the user tries to open + a device or socket. */ + __rtdm_muxid = + xeno_user_skin_init(RTDM_SKIN_MAGIC, "RTDM", "xeno_rtdm", + XNSKIN_LAZY_BIND_FAIL); } Index: xenomai/src/skins/uvm/init.c =================================================================== --- xenomai.orig/src/skins/uvm/init.c +++ xenomai/src/skins/uvm/init.c @@ -29,7 +29,8 @@ xnsysinfo_t __uvm_info; static __attribute__ ((constructor)) void __init_uvm_interface(void) { - __uvm_muxid = xeno_user_skin_init(UVM_SKIN_MAGIC, "UVM", "xeno_uvm"); + __uvm_muxid = + xeno_user_skin_init(UVM_SKIN_MAGIC, "UVM", "xeno_uvm", 0); XENOMAI_SYSCALL2(__xn_sys_info, __uvm_muxid, &__uvm_info); } Index: xenomai/src/skins/vrtx/init.c =================================================================== --- xenomai.orig/src/skins/vrtx/init.c +++ xenomai/src/skins/vrtx/init.c @@ -40,7 +40,7 @@ void __init_xeno_interface(void) TCB *tcb; __vrtx_muxid = - xeno_user_skin_init(VRTX_SKIN_MAGIC, "VRTX", "xeno_vrtx"); + xeno_user_skin_init(VRTX_SKIN_MAGIC, "VRTX", "xeno_vrtx", 0); /* Allocate a TSD key for indexing self task pointers. */ Index: xenomai/src/skins/vxworks/init.c =================================================================== --- xenomai.orig/src/skins/vxworks/init.c +++ xenomai/src/skins/vxworks/init.c @@ -38,7 +38,7 @@ static __attribute__ ((constructor)) void __init_xeno_interface(void) { __vxworks_muxid = xeno_user_skin_init(VXWORKS_SKIN_MAGIC, - "VxWorks", "xeno_vxworks"); + "VxWorks", "xeno_vxworks", 0); /* Allocate a TSD key for indexing self task pointers. */