mirror of
https://abf.rosa.ru/djam/glibc.git
synced 2025-02-23 15:02:47 +00:00
28 lines
717 B
Diff
28 lines
717 B
Diff
--- glibc-2.23/nptl/pthread_mutex_lock.c.org 2016-03-03 22:33:24.230342596 -0500
|
|
+++ glibc-2.23/nptl/pthread_mutex_lock.c 2016-03-03 22:43:18.285915880 -0500
|
|
@@ -75,9 +75,22 @@
|
|
if (__glibc_likely (type == PTHREAD_MUTEX_TIMED_NP))
|
|
{
|
|
FORCE_ELISION (mutex, goto elision);
|
|
- simple:
|
|
- /* Normal mutex. */
|
|
- LLL_MUTEX_LOCK (mutex);
|
|
+ if (LLL_MUTEX_TRYLOCK (mutex) != 0)
|
|
+ {
|
|
+ int cnt = 0;
|
|
+ do
|
|
+ {
|
|
+ if (cnt++ >= 256 || !__is_smp)
|
|
+ {
|
|
+ /* Normal mutex. */
|
|
+simple:
|
|
+ LLL_MUTEX_LOCK (mutex);
|
|
+ break;
|
|
+ }
|
|
+ atomic_spin_nop ();
|
|
+ }
|
|
+ while (LLL_MUTEX_TRYLOCK (mutex) != 0);
|
|
+ }
|
|
assert (mutex->__data.__owner == 0);
|
|
}
|
|
#ifdef HAVE_ELISION
|