diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/thread/pthread_mutex_trylock.c | 33 | 
1 files changed, 16 insertions, 17 deletions
| diff --git a/src/thread/pthread_mutex_trylock.c b/src/thread/pthread_mutex_trylock.c index 7ff4f703..2dad7bbf 100644 --- a/src/thread/pthread_mutex_trylock.c +++ b/src/thread/pthread_mutex_trylock.c @@ -2,24 +2,23 @@  int pthread_mutex_trylock(pthread_mutex_t *m)  { -	pthread_t self; -	if (m->_m_type != PTHREAD_MUTEX_NORMAL) { -		self = pthread_self(); -		if (m->_m_type == PTHREAD_MUTEX_RECURSIVE -		 && m->_m_owner == self->tid) { -			if ((unsigned)m->_m_count >= INT_MAX) return EAGAIN; -			m->_m_count++; -			return 0; -		} -	} +	int tid; + +	if (m->_m_type == PTHREAD_MUTEX_NORMAL) +		return -a_xchg(&m->_m_lock, 1) & EBUSY; -	if (a_xchg(&m->_m_lock, 1)) -		if (m->_m_type == PTHREAD_MUTEX_ERRORCHECK -		 && m->_m_owner == self->tid) return EDEADLK; -		else return EBUSY; -	if (m->_m_type != PTHREAD_MUTEX_NORMAL) { -		m->_m_owner = self->tid; -		m->_m_count = 1; +	tid = pthread_self()->tid; + +	if (m->_m_owner == tid) { +		if (m->_m_type != PTHREAD_MUTEX_RECURSIVE) +			return EDEADLK; +		if ((unsigned)m->_m_count >= INT_MAX) return EAGAIN; +		m->_m_count++; +		return 0;  	} + +	if (a_xchg(&m->_m_lock, 1)) return EBUSY; +	m->_m_owner = tid; +	m->_m_count = 1;  	return 0;  } | 
