aboutsummaryrefslogtreecommitdiff
path: root/nptl/pthread_mutex_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/pthread_mutex_init.c')
-rw-r--r--nptl/pthread_mutex_init.c148
1 files changed, 0 insertions, 148 deletions
diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c
deleted file mode 100644
index 138e144155..0000000000
--- a/nptl/pthread_mutex_init.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <assert.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <string.h>
-#include <kernel-features.h>
-#include "pthreadP.h"
-#include <atomic.h>
-
-#include <stap-probe.h>
-
-static const struct pthread_mutexattr default_mutexattr =
- {
- /* Default is a normal mutex, not shared between processes. */
- .mutexkind = PTHREAD_MUTEX_NORMAL
- };
-
-
-static bool
-prio_inherit_missing (void)
-{
-#ifdef __NR_futex
- static int tpi_supported;
- if (__glibc_unlikely (tpi_supported == 0))
- {
- int lock = 0;
- INTERNAL_SYSCALL_DECL (err);
- int ret = INTERNAL_SYSCALL (futex, err, 4, &lock, FUTEX_UNLOCK_PI, 0, 0);
- assert (INTERNAL_SYSCALL_ERROR_P (ret, err));
- tpi_supported = INTERNAL_SYSCALL_ERRNO (ret, err) == ENOSYS ? -1 : 1;
- }
- return __glibc_unlikely (tpi_supported < 0);
-#endif
- return true;
-}
-
-int
-__pthread_mutex_init (pthread_mutex_t *mutex,
- const pthread_mutexattr_t *mutexattr)
-{
- const struct pthread_mutexattr *imutexattr;
-
- assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T);
-
- imutexattr = ((const struct pthread_mutexattr *) mutexattr
- ?: &default_mutexattr);
-
- /* Sanity checks. */
- switch (__builtin_expect (imutexattr->mutexkind
- & PTHREAD_MUTEXATTR_PROTOCOL_MASK,
- PTHREAD_PRIO_NONE
- << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT))
- {
- case PTHREAD_PRIO_NONE << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT:
- break;
-
- case PTHREAD_PRIO_INHERIT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT:
- if (__glibc_unlikely (prio_inherit_missing ()))
- return ENOTSUP;
- break;
-
- default:
- /* XXX: For now we don't support robust priority protected mutexes. */
- if (imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST)
- return ENOTSUP;
- break;
- }
-
- /* Clear the whole variable. */
- memset (mutex, '\0', __SIZEOF_PTHREAD_MUTEX_T);
-
- /* Copy the values from the attribute. */
- mutex->__data.__kind = imutexattr->mutexkind & ~PTHREAD_MUTEXATTR_FLAG_BITS;
-
- if ((imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST) != 0)
- {
-#ifndef __ASSUME_SET_ROBUST_LIST
- if ((imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_PSHARED) != 0
- && __set_robust_list_avail < 0)
- return ENOTSUP;
-#endif
-
- mutex->__data.__kind |= PTHREAD_MUTEX_ROBUST_NORMAL_NP;
- }
-
- switch (imutexattr->mutexkind & PTHREAD_MUTEXATTR_PROTOCOL_MASK)
- {
- case PTHREAD_PRIO_INHERIT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT:
- mutex->__data.__kind |= PTHREAD_MUTEX_PRIO_INHERIT_NP;
- break;
-
- case PTHREAD_PRIO_PROTECT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT:
- mutex->__data.__kind |= PTHREAD_MUTEX_PRIO_PROTECT_NP;
-
- int ceiling = (imutexattr->mutexkind
- & PTHREAD_MUTEXATTR_PRIO_CEILING_MASK)
- >> PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT;
- if (! ceiling)
- {
- /* See __init_sched_fifo_prio. */
- if (atomic_load_relaxed (&__sched_fifo_min_prio) == -1)
- __init_sched_fifo_prio ();
- if (ceiling < atomic_load_relaxed (&__sched_fifo_min_prio))
- ceiling = atomic_load_relaxed (&__sched_fifo_min_prio);
- }
- mutex->__data.__lock = ceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT;
- break;
-
- default:
- break;
- }
-
- /* The kernel when waking robust mutexes on exit never uses
- FUTEX_PRIVATE_FLAG FUTEX_WAKE. */
- if ((imutexattr->mutexkind & (PTHREAD_MUTEXATTR_FLAG_PSHARED
- | PTHREAD_MUTEXATTR_FLAG_ROBUST)) != 0)
- mutex->__data.__kind |= PTHREAD_MUTEX_PSHARED_BIT;
-
- /* Default values: mutex not used yet. */
- // mutex->__count = 0; already done by memset
- // mutex->__owner = 0; already done by memset
- // mutex->__nusers = 0; already done by memset
- // mutex->__spins = 0; already done by memset
- // mutex->__next = NULL; already done by memset
-
- LIBC_PROBE (mutex_init, 1, mutex);
-
- return 0;
-}
-strong_alias (__pthread_mutex_init, pthread_mutex_init)
-hidden_def (__pthread_mutex_init)