Bruno Haible via Gnulib discussion list <bug-gnulib@gnu.org> writes:

> The code of module 'asyncsafe-spin' consists of a multithread-safe spin lock
> implementation (that works fine even on native Windows), with an add-on
> intented to make it async signal safe (this part does not work reliably on
> native Windows).
>
> This suggests that it makes sense to rebase 'asyncsafe-spin' on top of a
> module 'spin', that implements purely the multithread-safe spin locks.

Thanks. I agree that spinlocks belong in glthreads with the other
synchronization primitives.

One thing that isn't new but was brought to my attention looking at
these patches:

> +static void
> +memory_barrier (void)
> +{
> +#  if defined __GNUC__ || defined __clang__ || __SUNPRO_C >= 0x590 || 
> defined __TINYC__
> +#   if defined __i386 || defined __x86_64__
> +#    if defined __TINYC__ && defined __i386
> +  /* Cannot use the SSE instruction "mfence" with this compiler.  */
> +  asm volatile ("lock orl $0,(%esp)");
> +#    else
> +  asm volatile ("mfence");
> +#    endif
> +#   endif
> +#   if defined __sparc
> +  asm volatile ("membar 2");
> +#   endif
> +#  else
> +#   if defined __i386 || defined __x86_64__
> +  asm ("mfence");
> +#   endif
> +#   if defined __sparc
> +  asm ("membar 2");
> +#   endif
> +#  endif
> +}

Wouldn't it be better to use '__asm__' here and in the other functions
using inline assembly?

Since 'asm' only works when using one of the GNU standards
(e.g. -std=gnu23).

I ran into this issue recently compiling GNU Guile which does not yet
support C23 compilers which is the default since GCC 15. My solution was
to run './configure CFLAGS='-std=c99''. But ran into a compiler error
where 'asm ("r12")' was used to force a variable into the register.

Collin

  • new module 'spin' Bruno Haible via Gnulib discussion list
    • Re: new module 'spin' Collin Funk

Reply via email to