Am Wed, 25 Jan 2017 16:08:37 +0100 schrieb Henning Schild <[email protected]>:
> The implementation of these functions uses locks and has the potential > to trigger a SIGXCPU when contended. Wrap them with assert_nrt so they > reliably cause a switch when used in the rt context. > > Signed-off-by: Henning Schild <[email protected]> > --- > lib/cobalt/assert.wrappers | 3 +++ > lib/cobalt/assert_context.c | 19 +++++++++++++++++++ > lib/cobalt/internal.h | 12 ++++++++++++ > lib/cobalt/wrappers.c | 37 > +++++++++++++++++++++++++++++++++++++ 4 files changed, 71 > insertions(+) > > diff --git a/lib/cobalt/assert.wrappers b/lib/cobalt/assert.wrappers > index 7164858..65320ab 100644 > --- a/lib/cobalt/assert.wrappers > +++ b/lib/cobalt/assert.wrappers > @@ -1,2 +1,5 @@ > --wrap malloc > --wrap free > +--wrap __cxa_guard_acquire > +--wrap __cxa_guard_release > +--wrap __cxa_guard_abort > diff --git a/lib/cobalt/assert_context.c b/lib/cobalt/assert_context.c > index 2085953..fd18d6b 100644 > --- a/lib/cobalt/assert_context.c > +++ b/lib/cobalt/assert_context.c > @@ -66,3 +66,22 @@ COBALT_IMPL(void, free, (void *ptr)) > assert_nrt(); > __STD(free(ptr)); > } > + > +/* CXXABI 3.3.2 One-time Construction API */ > +COBALT_IMPL(int, __cxa_guard_acquire, (__guard *g)) > +{ > + assert_nrt(); > + return __STD(__cxa_guard_acquire(g)); > +} > + > +COBALT_IMPL(void, __cxa_guard_release, (__guard *g)) > +{ > + assert_nrt(); > + __STD(__cxa_guard_release(g)); > +} > + > +COBALT_IMPL(void, __cxa_guard_abort, (__guard *g)) > +{ > + assert_nrt(); > + __STD(__cxa_guard_abort(g)); > +} > diff --git a/lib/cobalt/internal.h b/lib/cobalt/internal.h > index 1531901..8874f71 100644 > --- a/lib/cobalt/internal.h > +++ b/lib/cobalt/internal.h > @@ -93,4 +93,16 @@ extern int __cobalt_std_fifo_minpri, > extern int __cobalt_std_rr_minpri, > __cobalt_std_rr_maxpri; > > +#ifdef __ARM_EABI__ > +typedef uint32_t __guard; > +#else > +typedef uint64_t __guard; > +#endif > +int __real___cxa_guard_acquire(__guard*); > +void __real___cxa_guard_release(__guard*); > +void __real___cxa_guard_abort(__guard*); > +int __cxa_guard_acquire(__guard*); > +void __cxa_guard_release(__guard*); > +void __cxa_guard_abort(__guard*); > + > #endif /* _LIB_COBALT_INTERNAL_H */ > diff --git a/lib/cobalt/wrappers.c b/lib/cobalt/wrappers.c > index 43ca630..fa7fbcb 100644 > --- a/lib/cobalt/wrappers.c > +++ b/lib/cobalt/wrappers.c > @@ -43,6 +43,7 @@ > #include <unistd.h> > #include <malloc.h> > #include <boilerplate/compiler.h> > +#include <internal.h> > > /* sched */ > __weak > @@ -544,3 +545,39 @@ int __real_usleep(useconds_t usec) > { > return usleep(usec); > } > + > +__weak > +int __real___cxa_guard_acquire(__guard *g) > +{ > + return __cxa_guard_acquire(g); > +} > + > +__weak > +void __real___cxa_guard_release(__guard *g) > +{ > + return __cxa_guard_release(g); > +} > + > +__weak > +void __real___cxa_guard_abort(__guard *g) > +{ > + return __cxa_guard_abort(g); > +} The following weak symbols are not always replaced by the strong ones from libstdc++. They are just here for C-code and can now break C++. > +__weak > +int __cxa_guard_acquire(__guard *g) > +{ > + return 0; > +} > + > +__weak > +void __cxa_guard_release(__guard *g) > +{ > + return; > +} > + > +__weak > +void __cxa_guard_abort(__guard *g) > +{ > + return; > +} For dynamically linked executables you do need "LD_DYNAMIC_WEAK" in your env and for static linking "--whole-archive". Otherwise you might end up using these weak dummies. This patch introduced a critical bug! I will come up with a fix but wanted to report the problem first. Henning _______________________________________________ Xenomai mailing list [email protected] https://xenomai.org/mailman/listinfo/xenomai
