Module: xenomai-3 Branch: next Commit: be90f09cf277083ff7021b1f0f1a856c66c42b46 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=be90f09cf277083ff7021b1f0f1a856c66c42b46
Author: Henning Schild <henning.sch...@siemens.com> Date: Wed Jan 25 16:08:00 2017 +0100 lib/cobalt: wrap CXXABI One-time Constructor functions 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 <henning.sch...@siemens.com> --- 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 fee3fe1..9f58c6a 100644 --- a/lib/cobalt/internal.h +++ b/lib/cobalt/internal.h @@ -73,4 +73,16 @@ void cobalt_check_features(struct cobalt_featinfo *finfo); extern struct sigaction __cobalt_orig_sigdebug; +#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 09c74e5..65dc3bd 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 @@ -532,3 +533,39 @@ unsigned int __real_sleep(unsigned int seconds) { return sleep(seconds); } + +__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); +} + +__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; +} _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git