diff options
Diffstat (limited to 'nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch')
-rw-r--r-- | nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch b/nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch new file mode 100644 index 000000000000..2f611fc467e7 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch @@ -0,0 +1,41 @@ +From d1fa28860634af4f0efd70d533a756b51a45f83e Mon Sep 17 00:00:00 2001 +From: Rich Felker <dalias@aerifal.cx> +Date: Tue, 4 Sep 2018 21:31:47 -0400 +Subject: [PATCH 2/3] in pthread_mutex_timedlock, avoid repeatedly reading + mutex type field + +compiler cannot cache immutable fields of the mutex object across +external calls it can't see, much less across atomics. +--- + src/thread/pthread_mutex_timedlock.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/src/thread/pthread_mutex_timedlock.c b/src/thread/pthread_mutex_timedlock.c +index 0a240e79..f91f4a61 100644 +--- a/src/thread/pthread_mutex_timedlock.c ++++ b/src/thread/pthread_mutex_timedlock.c +@@ -6,7 +6,8 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec + && !a_cas(&m->_m_lock, 0, EBUSY)) + return 0; + +- int r, t, priv = (m->_m_type & 128) ^ 128; ++ int type = m->_m_type; ++ int r, t, priv = (type & 128) ^ 128; + + r = pthread_mutex_trylock(m); + if (r != EBUSY) return r; +@@ -15,9 +16,9 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec + while (spins-- && m->_m_lock && !m->_m_waiters) a_spin(); + + while ((r=pthread_mutex_trylock(m)) == EBUSY) { +- if (!(r=m->_m_lock) || ((r&0x40000000) && (m->_m_type&4))) ++ if (!(r=m->_m_lock) || ((r&0x40000000) && (type&4))) + continue; +- if ((m->_m_type&3) == PTHREAD_MUTEX_ERRORCHECK ++ if ((type&3) == PTHREAD_MUTEX_ERRORCHECK + && (r&0x7fffffff) == __pthread_self()->tid) + return EDEADLK; + +-- +2.19.0 + |