📄 semaphore.h
字号:
#ifndef _SEMAPHORE_H_#define _SEMAPHORE_H_#include <wait.h>#include <spinlock.h>/* * Implementation of semaphore in Mini-os is simple, because * there are no preemptive threads, the atomicity is guaranteed. */struct semaphore{ int count; struct wait_queue_head wait;};/* * the semaphore definition */struct rw_semaphore { signed long count; spinlock_t wait_lock; struct list_head wait_list; int debug;};#define __SEMAPHORE_INITIALIZER(name, n) \{ \ .count = n, \ .wait = __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \}#define __MUTEX_INITIALIZER(name) \ __SEMAPHORE_INITIALIZER(name,1) #define __DECLARE_SEMAPHORE_GENERIC(name,count) \ struct semaphore name = __SEMAPHORE_INITIALIZER(name,count) #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)static inline void init_SEMAPHORE(struct semaphore *sem, int count){ sem->count = count; init_waitqueue_head(&sem->wait);}#define init_MUTEX(sem) init_SEMAPHORE(sem, 1)static void inline down(struct semaphore *sem){ unsigned long flags; while (1) { wait_event(sem->wait, sem->count > 0); local_irq_save(flags); if (sem->count > 0) break; local_irq_restore(flags); } sem->count--; local_irq_restore(flags);}static void inline up(struct semaphore *sem){ unsigned long flags; local_irq_save(flags); sem->count++; wake_up(&sem->wait); local_irq_restore(flags);}/* FIXME! Thre read/write semaphores are unimplemented! */static inline void init_rwsem(struct rw_semaphore *sem){ sem->count = 1;}static inline void down_read(struct rw_semaphore *sem){}static inline void up_read(struct rw_semaphore *sem){}static inline void up_write(struct rw_semaphore *sem){}static inline void down_write(struct rw_semaphore *sem){}#endif /* _SEMAPHORE_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -