Gilles Chanteperdrix wrote:
> 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.

OK, seems to have worked by chance. Will provide an update.

Thanks,
Jan

-- 
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to