+ if (own == 0x3fffffff) return ENOTRECOVERABLE;
+ if (own || (old && !(type & 4))) return EBUSY;
+
+ if (type & 128) {
+ if (!self->robust_list.off) {
+ self->robust_list.off = (char*)&m->_m_lock-(char *)&m->_m_next;
+ __syscall(SYS_set_robust_list, &self->robust_list, 3*sizeof(long));
+ }
+ if (m->_m_waiters) tid |= 0x80000000;
+ self->robust_list.pending = &m->_m_next;
+ }
+ tid |= old & 0x40000000;
+
+ if (a_cas(&m->_m_lock, old, tid) != old) {
+ self->robust_list.pending = 0;
+ if ((type&12)==12 && m->_m_waiters) return ENOTRECOVERABLE;
+ return EBUSY;
+ }