On Wed, Sep 25, 2024 at 10:43:50AM +0100, Jonathan Wakely wrote:
> > libgcc/ChangeLog:
> >
> >         * gthr-posix.h (__GTHREAD_INLINE): New macro.
> >         (__gthread_active): Convert from variable to function.
> >         (__gthread_trigger): Mark as __GTHREAD_INLINE instead of static.
> >         (__gthread_active_p): Likewise.
> >         (__gthread_create): Likewise.
> >         (__gthread_join): Likewise.
> >         (__gthread_detach): Likewise.
> >         (__gthread_equal): Likewise.
> >         (__gthread_self): Likewise.
> >         (__gthread_yield): Likewise.
> >         (__gthread_once): Likewise.
> >         (__gthread_key_create): Likewise.
> >         (__gthread_key_delete): Likewise.
> >         (__gthread_getspecific): Likewise.
> >         (__gthread_setspecific): Likewise.
> >         (__gthread_mutex_init_function): Likewise.
> >         (__gthread_mutex_destroy): Likewise.
> >         (__gthread_mutex_lock): Likewise.
> >         (__gthread_mutex_trylock): Likewise.
> >         (__gthread_mutex_timedlock): Likewise.
> >         (__gthread_mutex_unlock): Likewise.
> >         (__gthread_recursive_mutex_init_function): Likewise.
> >         (__gthread_recursive_mutex_lock): Likewise.
> >         (__gthread_recursive_mutex_trylock): Likewise.
> >         (__gthread_recursive_mutex_timedlock): Likewise.
> >         (__gthread_recursive_mutex_unlock): Likewise.
> >         (__gthread_recursive_mutex_destroy): Likewise.
> >         (__gthread_cond_init_function): Likewise.
> >         (__gthread_cond_broadcast): Likewise.
> >         (__gthread_cond_signal): Likewise.
> >         (__gthread_cond_wait): Likewise.
> >         (__gthread_cond_timedwait): Likewise.
> >         (__gthread_cond_wait_recursive): Likewise.
> >         (__gthread_cond_destroy): Likewise.
> >         (__gthread_rwlock_rdlock): Likewise.
> >         (__gthread_rwlock_tryrdlock): Likewise.
> >         (__gthread_rwlock_wrlock): Likewise.
> >         (__gthread_rwlock_trywrlock): Likewise.
> >         (__gthread_rwlock_unlock): Likewise.
> >         * gthr-single.h (__GTHREAD_INLINE): New macro.
> >         (__gthread_active_p): Mark as __GTHREAD_INLINE instead of static.
> >         (__gthread_once): Likewise.
> >         (__gthread_key_create): Likewise.
> >         (__gthread_key_delete): Likewise.
> >         (__gthread_getspecific): Likewise.
> >         (__gthread_setspecific): Likewise.
> >         (__gthread_mutex_destroy): Likewise.
> >         (__gthread_mutex_lock): Likewise.
> >         (__gthread_mutex_trylock): Likewise.
> >         (__gthread_mutex_unlock): Likewise.
> >         (__gthread_recursive_mutex_lock): Likewise.
> >         (__gthread_recursive_mutex_trylock): Likewise.
> >         (__gthread_recursive_mutex_unlock): Likewise.
> >         (__gthread_recursive_mutex_destroy): Likewise.

I'm worried about ABI consequences of these changes.
>From what I can see, this doesn't change anything important for C,
the inlines are still static inline and the conversion of global static
vars to function-local in static inline still keeps those static.

But for C++ this means significant changes.
Say
_ZZ16__gthread_activevE20__gthread_active_var
etc. will now be STB_GNU_UNIQUE symbol, exported from whatever shared
libraries and binaries are compiled with C++ and include those headers
and actually use them somewhere.

On one side, it has benefits (e.g. every TU won't separately test and
store whether the threads are active or not), on the other side it can
prevent dlclose of some shared libraries and create interdependencies
between libraries.

So, I wonder if we couldn't define the C++ __GTHREAD_INLINE to
static inline __attribute__((__always_inline__)) (or at least when
using a compiler which supports the attribute, we can now test it
using preprocessor...).  And whether similarly we couldn't use
__attribute__((__visibility__ ("hidden"))) on the static block scope
vars for C++ (again, if compiler supports that), so that the changes
don't affect ABI of C++ libraries.

        Jakub

Reply via email to