source: azure_iot_hub/trunk/musl-1.1.18/src/thread/pthread_mutex_trylock.c@ 389

Last change on this file since 389 was 389, checked in by coas-nagasima, 5 years ago

ビルドが通るよう更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 1.6 KB
Line 
1#include "pthread_impl.h"
2
3int __pthread_mutex_trylock_owner(pthread_mutex_t *m)
4{
5 int old, own;
6 int type = m->_m_type & 15;
7 pthread_t self = __pthread_self();
8 int tid = self->tid;
9
10 old = m->_m_lock;
11 own = old & 0x7fffffff;
12 if (own == tid && (type&3) == PTHREAD_MUTEX_RECURSIVE) {
13 if ((unsigned)m->_m_count >= INT_MAX) return EAGAIN;
14 m->_m_count++;
15 return 0;
16 }
17 if (own == 0x7fffffff) return ENOTRECOVERABLE;
18
19 if (m->_m_type & 128) {
20 if (!self->robust_list.off) {
21 self->robust_list.off = (char*)&m->_m_lock-(char *)&m->_m_next;
22 __syscall(SYS_set_robust_list, &self->robust_list, 3*sizeof(long));
23 }
24 if (m->_m_waiters) tid |= 0x80000000;
25 self->robust_list.pending = &m->_m_next;
26 }
27
28 if ((own && (!(own & 0x40000000) || !(type & 4)))
29 || a_cas(&m->_m_lock, old, tid) != old) {
30 self->robust_list.pending = 0;
31 return EBUSY;
32 }
33
34 volatile void *next = self->robust_list.head;
35 m->_m_next = next;
36 m->_m_prev = &self->robust_list.head;
37 if (next != &self->robust_list.head) *(volatile void *volatile *)
38 ((char *)next - sizeof(void *)) = &m->_m_next;
39 self->robust_list.head = &m->_m_next;
40 self->robust_list.pending = 0;
41
42 if (own) {
43 m->_m_count = 0;
44 m->_m_type |= 8;
45 return EOWNERDEAD;
46 }
47
48 return 0;
49}
50
51int __pthread_mutex_trylock(pthread_mutex_t *m)
52{
53 if ((m->_m_type&15) == PTHREAD_MUTEX_NORMAL)
54 return a_cas(&m->_m_lock, 0, EBUSY) & EBUSY;
55 return __pthread_mutex_trylock_owner(m);
56}
57
58#ifndef __c2__
59weak_alias(__pthread_mutex_trylock, pthread_mutex_trylock);
60#else
61int pthread_mutex_trylock(pthread_mutex_t *m)
62{
63 return __pthread_mutex_trylock(m);
64}
65#endif
Note: See TracBrowser for help on using the repository browser.