Gilles Chanteperdrix wrote: > Jan Kiszka wrote: >> +#ifndef CONFIG_XENO_POSIX_AUTO_MLOCKALL >> if (mlockall(MCL_CURRENT | MCL_FUTURE)) { >> perror("Xenomai Posix skin init: mlockall"); >> exit(EXIT_FAILURE); >> } > > Errr... I do not get it, the mlockall should take place if AUTO_MLOCKALL > is set, no ? Typo. Noticed it before posting, but I forgot to include the refreshed patch. > > + struct sched_param parm = { .sched_priority = 0 }; > > I do not like the everything-on-one-line style. And are we sure this > will work if sched_priority is a macro ? If parm.sched_priority can be referenced (and that's what the spec requires), the above works as well, even if sched_priority resolves to something like "__hidden_struct.__prio". Regarding detection of denied dlopen: The 'nodlopen' marker my other patch introduces will give an error message like "libpthread_rt.so.1: shared object cannot be dlopen()ed" - if the caller is clever enough to use dlerror. We can't configure that message (it linker generated), all we could do is to add a few words about it to the TROUBLESHOOTING guide. Jan --- ChangeLog | 6 ++++++ configure.in | 19 +++++++++++++------ src/skins/posix/init.c | 45 +++++++++++++++++++++++++++++---------------- 3 files changed, 48 insertions(+), 22 deletions(-) Index: xenomai/configure.in =================================================================== --- xenomai.orig/configure.in +++ xenomai/configure.in @@ -763,14 +763,21 @@ AC_CHECK_FUNCS([shm_open shm_unlink]) LIBS="$save_LIBS" XENO_DLOPEN_CONSTRAINT= -AC_ARG_WITH([__thread], - AC_HELP_STRING([--without-__thread], - [do not use TLS features (allows for dlopen'ing Xenomai libs)]), - [use__thread=$withval], - [use__thread=yes]) +AC_MSG_CHECKING(whether to enable dlopen support for skin libraries) +AC_ARG_ENABLE(dlopen-skins, + AC_HELP_STRING([--enable-dlopen-skins], [Disable TLS features and automatic +main thread mapping by the POSIX skin to allows dlopen'ing Xenomai libs.]), + [case "$enableval" in + y | yes) CONFIG_XENO_LIBS_DLOPEN=y ;; + *) unset CONFIG_XENO_LIBS_DLOPEN ;; + esac]) +AC_MSG_RESULT(${CONFIG_XENO_LIBS_DLOPEN:-no}) +if test x$CONFIG_XENO_LIBS_DLOPEN = xy; then + AC_DEFINE(CONFIG_XENO_LIBS_DLOPEN,1,[config]) +fi dnl Check whether the compiler supports the __thread keyword. -if test "x$use__thread" != xno; then +if test "x$CONFIG_XENO_LIBS_DLOPEN" != xy; then AC_CACHE_CHECK([for __thread], libc_cv_gcc___thread, [cat > conftest.c <<\EOF __thread int a __attribute__ ((tls_model ("initial-exec"))) = 42; Index: xenomai/src/skins/posix/init.c =================================================================== --- xenomai.orig/src/skins/posix/init.c +++ xenomai/src/skins/posix/init.c @@ -47,7 +47,6 @@ void pse51_clock_init(int); static __attribute__ ((constructor)) void __init_posix_interface(void) { - struct sched_param parm; int muxid, err; muxid = @@ -67,28 +66,42 @@ void __init_posix_interface(void) __rtdm_fdcount); } - /* Shadow the main thread. mlock the whole memory for the time of the - syscall, in order to avoid the SIGXCPU signal. */ +#ifdef CONFIG_XENO_LIBS_DLOPEN + /* Don't use auto-shadowing if we are likely invoked from dlopen, but + take care of auto-mlockall. */ +#ifdef CONFIG_XENO_POSIX_AUTO_MLOCKALL if (mlockall(MCL_CURRENT | MCL_FUTURE)) { perror("Xenomai Posix skin init: mlockall"); exit(EXIT_FAILURE); } - - parm.sched_priority = 0; - err = __wrap_pthread_setschedparam(pthread_self(), SCHED_OTHER, - &parm); - if (err) { - fprintf(stderr, "Xenomai Posix skin init: " - "pthread_setschedparam: %s\n", strerror(err)); - exit(EXIT_FAILURE); - } +#endif /* CONFIG_XENO_POSIX_AUTO_MLOCKALL */ +#else /* !CONFIG_XENO_LIBS_DLOPEN */ + { + struct sched_param parm = { .sched_priority = 0 }; + + /* Shadow the main thread. mlock the whole memory for the time + of the syscall, in order to avoid the SIGXCPU signal. */ + if (mlockall(MCL_CURRENT | MCL_FUTURE)) { + perror("Xenomai Posix skin init: mlockall"); + exit(EXIT_FAILURE); + } + + err = __wrap_pthread_setschedparam(pthread_self(), SCHED_OTHER, + &parm); + if (err) { + fprintf(stderr, "Xenomai Posix skin init: " + "pthread_setschedparam: %s\n", strerror(err)); + exit(EXIT_FAILURE); + } #ifndef CONFIG_XENO_POSIX_AUTO_MLOCKALL - if (munlockall()) { - perror("Xenomai Posix skin init: munlockall"); - exit(EXIT_FAILURE); - } + if (munlockall()) { + perror("Xenomai Posix skin init: munlockall"); + exit(EXIT_FAILURE); + } #endif /* !CONFIG_XENO_POSIX_AUTO_MLOCKALL */ + } +#endif /* !CONFIG_XENO_LIBS_DLOPEN */ if (!fork_handler_registered) { err = pthread_atfork(NULL, NULL, &__init_posix_interface); Index: xenomai/ChangeLog =================================================================== --- xenomai.orig/ChangeLog +++ xenomai/ChangeLog @@ -1,5 +1,11 @@ 2008-11-21 Jan Kiszka + * configure.in: Convert --without-__thread into + --enable-dlopen-skins. + + * src/skins/posix/init.c: Don't perform auto-shadowing if we may + be loaded via dlopen. + * configure.in, src/skins/*/Makefile.am: Mark libs with nodlopen if initial-exec __thread variables are used.