Jan Kiszka wrote: > Provide assert_nrt helper that checks if the caller is either not a > shadow thread or is currently running in relaxed mode. If not, SIG_XCPU > is raised. > > This service is then used to provide wrappers for glibc functions that > are not realtime-safe but do not always trigger a syscall. Such > functions may therefore be used by RT threads in primary mode for quite > a while without being detected via some Xenomai mode switch. Moreover, > some functions that go through the vsyscall page even to raise an > ordinary syscall may not allow proper stack backtraces, making it harder > to find their callers. > > So far we provide wrappers (for use with the --wrap linker switch) for > malloc/free, gettimeofday and clock_gettime. Adding more (if there > are/will be more) is trivial. > > Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> > --- > > src/rtdk/Makefile.am | 5 +- > src/rtdk/assert_context.c | 97 > +++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 100 insertions(+), 2 deletions(-) > create mode 100644 src/rtdk/assert_context.c > > diff --git a/src/rtdk/Makefile.am b/src/rtdk/Makefile.am > index cb80262..5b76b5d 100644 > --- a/src/rtdk/Makefile.am > +++ b/src/rtdk/Makefile.am > @@ -1,10 +1,11 @@ > lib_LTLIBRARIES = librtdk.la > > -librtdk_la_LDFLAGS = -version-info 0:0:0 -lpthread > +librtdk_la_LDFLAGS = -version-info 0:0:0 -lpthread -lrt > > librtdk_la_SOURCES = \ > init.c \ > - rt_print.c > + rt_print.c \ > + assert_context.c > > librtdk_la_CPPFLAGS = \ > @XENO_USER_CFLAGS@ \ > diff --git a/src/rtdk/assert_context.c b/src/rtdk/assert_context.c > new file mode 100644 > index 0000000..e01fc93 > --- /dev/null > +++ b/src/rtdk/assert_context.c > @@ -0,0 +1,97 @@ > +/* > + * Copyright (C) 2008 Jan Kiszka <jan.kis...@siemens.com>. > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. > + */ > + > +#include <signal.h> > +#include <stdlib.h> > +#include <time.h> > +#include <sys/time.h> > + > +#include <nucleus/thread.h> > +#include <asm-generic/syscall.h> > +#include <asm-generic/bits/current.h> > + > +void assert_nrt(void) > +{ > + xnthread_info_t info; > + int err; > + > + if (unlikely(xeno_get_current() != XN_NO_HANDLE && > + !(xeno_get_current_mode() & XNRELAX))) { > + > + err = XENOMAI_SYSCALL1(__xn_sys_current_info, &info); > + > + if (err) { > + fprintf(stderr, "__xn_sys_current_info failed: %s\n", > + strerror(-err)); > + return; > + } > + > + if (info.state & XNTRAPSW) > + pthread_kill(pthread_self(), SIGXCPU); > + } > +} > + > +/* Memory allocation services */ > +__attribute__ ((weak)) > +void *__real_malloc(size_t size) > +{ > + return malloc(size); > +} > + > +void *__warp_malloc(size_t size) > +{ > + assert_nrt(); > + return __real_malloc(size); > +}
It is wrap not warp, and the __real functions should not be put in the same compilation unit as the __wrap functions. -- Gilles. _______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core