Module: xenomai-gch
Branch: for-forge-rtdm-rework
Commit: 2382ec33e73437579e73ed80d298c11fdfab1bcb
URL:    
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=2382ec33e73437579e73ed80d298c11fdfab1bcb

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Mar  9 11:00:11 2014 +0100

segfault latency

On 03/08/2014 08:34 PM, Gilles Chanteperdrix wrote:
> On 03/08/2014 08:25 PM, Gilles Chanteperdrix wrote:
>>
>> Rere,
>>
>> j'ai une segfault de latency quand il essaie d'afficher le message
>> disant qu'il ne trouve pas le registry daemon. J'ai pensé à la taille de
>> la stack, que j'ai donc agrandie à 128K, et j'ai toujours la segfault.
>> D'autre part, je vois que le paramètre "name" de la fonction printout
>> est 0x60. Je suppute que c'est le nom du thread?
>>
>> À+.
>>
> Le patch suivant corrige:
>
> diff --git a/lib/copperplate/init.c b/lib/copperplate/init.c
> index 19036e6..62abf3c 100644
> --- a/lib/copperplate/init.c
> +++ b/lib/copperplate/init.c
> @@ -539,13 +539,14 @@ void copperplate_init(int *argcp, char *const **argvp)
>                  goto fail;
>          }
>
> +       threadobj_pkg_init();
> +
>          if (__node_info.no_registry == 0) {
>                  ret = registry_pkg_init(uargv[0]);
>                  if (ret)
>                          goto fail;
>          }
>
> -       threadobj_pkg_init();
>          ret = timerobj_pkg_init();
>          if (ret) {
>                  warning("failed to initialize timer support");
>
>
> Mais je ne pense pas que ce soit suffisant: threadobj_pkg_init doit
> avoir été appelé avant tout appel à warning histoire que la clé de TSD
> utilisée par threadobj_current() soit valide. Sinon 0 est pris comme clé
> et threadobj_current() retourne n'importe quoi (0xc dans mon cas).
>

Je voudrais éviter que l'overlay de la main thread et tous les autres
préparatifs aient lieu avant de forker le registry. Et puis en théorie,
il faudrait que le tsd soit dispo dès le début des inits complexes qui
sont susceptibles de paniquer ou faire un warning. Est-ce que ce truc
marche pour toi ?

---

 include/boilerplate/ancillaries.h |    4 ++++
 include/copperplate/threadobj.h   |    2 ++
 lib/boilerplate/ancillaries.c     |   12 ++++++++----
 lib/copperplate/init.c            |    2 ++
 lib/copperplate/threadobj.c       |    6 ++----
 5 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/include/boilerplate/ancillaries.h 
b/include/boilerplate/ancillaries.h
index fc04f2f..da1e827 100644
--- a/include/boilerplate/ancillaries.h
+++ b/include/boilerplate/ancillaries.h
@@ -55,11 +55,15 @@ void __printout(const char *name,
 void __panic(const char *name,
             const char *fmt, va_list ap);
 
+void early_panic(const char *fmt, ...);
+
 void panic(const char *fmt, ...);
 
 void __warning(const char *name,
               const char *fmt, va_list ap);
 
+void early_warning(const char *fmt, ...);
+
 void warning(const char *fmt, ...);
 
 const char *symerror(int errnum);
diff --git a/include/copperplate/threadobj.h b/include/copperplate/threadobj.h
index d5e4591..7e5f7de 100644
--- a/include/copperplate/threadobj.h
+++ b/include/copperplate/threadobj.h
@@ -355,6 +355,8 @@ static inline int threadobj_local_p(struct threadobj *thobj)
 
 #endif /* !CONFIG_XENO_PSHARED */
 
+void threadobj_init_key(void);
+
 void threadobj_pkg_init(void);
 
 #ifdef __cplusplus
diff --git a/lib/boilerplate/ancillaries.c b/lib/boilerplate/ancillaries.c
index 59d49c3..35bd401 100644
--- a/lib/boilerplate/ancillaries.c
+++ b/lib/boilerplate/ancillaries.c
@@ -150,8 +150,7 @@ void __run_cleanup_block(struct cleanup_block *cb)
        cb->handler(cb->arg);
 }
 
-__attribute__ ((weak))
-void panic(const char *fmt, ...)
+void early_panic(const char *fmt, ...)
 {
        va_list ap;
 
@@ -160,8 +159,10 @@ void panic(const char *fmt, ...)
        va_end(ap);
 }
 
-__attribute__ ((weak))
-void warning(const char *fmt, ...)
+void panic(const char *fmt, ...)
+__attribute__((alias("early_panic"), weak));
+
+void early_warning(const char *fmt, ...)
 {
        va_list ap;
 
@@ -170,6 +171,9 @@ void warning(const char *fmt, ...)
        va_end(ap);
 }
 
+void warning(const char *fmt, ...)
+__attribute__((alias("early_warning"), weak));
+
 char *generate_name(char *buf, const char *radix,
                    struct name_generator *ngen)
 {
diff --git a/lib/copperplate/init.c b/lib/copperplate/init.c
index 19036e6..58e5dc1 100644
--- a/lib/copperplate/init.c
+++ b/lib/copperplate/init.c
@@ -487,6 +487,8 @@ void copperplate_init(int *argcp, char *const **argvp)
 
        boilerplate_init();
 
+       threadobj_init_key();
+
        /* Our node id. is the tid of the main thread. */
        __node_id = copperplate_get_tid();
 
diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index b75d331..79fcdb2 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -77,10 +77,10 @@ struct threadobj *__threadobj_current;
  */
 pthread_key_t threadobj_tskey;
 
-static inline void threadobj_init_key(void)
+void threadobj_init_key(void)
 {
        if (pthread_key_create(&threadobj_tskey, finalize_thread))
-               panic("failed to allocate TSD key");
+               early_panic("failed to allocate TSD key");
 }
 
 #ifdef CONFIG_XENO_COBALT
@@ -1310,8 +1310,6 @@ void threadobj_pkg_init(void)
        threadobj_irq_prio = __RT(sched_get_priority_max(SCHED_RT));
        threadobj_high_prio = threadobj_irq_prio - 1;
 
-       threadobj_init_key();
-
        pkg_init_corespec();
 
        main_overlay();


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to