#ifndef SPINLOCKS_H #define SPINLOCKS_H #define NR_CPUS 4 #define NR_RESOURCES sizeof(resource_mask_t)*8 extern int events; typedef enum {read_req, write_req} request_type; typedef enum {waiting, acquired, entitled} request_status; typedef unsigned long resource_mask_t; typedef struct request_struct { resource_mask_t resources; request_status status; request_type type; } request; typedef struct spinlock_struct { unsigned int serving; unsigned int next_ticket; } spinlock_t; typedef struct rwrnlp_struct { resource_mask_t unavailable; resource_mask_t wentitled; resource_mask_t wlocked; int enter[NR_CPUS]; int leave[NR_CPUS]; request requests[NR_CPUS][2]; int curr[NR_CPUS]; request* wqueue[NR_RESOURCES][NR_CPUS]; unsigned int whead[NR_RESOURCES]; unsigned int wtail[NR_RESOURCES]; spinlock_t *enqueue; spinlock_t *state; } rwrnlp; void spin_init(spinlock_t *lock); void spin_lock(spinlock_t *lock); void spin_unlock(spinlock_t *lock); void rwrnlp_init(rwrnlp *lock); long rwrnlp_read_lock(rwrnlp *lock, resource_mask_t resources, int processor); long rwrnlp_write_lock(rwrnlp *lock, resource_mask_t resources, int processor); long rwrnlp_read_unlock(rwrnlp *lock, int processor); long rwrnlp_write_unlock(rwrnlp *lock, int processor); #endif //SPINLOCKS_H