-bool rseq_finish(struct rseq_lock *rlock,
- intptr_t *p, intptr_t to_write,
+bool rseq_finish_rlock(struct rseq_lock *rlock,
+ intptr_t *p_spec, intptr_t to_write_spec,
+ void *p_memcpy, void *to_write_memcpy, size_t len_memcpy,
+ intptr_t *p_final, intptr_t to_write_final,
+ struct rseq_state start_value,
+ enum rseq_finish_type type, bool release)
+{
+ if (unlikely(start_value.lock_state != RSEQ_LOCK_STATE_RESTART)) {
+ if (start_value.lock_state == RSEQ_LOCK_STATE_LOCK)
+ rseq_fallback_wait(rlock);
+ return false;
+ }
+ return __rseq_finish(p_spec, to_write_spec, p_memcpy,
+ to_write_memcpy, len_memcpy,
+ p_final, to_write_final,
+ start_value, type, release);
+}
+
+static inline __attribute__((always_inline))
+bool rseq_finish(intptr_t *p, intptr_t to_write,