diff mbox series

nptl: Mention libstdc++ compatibility for pthread_once

Message ID 871rdhhgyq.fsf@oldenburg.str.redhat.com
State New
Headers show
Series nptl: Mention libstdc++ compatibility for pthread_once | expand

Commit Message

Florian Weimer Feb. 15, 2021, 8:29 a.m. UTC
---
 nptl/pthread_once.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Comments

Florian Weimer March 8, 2021, 12:12 p.m. UTC | #1
* Florian Weimer via Libc-alpha:

> ---
>  nptl/pthread_once.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c
> index 28d97097c7..702d1c0877 100644
> --- a/nptl/pthread_once.c
> +++ b/nptl/pthread_once.c
> @@ -61,7 +61,15 @@ clear_once_control (void *arg)
>     interrupted cases anymore.
>     XXX: We split out this slow path because current compilers do not generate
>     as efficient code when the fast path in __pthread_once below is not in a
> -   separate function.  */
> +   separate function.
> +
> +   Compatibility note: The implementation of std::call_once in
> +   libstdc++ before GCC 11 does not call pthread_once if the control
> +   object has the value __PTHREAD_ONCE_DONE (2).  libstdc++ starting
> +   in GCC 11 uses the values 0 (uninitialized), 1 (in progress), 2
> +   (done) for its own from-scratch implementation.  These
> +   implementations can operate on the same control object if libstdc++
> +   is statically linked.  */
>  static int
>  __attribute__ ((noinline))
>  __pthread_once_slow (pthread_once_t *once_control, void (*init_routine) (void))

I'm dropping this patch, it's not correct and no longer relevant.

Thanks,
Florian
diff mbox series

Patch

diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c
index 28d97097c7..702d1c0877 100644
--- a/nptl/pthread_once.c
+++ b/nptl/pthread_once.c
@@ -61,7 +61,15 @@  clear_once_control (void *arg)
    interrupted cases anymore.
    XXX: We split out this slow path because current compilers do not generate
    as efficient code when the fast path in __pthread_once below is not in a
-   separate function.  */
+   separate function.
+
+   Compatibility note: The implementation of std::call_once in
+   libstdc++ before GCC 11 does not call pthread_once if the control
+   object has the value __PTHREAD_ONCE_DONE (2).  libstdc++ starting
+   in GCC 11 uses the values 0 (uninitialized), 1 (in progress), 2
+   (done) for its own from-scratch implementation.  These
+   implementations can operate on the same control object if libstdc++
+   is statically linked.  */
 static int
 __attribute__ ((noinline))
 __pthread_once_slow (pthread_once_t *once_control, void (*init_routine) (void))