初版
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
#ifndef SYS_SPINLOCK_H
|
||||
#define SYS_SPINLOCK_H
|
||||
|
||||
#include "typedef.h"
|
||||
//#include "cpu.h"
|
||||
//#include "irq.h"
|
||||
|
||||
struct __spinlock {
|
||||
volatile u32 rwlock;
|
||||
};
|
||||
|
||||
typedef struct __spinlock spinlock_t;
|
||||
|
||||
extern void local_irq_disable(void);
|
||||
extern void local_irq_enable(void);
|
||||
|
||||
|
||||
#define preempt_disable() \
|
||||
local_irq_disable()
|
||||
|
||||
#define preempt_enable() \
|
||||
local_irq_enable()
|
||||
|
||||
|
||||
#if CPU_CORE_NUM > 1
|
||||
|
||||
#define spin_acquire(lock) \
|
||||
do { \
|
||||
arch_spin_lock(lock); \
|
||||
}while(0)
|
||||
|
||||
#define spin_release(lock) \
|
||||
do { \
|
||||
arch_spin_unlock(lock); \
|
||||
}while(0)
|
||||
|
||||
#else
|
||||
|
||||
#define spin_acquire(lock) \
|
||||
do { \
|
||||
}while(0)
|
||||
|
||||
|
||||
#define spin_release(lock) \
|
||||
do { \
|
||||
}while(0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#define DEFINE_SPINLOCK(x) \
|
||||
spinlock_t x = { .rwlock = 0 }
|
||||
|
||||
|
||||
static inline void spin_lock_init(spinlock_t *lock)
|
||||
{
|
||||
lock->rwlock = 0;
|
||||
}
|
||||
|
||||
static inline void spin_lock(spinlock_t *lock)
|
||||
{
|
||||
preempt_disable();
|
||||
spin_acquire(lock);
|
||||
}
|
||||
|
||||
|
||||
static inline void spin_unlock(spinlock_t *lock)
|
||||
{
|
||||
spin_release(lock);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user