亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rwsem.c

?? 嵌入式系統(tǒng)設計與實例開發(fā)實驗教材二源碼 多線程應用程序設計 串行端口程序設計 AD接口實驗 CAN總線通信實驗 GPS通信實驗 Linux內(nèi)核移植與編譯實驗 IC卡讀寫實驗 SD驅(qū)動使
?? C
字號:
/* rwsem.c: R/W semaphores: contention handling functions * * Written by David Howells (dhowells@redhat.com). * Derived from arch/i386/kernel/semaphore.c */#include <linux/rwsem.h>#include <linux/sched.h>#include <linux/module.h>struct rwsem_waiter {	struct list_head	list;	struct task_struct	*task;	unsigned int		flags;#define RWSEM_WAITING_FOR_READ	0x00000001#define RWSEM_WAITING_FOR_WRITE	0x00000002};#if RWSEM_DEBUG#undef rwsemtracevoid rwsemtrace(struct rw_semaphore *sem, const char *str){	printk("sem=%p\n",sem);	printk("(sem)=%08lx\n",sem->count);	if (sem->debug)		printk("[%d] %s({%08lx})\n",current->pid,str,sem->count);}#endif/* * handle the lock being released whilst there are processes blocked on it that can now run * - if we come here, then: *   - the 'active part' of the count (&0x0000ffff) reached zero but has been re-incremented *   - the 'waiting part' of the count (&0xffff0000) is negative (and will still be so) *   - there must be someone on the queue * - the spinlock must be held by the caller * - woken process blocks are discarded from the list after having flags zeroised */static inline struct rw_semaphore *__rwsem_do_wake(struct rw_semaphore *sem){	struct rwsem_waiter *waiter;	struct list_head *next;	signed long oldcount;	int woken, loop;	rwsemtrace(sem,"Entering __rwsem_do_wake");	/* only wake someone up if we can transition the active part of the count from 0 -> 1 */ try_again:	oldcount = rwsem_atomic_update(RWSEM_ACTIVE_BIAS,sem) - RWSEM_ACTIVE_BIAS;	if (oldcount & RWSEM_ACTIVE_MASK)		goto undo;	waiter = list_entry(sem->wait_list.next,struct rwsem_waiter,list);	/* try to grant a single write lock if there's a writer at the front of the queue	 * - note we leave the 'active part' of the count incremented by 1 and the waiting part	 *   incremented by 0x00010000	 */	if (!(waiter->flags & RWSEM_WAITING_FOR_WRITE))		goto readers_only;	list_del(&waiter->list);	waiter->flags = 0;	wake_up_process(waiter->task);	goto out;	/* grant an infinite number of read locks to the readers at the front of the queue	 * - note we increment the 'active part' of the count by the number of readers (less one	 *   for the activity decrement we've already done) before waking any processes up	 */ readers_only:	woken = 0;	do {		woken++;		if (waiter->list.next==&sem->wait_list)			break;		waiter = list_entry(waiter->list.next,struct rwsem_waiter,list);	} while (waiter->flags & RWSEM_WAITING_FOR_READ);	loop = woken;	woken *= RWSEM_ACTIVE_BIAS-RWSEM_WAITING_BIAS;	woken -= RWSEM_ACTIVE_BIAS;	rwsem_atomic_add(woken,sem);	next = sem->wait_list.next;	for (; loop>0; loop--) {		waiter = list_entry(next,struct rwsem_waiter,list);		next = waiter->list.next;		waiter->flags = 0;		wake_up_process(waiter->task);	}	sem->wait_list.next = next;	next->prev = &sem->wait_list; out:	rwsemtrace(sem,"Leaving __rwsem_do_wake");	return sem;	/* undo the change to count, but check for a transition 1->0 */ undo:	if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS,sem)!=0)		goto out;	goto try_again;}/* * wait for a lock to be granted */static inline struct rw_semaphore *rwsem_down_failed_common(struct rw_semaphore *sem,								 struct rwsem_waiter *waiter,								 signed long adjustment){	struct task_struct *tsk = current;	signed long count;	set_task_state(tsk,TASK_UNINTERRUPTIBLE);	/* set up my own style of waitqueue */	spin_lock(&sem->wait_lock);	waiter->task = tsk;	list_add_tail(&waiter->list,&sem->wait_list);	/* note that we're now waiting on the lock, but no longer actively read-locking */	count = rwsem_atomic_update(adjustment,sem);	/* if there are no longer active locks, wake the front queued process(es) up	 * - it might even be this process, since the waker takes a more active part	 */	if (!(count & RWSEM_ACTIVE_MASK))		sem = __rwsem_do_wake(sem);	spin_unlock(&sem->wait_lock);	/* wait to be given the lock */	for (;;) {		if (!waiter->flags)			break;		schedule();		set_task_state(tsk, TASK_UNINTERRUPTIBLE);	}	tsk->state = TASK_RUNNING;	return sem;}/* * wait for the read lock to be granted */struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem){	struct rwsem_waiter waiter;	rwsemtrace(sem,"Entering rwsem_down_read_failed");	waiter.flags = RWSEM_WAITING_FOR_READ;	rwsem_down_failed_common(sem,&waiter,RWSEM_WAITING_BIAS-RWSEM_ACTIVE_BIAS);	rwsemtrace(sem,"Leaving rwsem_down_read_failed");	return sem;}/* * wait for the write lock to be granted */struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem){	struct rwsem_waiter waiter;	rwsemtrace(sem,"Entering rwsem_down_write_failed");	waiter.flags = RWSEM_WAITING_FOR_WRITE;	rwsem_down_failed_common(sem,&waiter,-RWSEM_ACTIVE_BIAS);	rwsemtrace(sem,"Leaving rwsem_down_write_failed");	return sem;}/* * handle waking up a waiter on the semaphore * - up_read has decremented the active part of the count if we come here */struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem){	rwsemtrace(sem,"Entering rwsem_wake");	spin_lock(&sem->wait_lock);	/* do nothing if list empty */	if (!list_empty(&sem->wait_list))		sem = __rwsem_do_wake(sem);	spin_unlock(&sem->wait_lock);	rwsemtrace(sem,"Leaving rwsem_wake");	return sem;}EXPORT_SYMBOL_NOVERS(rwsem_down_read_failed);EXPORT_SYMBOL_NOVERS(rwsem_down_write_failed);EXPORT_SYMBOL_NOVERS(rwsem_wake);#if RWSEM_DEBUGEXPORT_SYMBOL(rwsemtrace);#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
三级久久三级久久久| 精品福利一区二区三区免费视频| 国产嫩草影院久久久久| 国产精品99久久久久久久vr| 久久美女艺术照精彩视频福利播放| 国产一区二区三区高清播放| 久久久精品欧美丰满| 国产福利一区二区三区视频 | 91麻豆免费观看| 亚洲精品国产精品乱码不99 | 亚洲精品一区在线观看| 国产精品自产自拍| 中文字幕一区二区三区在线不卡| 91亚洲男人天堂| 亚洲成人一区在线| 日韩欧美一级在线播放| 国产精品18久久久久久久网站| 中文幕一区二区三区久久蜜桃| 91丨porny丨蝌蚪视频| 婷婷久久综合九色综合绿巨人| 日韩免费高清电影| k8久久久一区二区三区 | 久久精品视频网| 91色porny在线视频| 性做久久久久久| 久久综合色婷婷| 91蝌蚪porny九色| 久久精品国产免费看久久精品| 国产欧美一区二区三区鸳鸯浴| 91麻豆国产在线观看| 久久99热狠狠色一区二区| 中文字幕的久久| 9191精品国产综合久久久久久 | 久久久青草青青国产亚洲免观| 99精品视频在线播放观看| 日韩精品电影在线观看| 国产日本亚洲高清| 欧美欧美欧美欧美首页| 国产iv一区二区三区| 日韩激情在线观看| 国产精品人成在线观看免费 | 91精品国产一区二区| 成人国产精品免费观看动漫| 午夜伦欧美伦电影理论片| 中日韩免费视频中文字幕| 91精品国产综合久久蜜臀| 99久久精品免费看国产免费软件| 免费精品视频在线| 亚洲综合视频网| 国产精品久久三| 精品理论电影在线| 欧美浪妇xxxx高跟鞋交| 91极品美女在线| 懂色av中文一区二区三区| 日韩国产一区二| 亚洲综合色视频| 国产精品大尺度| 久久久一区二区| 日韩一区二区精品在线观看| 一本色道亚洲精品aⅴ| 风间由美一区二区三区在线观看 | 99精品桃花视频在线观看| 国内精品国产三级国产a久久| 亚洲一本大道在线| 一区二区在线观看免费| 国产精品久久久久精k8| 久久久九九九九| 26uuu久久天堂性欧美| 91精品国产综合久久香蕉麻豆| 欧美三区在线观看| 91久久奴性调教| 在线中文字幕一区| 色吧成人激情小说| 91视频xxxx| 日本精品视频一区二区三区| 不卡的av在线播放| 成人国产精品免费网站| 不卡区在线中文字幕| 不卡一区在线观看| 91亚洲国产成人精品一区二三| 国产乱妇无码大片在线观看| 精彩视频一区二区三区| 天天操天天色综合| 日韩福利视频导航| 另类小说欧美激情| 国产一区在线精品| 日韩三级在线免费观看| 欧美一区二区国产| 精品欧美久久久| 久久精品人人做人人爽97| 国产亚洲福利社区一区| 亚洲欧美一区二区视频| 亚洲久草在线视频| 五月激情六月综合| 麻豆91精品91久久久的内涵| 另类小说图片综合网| 大白屁股一区二区视频| 成人91在线观看| 91豆麻精品91久久久久久| 欧美区视频在线观看| 精品日韩在线一区| 国产精品视频免费| 亚洲图片欧美色图| 男女男精品网站| 成人精品视频网站| 色拍拍在线精品视频8848| 欧美日韩国产123区| 欧美大胆人体bbbb| 国产精品成人免费精品自在线观看| 亚洲天堂福利av| 免费成人在线观看| www.亚洲人| 91精品国产欧美一区二区| 精品国产百合女同互慰| 亚洲欧美视频一区| 蜜臀av一区二区| 97精品国产露脸对白| 欧美一区二区视频观看视频| 欧美激情在线观看视频免费| 亚洲一区在线看| 国产一区二区三区久久悠悠色av| 99精品久久免费看蜜臀剧情介绍| 欧美片在线播放| 国产精品久久久久婷婷二区次| 亚洲成人激情综合网| 丰满少妇在线播放bd日韩电影| 欧美亚洲尤物久久| 中文文精品字幕一区二区| 无码av免费一区二区三区试看 | 国产99久久精品| 91久久一区二区| 国产欧美日韩另类视频免费观看| 亚洲最大成人综合| 粉嫩13p一区二区三区| 欧美一级二级在线观看| 亚洲精品免费播放| 国产精品一区免费视频| 欧美嫩在线观看| 亚洲精品中文在线观看| 国产不卡在线一区| 欧美电影免费观看完整版| 亚洲综合久久av| 成人激情午夜影院| 久久免费视频色| 欧美aaa在线| 欧美视频你懂的| 中文字幕中文字幕一区| 国产一区二区三区四区五区入口 | 欧美一区二区三区免费观看视频| 国产精品九色蝌蚪自拍| 国产麻豆精品久久一二三| 欧美一级片在线看| 亚洲超丰满肉感bbw| 色综合久久综合网97色综合 | 欧美精品日日鲁夜夜添| 一区二区视频在线| 91在线你懂得| 国产精品不卡一区| 成人不卡免费av| 国产精品久久影院| 成人丝袜视频网| 亚洲国产成人一区二区三区| 国产在线不卡一区| 精品对白一区国产伦| 久久精品99国产精品| 欧美一级日韩免费不卡| 日本欧美在线观看| 欧美电影免费观看完整版| 久久97超碰国产精品超碰| 精品国产精品网麻豆系列 | 夜夜嗨av一区二区三区四季av| www.综合网.com| 最新热久久免费视频| 不卡的av网站| 亚洲精品国久久99热| 色诱视频网站一区| 亚洲一区在线观看网站| 欧美美女一区二区在线观看| 婷婷一区二区三区| 日韩精品一区二区三区在线| 激情综合网天天干| 国产日本欧美一区二区| 91视频.com| 天天av天天翘天天综合网 | 国产精品电影一区二区| 一本一道波多野结衣一区二区| 亚洲国产一区二区在线播放| 欧美肥妇毛茸茸| 国产原创一区二区三区| 国产精品人妖ts系列视频 | 欧美精品丝袜中出| 日韩电影在线免费观看| 久久欧美中文字幕| 99精品视频一区二区| 亚洲综合色噜噜狠狠| 日韩欧美成人激情| 成人av动漫在线| 肉肉av福利一精品导航| 久久久久久久久免费| 色综合久久久久久久久|