|  | /* Copyright (c) 2013 The Regents of the University of California | 
|  | * Barret Rhoden <brho@cs.berkeley.edu> | 
|  | * Kevin Klues <klueska@cs.berkeley.edu> | 
|  | * | 
|  | * Spinlocks and Spin-PDR locks (preemption detection/recovery) | 
|  | * | 
|  | * See LICENSE for details. */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include <parlib/arch/arch.h> | 
|  | #include <parlib/arch/atomic.h> | 
|  |  | 
|  | __BEGIN_DECLS | 
|  |  | 
|  | #define SPINLOCK_INITIALIZER {FALSE} | 
|  |  | 
|  | typedef struct { | 
|  | bool locked; | 
|  | } spinlock_t; | 
|  |  | 
|  | void spinlock_init(spinlock_t *lock); | 
|  | bool spinlock_trylock(spinlock_t *lock); | 
|  | void spinlock_lock(spinlock_t *lock); | 
|  | void spinlock_unlock(spinlock_t *lock); | 
|  | bool spinlock_locked(spinlock_t *lock); | 
|  |  | 
|  | # define SPINPDR_UNLOCKED ((uint32_t)-1) | 
|  |  | 
|  | struct spin_pdr_lock { | 
|  | uint32_t lock; | 
|  | }; | 
|  | # define SPINPDR_INITIALIZER {SPINPDR_UNLOCKED} | 
|  |  | 
|  | typedef struct spin_pdr_lock spinpdrlock_t; | 
|  |  | 
|  | void spin_pdr_init(struct spin_pdr_lock *pdr_lock); | 
|  | bool spin_pdr_trylock(struct spin_pdr_lock *pdr_lock); | 
|  | void spin_pdr_lock(struct spin_pdr_lock *pdr_lock); | 
|  | void spin_pdr_unlock(struct spin_pdr_lock *pdr_lock); | 
|  | bool spin_pdr_locked(struct spin_pdr_lock *pdr_lock); | 
|  |  | 
|  | __END_DECLS |