Module: xenomai-head Branch: master Commit: ce8a5675124c505732ea52a12a3e2d3cc9a78aa9 URL: http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=ce8a5675124c505732ea52a12a3e2d3cc9a78aa9
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Sun Aug 22 16:09:58 2010 +0200 fast_sync: Set user-space current thread handle to XN_NO_HANDLE after fork --- include/asm-generic/bits/current.h | 5 +++++ src/skins/common/current.c | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/asm-generic/bits/current.h b/include/asm-generic/bits/current.h index 0f299ea..79123e8 100644 --- a/include/asm-generic/bits/current.h +++ b/include/asm-generic/bits/current.h @@ -32,6 +32,10 @@ static inline unsigned long xeno_get_current_mode(void) #else /* ! HAVE___THREAD */ extern pthread_key_t xeno_current_key; +xnhandle_t xeno_slow_get_current(void); + +unsigned long xeno_slow_get_current_mode(void); + static inline xnhandle_t xeno_get_current(void) { void *val = pthread_getspecific(xeno_current_key); @@ -59,6 +63,7 @@ static inline unsigned long xeno_get_current_mode(void) void xeno_set_current(void); unsigned long *xeno_init_current_mode(void); + void xeno_init_current_keys(void); #endif /* _XENO_ASM_GENERIC_CURRENT_H */ diff --git a/src/skins/common/current.c b/src/skins/common/current.c index 4e75690..50d8a65 100644 --- a/src/skins/common/current.c +++ b/src/skins/common/current.c @@ -3,10 +3,11 @@ #include <string.h> #include <pthread.h> -#include <asm/xenomai/syscall.h> #include <nucleus/types.h> #include <nucleus/thread.h> #include <nucleus/vdso.h> +#include <asm/xenomai/syscall.h> +#include <asm-generic/bits/current.h> pthread_key_t xeno_current_mode_key; @@ -85,13 +86,20 @@ static void cleanup_current_mode(void *key) } } +static void xeno_current_fork_handler(void) +{ + if (xeno_get_current() != XN_NO_HANDLE) + __xeno_set_current(XN_NO_HANDLE); +} + static void init_current_keys(void) { int err = create_current_key(); - if (err) goto error_exit; + pthread_atfork(NULL, NULL, &xeno_current_fork_handler); + err = pthread_key_create(&xeno_current_mode_key, cleanup_current_mode); if (err) { error_exit: _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git