diff --git a/include/ck_spinlock.h b/include/ck_spinlock.h index 35c78dc..aecb91b 100644 --- a/include/ck_spinlock.h +++ b/include/ck_spinlock.h @@ -464,6 +464,20 @@ ck_spinlock_ticket_init(struct ck_spinlock_ticket *ticket) return; } +CK_CC_INLINE static bool +ck_spinlock_ticket_locked(struct ck_spinlock_ticket *ticket) +{ + CK_SPINLOCK_TICKET_TYPE request, position; + + ck_pr_fence_load(); + + request = CK_SPINLOCK_TICKET_LOAD(&ticket->value); + position = request & CK_SPINLOCK_TICKET_MASK; + request >>= CK_SPINLOCK_TICKET_SHIFT; + + return request != position; +} + CK_CC_INLINE static void ck_spinlock_ticket_lock(struct ck_spinlock_ticket *ticket) { @@ -575,6 +589,17 @@ ck_spinlock_ticket_init(struct ck_spinlock_ticket *ticket) return; } +CK_CC_INLINE static bool +ck_spinlock_ticket_locked(struct ck_spinlock_ticket *ticket) +{ + unsigned int request; + + ck_pr_fence_load(); + request = ck_pr_load_uint(&ticket->next); + ck_pr_fence_load(); + return ck_pr_load_uint(&ticket->position) != request; +} + CK_CC_INLINE static void ck_spinlock_ticket_lock(struct ck_spinlock_ticket *ticket) {