scsi_lock.h

来自「newos is new operation system」· C头文件 代码 · 共 91 行

H
91
字号
/*** Copyright 2002, Thomas Kurschel. All rights reserved.** Distributed under the terms of the NewOS License.*/#ifndef __SCSI_LOCK_H__#define __SCSI_LOCK_H__#include <kernel/smp.h>#include <kernel/int.h>#include <kernel/lock.h>#include <kernel/sem.h>#define LOCK_MAX_COUNT 2000000000typedef struct spinlock_irq {	spinlock_t lock;} spinlock_irq;static inline void spinlock_irq_init( spinlock_irq *lock ){	lock->lock = 0;}static inline void acquire_spinlock_irq( spinlock_irq *lock ){	int_disable_interrupts();	acquire_spinlock( &lock->lock );}static inline void release_spinlock_irq( spinlock_irq *lock ){	release_spinlock( &lock->lock );	int_restore_interrupts();}// general: upon lock, you have to lock a global lock and check that// the referred object is registeredtypedef struct ref_lock {	int nonexcl_count;	sem_id nonexcl_lock;	int excl_count;	sem_id excl_lock;	sem_id excl_mutex_lock;	sem_id destroy_lock;	bool destroying;} ref_lock;// must own global_lockstatic inline bool ref_lock_nonexcl_lock( ref_lock *lock, mutex *global_lock ){	int non_excl_count;	non_excl_count = atomic_add( &lock->nonexcl_count, 1 );	mutex_unlock( global_lock );	if( non_excl_count >= 0 )		return true;	sem_acquire( lock->nonexcl_lock, 1 );	if( !lock->destroying )		return true;	sem_release( lock->destroy_lock, 1 );	return false;}static inline void ref_lock_nonexcl_unlock( ref_lock *lock ){	if( atomic_add( &lock->nonexcl_count, -1 ) < 0 )		sem_release_etc( lock->excl_lock, 1, SEM_FLAG_NO_RESCHED );}// must own global_lockbool ref_lock_excl_lock( ref_lock *lock, mutex *global_lock );void ref_lock_excl_unlock( ref_lock *lock );// must own exclusive lock and have made sure that noone will try// to lock upon callvoid ref_lock_destroying_object( ref_lock *lock );int ref_lock_init( ref_lock *lock );void ref_lock_uninit( ref_lock *lock );#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?