diff options
Diffstat (limited to 'src/thread/pthread_mutex_trylock.c')
-rw-r--r-- | src/thread/pthread_mutex_trylock.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/thread/pthread_mutex_trylock.c b/src/thread/pthread_mutex_trylock.c index 8d256614..31587e1f 100644 --- a/src/thread/pthread_mutex_trylock.c +++ b/src/thread/pthread_mutex_trylock.c @@ -9,6 +9,7 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m) if (!self->robust_list.off) { __syscall(SYS_set_robust_list, &self->robust_list, 3*sizeof(long)); + self->robust_list.head = &self->robust_list.head; self->robust_list.off = (char*)&m->_m_lock-(char *)&m->_m_next; } @@ -29,10 +30,11 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m) return EBUSY; } - m->_m_next = self->robust_list.head; + volatile void *next = self->robust_list.head; + m->_m_next = next; m->_m_prev = &self->robust_list.head; - if (self->robust_list.head) - self->robust_list.head[-1] = &m->_m_next; + if (next != &self->robust_list.head) *(volatile void *volatile *) + ((char *)next - sizeof(void *)) = &m->_m_next; self->robust_list.head = &m->_m_next; self->robust_list.pending = 0; |