Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Thu, 18 May 2023 10:49:44 +0800
From: "847567161" <847567161@...com>
To: "musl" <musl@...ts.openwall.com>
Subject: Re: Re: Question:Why musl call a_barrier in __pthread_once?

Hi,

&gt; There is an alternate algorithm for pthread_once that doesn't require
&gt; a barrier in the common case, which I've considered implementing. But
&gt; it does need efficient access to thread-local storage. At one time,
&gt; this was a kinda bad assumption (especially legacy mips is horribly
&gt; slow at TLS) but nowadays it's probably the right choice to make, and
&gt; we should check that out again...

1、Can we move dmb after we get the value of control? like this:

int __pthread_once(pthread_once_t *control, void (*init)(void))
{
    /* Return immediately if init finished before, but ensure that
    * effects of the init routine are visible to the caller. */
    if (*(volatile int *)control == 2) {
        // a_barrier();
        return 0;
    }

    a_barrier();
    return __pthread_once_full(control, init);
}

2、Can we use 'ldar' to  instead of dmb here? I see musl
already use 'stlxr' in a_sc.  like this:

static inline int load(volatile int *p)
{
	int v;
	__asm__ __volatile__ ("ldar %w0,%1" : "=r"(v) : "Q"(*p));
	return v;
}

if (load((volatile int *)control) == 2) {
    return 0;
}

...


Chuang Yin

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.