52typedef struct xtc_lockmgr xtc_lockmgr_t;
53typedef uint64_t xtc_locker_t;
55typedef enum xtc_lock_mode {
68typedef enum xtc_lock_victim_policy {
69 XTC_LOCK_VICTIM_DEFAULT = 0,
70 XTC_LOCK_VICTIM_RANDOM = 1,
71 XTC_LOCK_VICTIM_OLDEST = 2,
72 XTC_LOCK_VICTIM_YOUNGEST = 3,
73 XTC_LOCK_VICTIM_MIN_LOCKS = 4,
74 XTC_LOCK_VICTIM_MAX_LOCKS = 5,
75 XTC_LOCK_VICTIM_MIN_WRITE = 6,
76 XTC_LOCK_VICTIM_MAX_WRITE = 7,
77 XTC_LOCK_VICTIM_EXPIRE = 8,
78 XTC_LOCK_VICTIM_CUSTOM = 9
79} xtc_lock_victim_policy_t;
88typedef int (*xtc_lock_victim_pick_fn)(
const uint64_t *candidate_lockers,
92typedef enum xtc_lock_detect_mode {
93 XTC_LOCK_DETECT_PERIODIC = 0,
94 XTC_LOCK_DETECT_ON_BLOCK = 1,
95 XTC_LOCK_DETECT_NONE = 2
96} xtc_lock_detect_mode_t;
98typedef struct xtc_lockmgr_opts {
100 int64_t detect_interval_ns;
101 xtc_lock_victim_policy_t victim;
102 xtc_lock_detect_mode_t detect_mode;
106 xtc_lock_victim_pick_fn victim_pick_fn;
107 void *victim_pick_user;
112 const uint8_t *conflicts;
116#define XTC_LOCKMGR_OPTS_DEFAULT { \
117 .n_partitions = 64, \
118 .detect_interval_ns = 100LL * 1000 * 1000, \
119 .victim = XTC_LOCK_VICTIM_DEFAULT, \
120 .detect_mode = XTC_LOCK_DETECT_PERIODIC, \
121 .victim_pick_fn = NULL, \
122 .victim_pick_user = NULL, \
128typedef enum xtc_lock_op {
131 XTC_LOCK_OP_PUT_ALL = 2,
132 XTC_LOCK_OP_UPGRADE = 3,
133 XTC_LOCK_OP_DOWNGRADE = 4
136typedef struct xtc_lock_req {
138 xtc_lock_mode_t mode;
144typedef struct xtc_lockmgr_stat {
151 uint64_t n_deadlocks_found;
178void xtc_lockmgr_destroy(xtc_lockmgr_t *mgr);
180int xtc_lockmgr_id(xtc_lockmgr_t *mgr, xtc_locker_t *out);
181int xtc_lockmgr_id_free(xtc_lockmgr_t *mgr, xtc_locker_t l);
186int xtc_lockmgr_id_set_timeout(xtc_lockmgr_t *mgr, xtc_locker_t l,
191int xtc_lock_get(xtc_lockmgr_t *mgr, xtc_locker_t locker,
192 const void *obj,
size_t obj_size,
193 xtc_lock_mode_t mode, int64_t timeout_ns);
195int xtc_lock_put(xtc_lockmgr_t *mgr, xtc_locker_t locker,
196 const void *obj,
size_t obj_size);
198int xtc_lock_release_all(xtc_lockmgr_t *mgr, xtc_locker_t locker);
204int xtc_lock_upgrade(xtc_lockmgr_t *mgr, xtc_locker_t locker,
205 const void *obj,
size_t obj_size,
206 xtc_lock_mode_t new_mode);
207int xtc_lock_downgrade(xtc_lockmgr_t *mgr, xtc_locker_t locker,
208 const void *obj,
size_t obj_size,
209 xtc_lock_mode_t new_mode);
216int xtc_lock_vec(xtc_lockmgr_t *mgr, xtc_locker_t locker,
219int xtc_lockmgr_check_deadlocks(xtc_lockmgr_t *mgr,
int *n_aborted);
223int xtc_lockmgr_failchk(xtc_lockmgr_t *mgr, xtc_locker_t locker);
226int xtc_lockmgr_n_held(
const xtc_lockmgr_t *mgr);
227int xtc_lockmgr_n_waiting(
const xtc_lockmgr_t *mgr);