/* Variations on locks */

/* Lock based on compare and swap */
typedef struct {
    int is_locked;
} cas_lock_t;

/* Lock based on tickets */
typedef struct {
    volatile unsigned long serving;
    unsigned long padding[8];
    unsigned long next_ticket;
} ticket_lock_t;

void cas_lock_init(cas_lock_t *lock);
void cas_lock_lock(cas_lock_t *lock);
void cas_lock_unlock(cas_lock_t *lock);

void ticket_lock_init(ticket_lock_t *lock);
void ticket_lock_lock(ticket_lock_t *lock);
void ticket_lock_unlock(ticket_lock_t *lock);
