add exercise of lab5 spoc discussion
This commit is contained in:
57
related_info/lab5/lab5-spoc-discuss/kern/sync/sync.h
Normal file
57
related_info/lab5/lab5-spoc-discuss/kern/sync/sync.h
Normal file
@@ -0,0 +1,57 @@
|
||||
#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__ */
|
||||
|
||||
Reference in New Issue
Block a user