Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
>> Gilles Chanteperdrix wrote:
>>> Jan Kiszka wrote:
>>>> Gilles Chanteperdrix wrote:
>>>>> Jan Kiszka wrote:
>>>>>> It will always remain orders of magnitude heavier than __thread
>>>>>> variables which are a) inlined and b) should only need two memory
>>>>>> accesses at worst. Moreover, it is clearly the future, while the
>>>>>> importance of pthread_getspecific will decrease over the time. The
>>>>>> __thread storage class is C99 standard (though its implementation
>>>>>> remains a separate topic).
>>>>> You are exagerating a bit: pthread_getspecific is pretty efficient
>>>>> already (from the few things that I have timed on ARM, it is the only
>>>>> one which takes under the microsecond). That you will gain something
>>>>> with __thread is not guaranteed by the C99 standard either: in fact the
>>>>> implementation could use exactly the same functions.
>>>> As long as we do not loose anything (performance or portability),
>>> You loose portability. But I agree that we do not care much.
>> The fallback remains - must remain in order to obtain true optimization
>> from the TLS-based version without locking out some corner-case usage.
>> Find a proposal below (on top of handle-based xeno_get_current).
>> We have to set initial-exec as TLS model, otherwise we end up with a
>> dynamic lookup similar (maybe still faster, dunno) to the pthread
>> service. This model requires start-time linking, will not work with
>> dlopen (I strongly assume the linker will bail out). But I consider
>> runtime loading of Xenomai libs as a uncommon corner case, and the user
>> can still re-enable it via --without-__thread.
> glibc has a separate test to know whether the tsl_model attribute is
> supported:
> if test "$libc_cv_gcc___thread" = yes; then
>   dnl Check whether the compiler supports the tls_model attribute.
>   AC_CACHE_CHECK([for tls_model attribute], libc_cv_gcc_tls_model_attr, [dnl
>   cat > conftest.c <<\EOF
> extern __thread int a __attribute__((tls_model ("initial-exec")));
>   if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -S -Werror conftest.c
> GE_LOG_FD]); then
>     libc_cv_gcc_tls_model_attr=yes
>   else
>     libc_cv_gcc_tls_model_attr=no
>   fi
>   rm -f conftest*])
>   if test "$libc_cv_gcc_tls_model_attr" = yes; then
>   fi
> fi

OK, but for us the question is if we want __thread without initial-exec
at all. If not (I think so), I could add -Werror to the __thread test
and that should combine both tests into a single one, sufficient for our
use case.


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

Xenomai-core mailing list

Reply via email to