#ifndef __KERN_SYNC_SYNC_H__
|
|
#define __KERN_SYNC_SYNC_H__
|
|
|
|
#include <x86.h>
|
|
#include <intr.h>
|
|
#include <mmu.h>
|
|
#include <assert.h>
|
|
#include <atomic.h>
|
|
#include <sched.h>
|
|
|
|
static inline bool
|
|
__intr_save(void) {
|
|
if (read_eflags() & FL_IF) {
|
|
intr_disable();
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static inline void
|
|
__intr_restore(bool flag) {
|
|
if (flag) {
|
|
intr_enable();
|
|
}
|
|
}
|
|
|
|
#define local_intr_save(x) do { x = __intr_save(); } while (0)
|
|
#define local_intr_restore(x) __intr_restore(x);
|
|
|
|
typedef volatile bool lock_t;
|
|
|
|
static inline void
|
|
lock_init(lock_t *lock) {
|
|
*lock = 0;
|
|
}
|
|
|
|
static inline bool
|
|
try_lock(lock_t *lock) {
|
|
return !test_and_set_bit(0, lock);
|
|
}
|
|
|
|
static inline void
|
|
lock(lock_t *lock) {
|
|
while (!try_lock(lock)) {
|
|
schedule();
|
|
}
|
|
}
|
|
|
|
static inline void
|
|
unlock(lock_t *lock) {
|
|
if (!test_and_clear_bit(0, lock)) {
|
|
panic("Unlock failed.\n");
|
|
}
|
|
}
|
|
|
|
#endif /* !__KERN_SYNC_SYNC_H__ */
|
|
|