Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: fusl/src/thread/pthread_mutex_trylock.c

Issue 1573973002: Add a "fork" of musl as //fusl. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fusl/src/thread/pthread_mutex_timedlock.c ('k') | fusl/src/thread/pthread_mutex_unlock.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #include "pthread_impl.h"
2
3 int __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 == 0x40000000) 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*siz eof(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
51 int __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 weak_alias(__pthread_mutex_trylock, pthread_mutex_trylock);
OLDNEW
« no previous file with comments | « fusl/src/thread/pthread_mutex_timedlock.c ('k') | fusl/src/thread/pthread_mutex_unlock.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698