+
+ if ((own && !(own & 0x40000000)) || a_cas(&m->_m_lock, old, tid)!=old)
+ return EBUSY;
+
+ if (m->_m_type < 4) return 0;
+
+ if (m->_m_type >= 8) {
+ m->_m_lock = 0;
+ return ENOTRECOVERABLE;
+ }
+ m->_m_next = self->robust_list.head;
+ m->_m_prev = &self->robust_list.head;
+ if (self->robust_list.head)
+ self->robust_list.head[-1] = &m->_m_next;
+ self->robust_list.head = &m->_m_next;
+ self->robust_list.pending = 0;
+ if (own) {
+ m->_m_count = 0;
+ m->_m_type += 8;
+ return EOWNERDEAD;
+ }
+