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  <[EMAIL PROTECTED]>
 
+       * 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.
 

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to