1/* Out-of-line notification function for the GSCOPE locking mechanism.
2 Copyright (C) 2007-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <ldsodefs.h>
20#include <pthread.h>
21#include <htl/pt-internal.h>
22
23void
24__thread_gscope_wait (void)
25{
26 size_t i;
27 struct __pthread *t;
28 int *gscope_flagp;
29
30 __libc_rwlock_rdlock (GL (dl_pthread_threads_lock));
31
32 /* Iterate over the list of threads. */
33 for (i = 0; i < GL (dl_pthread_num_threads); ++i)
34 {
35 t = GL (dl_pthread_threads[i]);
36 if (t == NULL || t->tcb->gscope_flag == THREAD_GSCOPE_FLAG_UNUSED)
37 continue;
38
39 gscope_flagp = &t->tcb->gscope_flag;
40
41 /* We have to wait until this thread is done with the global
42 scope. First tell the thread that we are waiting and
43 possibly have to be woken. */
44 if (atomic_compare_and_exchange_bool_acq (gscope_flagp,
45 THREAD_GSCOPE_FLAG_WAIT,
46 THREAD_GSCOPE_FLAG_USED))
47 continue;
48
49 do
50 lll_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT, LLL_PRIVATE);
51 while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT);
52 }
53
54 __libc_rwlock_unlock (GL (dl_pthread_threads_lock));
55}
56

source code of glibc/sysdeps/htl/dl-thread_gscope_wait.c