⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semaphore-helper.h

📁 嵌入式系统设计与实验教材二源码linux内核移植与编译
💻 H
字号:
#ifndef _M68K_SEMAPHORE_HELPER_H#define _M68K_SEMAPHORE_HELPER_H/* * SMP- and interrupt-safe semaphores helper functions. * * (C) Copyright 1996 Linus Torvalds * * m68k version by Andreas Schwab */#include <linux/config.h>/* * These two _must_ execute atomically wrt each other. */static inline void wake_one_more(struct semaphore * sem){	atomic_inc(&sem->waking);}#ifndef CONFIG_RMW_INSNSextern spinlock_t semaphore_wake_lock;#endifstatic inline int waking_non_zero(struct semaphore *sem){	int ret;#ifndef CONFIG_RMW_INSNS	unsigned long flags;	spin_lock_irqsave(&semaphore_wake_lock, flags);	ret = 0;	if (atomic_read(&sem->waking) > 0) {		atomic_dec(&sem->waking);		ret = 1;	}	spin_unlock_irqrestore(&semaphore_wake_lock, flags);#else	int tmp1, tmp2;	__asm__ __volatile__	  ("1:	movel	%1,%2\n"	   "    jle	2f\n"	   "	subql	#1,%2\n"	   "	casl	%1,%2,%3\n"	   "	jne	1b\n"	   "	moveq	#1,%0\n"	   "2:"	   : "=d" (ret), "=d" (tmp1), "=d" (tmp2)	   : "m" (sem->waking), "0" (0), "1" (sem->waking));#endif	return ret;}/* * waking_non_zero_interruptible: *	1	got the lock *	0	go to sleep *	-EINTR	interrupted */static inline int waking_non_zero_interruptible(struct semaphore *sem,						struct task_struct *tsk){	int ret;#ifndef CONFIG_RMW_INSNS	unsigned long flags;	spin_lock_irqsave(&semaphore_wake_lock, flags);	ret = 0;	if (atomic_read(&sem->waking) > 0) {		atomic_dec(&sem->waking);		ret = 1;	} else if (signal_pending(tsk)) {		atomic_inc(&sem->count);		ret = -EINTR;	}	spin_unlock_irqrestore(&semaphore_wake_lock, flags);#else	int tmp1, tmp2;	__asm__ __volatile__	  ("1:	movel	%1,%2\n"	   "	jle	2f\n"	   "	subql	#1,%2\n"	   "	casl	%1,%2,%3\n"	   "	jne	1b\n"	   "	moveq	#1,%0\n"	   "	jra	%a4\n"	   "2:"	   : "=d" (ret), "=d" (tmp1), "=d" (tmp2)	   : "m" (sem->waking), "i" (&&next), "0" (0), "1" (sem->waking));	if (signal_pending(tsk)) {		atomic_inc(&sem->count);		ret = -EINTR;	}next:#endif	return ret;}/* * waking_non_zero_trylock: *	1	failed to lock *	0	got the lock */static inline int waking_non_zero_trylock(struct semaphore *sem){	int ret;#ifndef CONFIG_RMW_INSNS	unsigned long flags;	spin_lock_irqsave(&semaphore_wake_lock, flags);	ret = 1;	if (atomic_read(&sem->waking) > 0) {		atomic_dec(&sem->waking);		ret = 0;	} else		atomic_inc(&sem->count);	spin_unlock_irqrestore(&semaphore_wake_lock, flags);#else	int tmp1, tmp2;	__asm__ __volatile__	  ("1:	movel	%1,%2\n"	   "    jle	2f\n"	   "	subql	#1,%2\n"	   "	casl	%1,%2,%3\n"	   "	jne	1b\n"	   "	moveq	#0,%0\n"	   "2:"	   : "=d" (ret), "=d" (tmp1), "=d" (tmp2)	   : "m" (sem->waking), "0" (1), "1" (sem->waking));	if (ret)		atomic_inc(&sem->count);#endif	return ret;}#endif

⌨️ 快捷键说明

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