-#define __rseq_store_RSEQ_FINISH_SINGLE(_targetptr_spec, _newval_spec, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final) \
- do { \
- *(_targetptr_final) = (_newval_final); \
- } while (0)
-
-#define __rseq_store_RSEQ_FINISH_TWO(_targetptr_spec, _newval_spec, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final) \
- do { \
- *(_targetptr_spec) = (_newval_spec); \
- *(_targetptr_final) = (_newval_final); \
- } while (0)
-
-#define __rseq_store_RSEQ_FINISH_MEMCPY(_targetptr_spec, \
- _newval_spec, _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final) \
- do { \
- memcpy(_dest_memcpy, _src_memcpy, _len_memcpy); \
- *(_targetptr_final) = (_newval_final); \
- } while (0)
-
-/*
- * Helper macro doing two restartable critical section attempts, and if
- * they fail, fallback on locking.
- */
-#define __do_rseq(_type, _lock, _rseq_state, _cpu, _result, \
- _targetptr_spec, _newval_spec, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final, _code, _release) \
- do { \
- _rseq_state = rseq_start(_lock); \
- _cpu = rseq_cpu_at_start(_rseq_state); \
- _result = true; \
- _code \
- if (unlikely(!_result)) \
- break; \
- if (likely(__rseq_finish(_lock, \
- _targetptr_spec, _newval_spec, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final, \
- _rseq_state, _type, _release))) \
- break; \
- _rseq_state = rseq_start(_lock); \
- _cpu = rseq_cpu_at_start(_rseq_state); \
- _result = true; \
- _code \
- if (unlikely(!_result)) \
- break; \
- if (likely(__rseq_finish(_lock, \
- _targetptr_spec, _newval_spec, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final, \
- _rseq_state, _type, _release))) \
- break; \
- _cpu = rseq_fallback_begin(_lock); \
- _result = true; \
- _code \
- if (likely(_result)) \
- __rseq_store_##_type(_targetptr_spec, \
- _newval_spec, _dest_memcpy, \
- _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final); \
- rseq_fallback_end(_lock, _cpu); \
- } while (0)
-
-#define do_rseq(_lock, _rseq_state, _cpu, _result, _targetptr, _newval, \
- _code) \
- __do_rseq(RSEQ_FINISH_SINGLE, _lock, _rseq_state, _cpu, _result,\
- NULL, 0, NULL, NULL, 0, _targetptr, _newval, _code, false)
-
-#define do_rseq2(_lock, _rseq_state, _cpu, _result, \
- _targetptr_spec, _newval_spec, \
- _targetptr_final, _newval_final, _code) \
- __do_rseq(RSEQ_FINISH_TWO, _lock, _rseq_state, _cpu, _result, \
- _targetptr_spec, _newval_spec, \
- NULL, NULL, 0, \
- _targetptr_final, _newval_final, _code, false)
-
-#define do_rseq2_release(_lock, _rseq_state, _cpu, _result, \
- _targetptr_spec, _newval_spec, \
- _targetptr_final, _newval_final, _code) \
- __do_rseq(RSEQ_FINISH_TWO, _lock, _rseq_state, _cpu, _result, \
- _targetptr_spec, _newval_spec, \
- NULL, NULL, 0, \
- _targetptr_final, _newval_final, _code, true)
-
-#define do_rseq_memcpy(_lock, _rseq_state, _cpu, _result, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final, _code) \
- __do_rseq(RSEQ_FINISH_MEMCPY, _lock, _rseq_state, _cpu, _result,\
- NULL, 0, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final, _code, false)
-
-#define do_rseq_memcpy_release(_lock, _rseq_state, _cpu, _result, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final, _code) \
- __do_rseq(RSEQ_FINISH_MEMCPY, _lock, _rseq_state, _cpu, _result,\
- NULL, 0, \
- _dest_memcpy, _src_memcpy, _len_memcpy, \
- _targetptr_final, _newval_final, _code, true)
-