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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? sv.c

?? 根據(jù)添加了fs2410平臺(tái)的arch目錄
?? C
字號(hào):
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2000 Silicon Graphics, Inc.  All rights reserved * * This implemenation of synchronization variables is heavily based on * one done by Steve Lord <lord@sgi.com> * * Paul Cassella <pwc@sgi.com> */#include <linux/kernel.h>#include <linux/sched.h>#include <linux/init.h>#include <asm/semaphore.h>#include <asm/hardirq.h>#include <asm/softirq.h>#include <asm/current.h>#include <asm/sn/sv.h>/* Define this to have sv_test() run some simple tests.   kernel_thread() must behave as expected when this is called.  */#undef RUN_SV_TEST#define DEBUG/* Set up some macros so sv_wait(), sv_signal(), and sv_broadcast()   can sanity check interrupt state on architectures where we know   how. */#ifdef DEBUG #define SV_DEBUG_INTERRUPT_STATE #ifdef __mips64  #define SV_TEST_INTERRUPTS_ENABLED(flags) ((flags & 0x1) != 0)  #define SV_TEST_INTERRUPTS_DISABLED(flags) ((flags & 0x1) == 0)  #define SV_INTERRUPT_TEST_WORKERS 31 #elif defined(__ia64)  #define SV_TEST_INTERRUPTS_ENABLED(flags) ((flags & 0x4000) != 0)  #define SV_TEST_INTERRUPTS_DISABLED(flags) ((flags & 0x4000) == 0)  #define SV_INTERRUPT_TEST_WORKERS 4 /* simulator's slow */ #else  #undef  SV_DEBUG_INTERRUPT_STATE  #define SV_INTERRUPT_TEST_WORKERS 4 /* reasonable? default. */ #endif /* __mips64 */#endif /* DEBUG *//* XXX FIXME hack hack hack.  Our mips64 tree is from before the   switch to WQ_FLAG_EXCLUSIVE, and our ia64 tree is from after it. */#ifdef TASK_EXCLUSIVE  #undef EXCLUSIVE_IN_QUEUE#else  #define EXCLUSIVE_IN_QUEUE  #define TASK_EXCLUSIVE 0 /* for the set_current_state() in sv_wait() */#endifstatic inline void sv_lock(sv_t *sv) {	spin_lock(&sv->sv_lock);}static inline void sv_unlock(sv_t *sv) {	spin_unlock(&sv->sv_lock);}/* up() is "extern inline", so we can't pass its address to sv_wait.   Use this function's address instead. */static void up_wrapper(struct semaphore *sem) {	up(sem);}/* spin_unlock() is sometimes a macro. */static void spin_unlock_wrapper(spinlock_t *s) {	spin_unlock(s);}/* XXX Perhaps sv_wait() should do the switch() each time and avoid   the extra indirection and the need for the _wrapper functions? */static inline void sv_set_mon_type(sv_t *sv, int type) {	switch (type) {	case SV_MON_SPIN:		sv->sv_mon_unlock_func =		  (sv_mon_unlock_func_t)spin_unlock_wrapper;		break;	case SV_MON_SEMA:		sv->sv_mon_unlock_func =		  (sv_mon_unlock_func_t)up_wrapper;		if(sv->sv_flags & SV_INTS) {			printk(KERN_ERR "sv_set_mon_type: The monitor lock "			       "cannot be shared with interrupts if it is a "			       "semaphore!\n");			BUG();		}		if(sv->sv_flags & SV_BHS) {			printk(KERN_ERR "sv_set_mon_type: The monitor lock "			       "cannot be shared with bottom-halves if it is "			       "a semaphore!\n");			BUG();		}		break;#if 0 	/*	 * If needed, and will need to think about interrupts.  This	 * may be needed, for example, if someone wants to use sv's	 * with something like dev_base; writers need to hold two	 * locks. 	 */	case SV_MON_CUSTOM: 		{		struct sv_mon_custom *c = lock;		sv->sv_mon_unlock_func = c->sv_mon_unlock_func;		sv->sv_mon_lock        = c->sv_mon_lock;		break;		}#endif			default:		printk(KERN_ERR "sv_set_mon_type: unknown type %d (0x%x)! "		       "(flags 0x%x)\n", type, type, sv->sv_flags);		BUG();		break;	}	sv->sv_flags |= type;}static inline void sv_set_ord(sv_t *sv, int ord) {	if (!ord)		ord = SV_ORDER_DEFAULT;	if (ord != SV_ORDER_FIFO && ord != SV_ORDER_LIFO) {		printk(KERN_EMERG "sv_set_ord: unknown order %d (0x%x)! ",		       ord, ord);		BUG();	}	sv->sv_flags |= ord;}void sv_init(sv_t *sv, sv_mon_lock_t *lock, int flags) {	int ord = flags & SV_ORDER_MASK;	int type = flags & SV_MON_MASK;	/* Copy all non-order, non-type flags */	sv->sv_flags = (flags & ~(SV_ORDER_MASK | SV_MON_MASK));	if((sv->sv_flags & (SV_INTS | SV_BHS)) == (SV_INTS | SV_BHS)) {	  printk(KERN_ERR "sv_init: do not set both SV_INTS and SV_BHS, only SV_INTS.\n");	  BUG();	}	sv_set_ord(sv, ord);	sv_set_mon_type(sv, type);	/* If lock is NULL, we'll get it from sv_wait_compat() (and           ignore it in sv_signal() and sv_broadcast()). */	sv->sv_mon_lock = lock;	spin_lock_init(&sv->sv_lock);	init_waitqueue_head(&sv->sv_waiters);}/* * The associated lock must be locked on entry.  It is unlocked on return. * * Return values: * * n < 0 : interrupted,  -n jiffies remaining on timeout, or -1 if timeout == 0 * n = 0 : timeout expired * n > 0 : sv_signal()'d, n jiffies remaining on timeout, or 1 if timeout == 0 */signed long sv_wait(sv_t *sv, int sv_wait_flags, unsigned long timeout) {	DECLARE_WAITQUEUE( wait, current );	unsigned long flags;	signed long ret = 0;#ifdef SV_DEBUG_INTERRUPT_STATE	{	unsigned long flags;	__save_flags(flags);	if(sv->sv_flags & SV_INTS) {		if(SV_TEST_INTERRUPTS_ENABLED(flags)) {			printk(KERN_ERR "sv_wait: SV_INTS and interrupts "			       "enabled (flags: 0x%lx)\n", flags);			BUG();		}	} else {		if (SV_TEST_INTERRUPTS_DISABLED(flags)) {			printk(KERN_WARNING "sv_wait: !SV_INTS and interrupts "			       "disabled! (flags: 0x%lx)\n", flags);		}	}	}#endif  /* SV_DEBUG_INTERRUPT_STATE */	sv_lock(sv);	sv->sv_mon_unlock_func(sv->sv_mon_lock);	/* Add ourselves to the wait queue and set the state before	 * releasing the sv_lock so as to avoid racing with the	 * wake_up() in sv_signal() and sv_broadcast(). 	 */	/* don't need the _irqsave part, but there is no wq_write_lock() */	wq_write_lock_irqsave(&sv->sv_waiters.lock, flags);#ifdef EXCLUSIVE_IN_QUEUE	wait.flags |= WQ_FLAG_EXCLUSIVE;#endif	switch(sv->sv_flags & SV_ORDER_MASK) {	case SV_ORDER_FIFO:		__add_wait_queue_tail(&sv->sv_waiters, &wait);		break;	case SV_ORDER_FILO:		__add_wait_queue(&sv->sv_waiters, &wait);		break;	default:		printk(KERN_ERR "sv_wait: unknown order!  (sv: 0x%p, flags: 0x%x)\n",					sv, sv->sv_flags);		BUG();	}	wq_write_unlock_irqrestore(&sv->sv_waiters.lock, flags);	if(sv_wait_flags & SV_WAIT_SIG)		set_current_state(TASK_EXCLUSIVE | TASK_INTERRUPTIBLE  );	else		set_current_state(TASK_EXCLUSIVE | TASK_UNINTERRUPTIBLE);	spin_unlock(&sv->sv_lock);	if(sv->sv_flags & SV_INTS)		local_irq_enable();	else if(sv->sv_flags & SV_BHS)		local_bh_enable();	if (timeout)		ret = schedule_timeout(timeout);	else		schedule();	if(current->state != TASK_RUNNING) /* XXX Is this possible? */ {		printk(KERN_ERR "sv_wait: state not TASK_RUNNING after "		       "schedule().\n");		set_current_state(TASK_RUNNING);	}	remove_wait_queue(&sv->sv_waiters, &wait);	/* Return cases:	   - woken by a sv_signal/sv_broadcast	   - woken by a signal	   - woken by timeout expiring	*/	/* XXX This isn't really accurate; we may have been woken           before the signal anyway.... */	if(signal_pending(current))		return timeout ? -ret : -1;	return timeout ? ret : 1;}void sv_signal(sv_t *sv) {	/* If interrupts can acquire this lock, they can also acquire the	   sv_mon_lock, which we must already have to have called this, so	   interrupts must be disabled already.  If interrupts cannot	   contend for this lock, we don't have to worry about it. */#ifdef SV_DEBUG_INTERRUPT_STATE	if(sv->sv_flags & SV_INTS) {		unsigned long flags;		__save_flags(flags);		if(SV_TEST_INTERRUPTS_ENABLED(flags))			printk(KERN_ERR "sv_signal: SV_INTS and "			"interrupts enabled! (flags: 0x%lx)\n", flags);	}#endif /* SV_DEBUG_INTERRUPT_STATE */	sv_lock(sv);	wake_up(&sv->sv_waiters);	sv_unlock(sv);}void sv_broadcast(sv_t *sv) {#ifdef SV_DEBUG_INTERRUPT_STATE	if(sv->sv_flags & SV_INTS) {		unsigned long flags;		__save_flags(flags);		if(SV_TEST_INTERRUPTS_ENABLED(flags))			printk(KERN_ERR "sv_broadcast: SV_INTS and "			       "interrupts enabled! (flags: 0x%lx)\n", flags);	}#endif /* SV_DEBUG_INTERRUPT_STATE */	sv_lock(sv);	wake_up_all(&sv->sv_waiters);	sv_unlock(sv);}void sv_destroy(sv_t *sv) {	if(!spin_trylock(&sv->sv_lock)) {		printk(KERN_ERR "sv_destroy: someone else has sv 0x%p locked!\n", sv);		BUG();	}	/* XXX Check that the waitqueue is empty? 	       Mark the sv destroyed?	*/}#ifdef RUN_SV_TESTstatic DECLARE_MUTEX_LOCKED(talkback);static DECLARE_MUTEX_LOCKED(sem);sv_t sv;sv_t sv_filo;static int sv_test_1_w(void *arg) {	printk("sv_test_1_w: acquiring spinlock 0x%p...\n", arg);	spin_lock((spinlock_t*)arg);	printk("sv_test_1_w: spinlock acquired, waking sv_test_1_s.\n");	up(&sem);	printk("sv_test_1_w: sv_spin_wait()'ing.\n");	sv_spin_wait(&sv, arg);	printk("sv_test_1_w: talkback.\n");	up(&talkback);	printk("sv_test_1_w: exiting.\n");	return 0;}static int sv_test_1_s(void *arg) {	printk("sv_test_1_s: waiting for semaphore.\n");	down(&sem);	printk("sv_test_1_s: semaphore acquired.  Acquiring spinlock.\n");	spin_lock((spinlock_t*)arg);	printk("sv_test_1_s: spinlock acquired.  sv_signaling.\n");	sv_signal(&sv);	printk("sv_test_1_s: talkback.\n");	up(&talkback);	printk("sv_test_1_s: exiting.\n");	return 0;}static int count;static DECLARE_MUTEX(monitor);static int sv_test_2_w(void *arg) {	int dummy = count++;	sv_t *sv = (sv_t *)arg;	down(&monitor);	up(&talkback);	printk("sv_test_2_w: thread %d started, sv_waiting.\n", dummy);	sv_sema_wait(sv, &monitor);	printk("sv_test_2_w: thread %d woken, exiting.\n", dummy);	up(&sem);	return 0;}static int sv_test_2_s_1(void *arg) {	int i;	sv_t *sv = (sv_t *)arg;	down(&monitor);	for(i = 0; i < 3; i++) {		printk("sv_test_2_s_1: waking one thread.\n");		sv_signal(sv);		down(&sem);	}	printk("sv_test_2_s_1: signaling and broadcasting again.  Nothing should happen.\n");	sv_signal(sv);	sv_broadcast(sv);	sv_signal(sv);	sv_broadcast(sv);	printk("sv_test_2_s_1: talkbacking.\n");	up(&talkback);	up(&monitor);	return 0;}static int sv_test_2_s(void *arg) {	int i;	sv_t *sv = (sv_t *)arg;	down(&monitor);	for(i = 0; i < 3; i++) {		printk("sv_test_2_s: waking one thread (should be %d.)\n", i);		sv_signal(sv);		down(&sem);	}	printk("sv_test_3_s: waking remaining threads with broadcast.\n");	sv_broadcast(sv);	for(; i < 10; i++)		down(&sem);	printk("sv_test_3_s: sending talkback.\n");	up(&talkback);	printk("sv_test_3_s: exiting.\n");	up(&monitor);	return 0;}static void big_test(sv_t *sv) {	int i;	count = 0;	for(i = 0; i < 3; i++) {		printk("big_test: spawning thread %d.\n", i);		kernel_thread(sv_test_2_w, sv, 0);		down(&talkback);	}	printk("big_test: spawning first wake-up thread.\n");	kernel_thread(sv_test_2_s_1, sv, 0);	down(&talkback);	printk("big_test: talkback happened.\n");	for(i = 3; i < 13; i++) {		printk("big_test: spawning thread %d.\n", i);		kernel_thread(sv_test_2_w, sv, 0);		down(&talkback);	}	printk("big_test: spawning wake-up thread.\n");	kernel_thread(sv_test_2_s, sv, 0);	down(&talkback);}sv_t int_test_sv;spinlock_t int_test_spin = SPIN_LOCK_UNLOCKED;int int_test_ready;static int irqtestcount;static int interrupt_test_worker(void *unused) {	int id = ++irqtestcount;	int it = 0;			unsigned long flags, flags2;	printk("ITW: thread %d started.\n", id);	while(1) {		__save_flags(flags2);		if(jiffies % 3) {			printk("ITW %2d %5d: irqsaving          (%lx)\n", id, it, flags2);			spin_lock_irqsave(&int_test_spin, flags);		} else {			printk("ITW %2d %5d: spin_lock_irqing   (%lx)\n", id, it, flags2);			spin_lock_irq(&int_test_spin);		}		__save_flags(flags2);		printk("ITW %2d %5d: locked, sv_waiting (%lx).\n", id, it, flags2);		sv_wait(&int_test_sv, 0, 0);		__save_flags(flags2);		printk("ITW %2d %5d: wait finished      (%lx), pausing\n", id, it, flags2);		set_current_state(TASK_INTERRUPTIBLE);		schedule_timeout(jiffies & 0xf);		if(current->state != TASK_RUNNING)		  printk("ITW:  current->state isn't RUNNING after schedule!\n");		it++;	}}static void interrupt_test(void) {	int i;	printk("interrupt_test: initing sv.\n");	sv_init(&int_test_sv, &int_test_spin, SV_MON_SPIN | SV_INTS);	for(i = 0; i < SV_INTERRUPT_TEST_WORKERS; i++) {		printk("interrupt_test: starting test thread %d.\n", i);		kernel_thread(interrupt_test_worker, 0, 0);	}	printk("interrupt_test: done with init part.\n");	int_test_ready = 1;}int sv_test(void) {	spinlock_t s = SPIN_LOCK_UNLOCKED;	sv_init(&sv, &s, SV_MON_SPIN);	printk("sv_test: starting sv_test_1_w.\n");	kernel_thread(sv_test_1_w, &s, 0);	printk("sv_test: starting sv_test_1_s.\n");	kernel_thread(sv_test_1_s, &s, 0);	printk("sv_test: waiting for talkback.\n");	down(&talkback); down(&talkback);	printk("sv_test: talkback happened, sv_destroying.\n");	sv_destroy(&sv);	count = 0;	printk("sv_test: beginning big_test on sv.\n");	sv_init(&sv, &monitor, SV_MON_SEMA);	big_test(&sv);	sv_destroy(&sv);	printk("sv_test: beginning big_test on sv_filo.\n");	sv_init(&sv_filo, &monitor, SV_MON_SEMA | SV_ORDER_FILO);	big_test(&sv_filo);	sv_destroy(&sv_filo);	interrupt_test();	printk("sv_test: done.\n");	return 0;}__initcall(sv_test);#endif /* RUN_SV_TEST */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲自拍都市欧美小说| av网站免费线看精品| 亚洲精品综合在线| 中文字幕巨乱亚洲| 国产拍欧美日韩视频二区| 国产欧美一区二区精品婷婷| 国产亚洲欧美日韩在线一区| 26uuu国产电影一区二区| 国产亚洲精品久| 中文字幕亚洲综合久久菠萝蜜| 久久久天堂av| 国产精品不卡在线观看| 最近中文字幕一区二区三区| 亚洲女女做受ⅹxx高潮| 亚洲国产一区二区三区| 开心九九激情九九欧美日韩精美视频电影 | 欧美高清视频www夜色资源网| 制服丝袜国产精品| 精品粉嫩aⅴ一区二区三区四区| 久久亚洲二区三区| 亚洲欧洲成人av每日更新| 一区二区三区中文在线观看| 日韩黄色片在线观看| 国产一区日韩二区欧美三区| 成人动漫中文字幕| 欧美色精品在线视频| 久久综合九色欧美综合狠狠| 最新中文字幕一区二区三区| 天天色综合天天| 国产宾馆实践打屁股91| 91在线视频观看| 日韩欧美一级精品久久| 一区免费观看视频| 免费成人深夜小野草| 成人激情动漫在线观看| 欧美三级三级三级爽爽爽| 久久综合久久鬼色| 亚洲成av人片一区二区梦乃| 国产乱码精品一区二区三| 欧美亚一区二区| 伊人夜夜躁av伊人久久| 亚洲免费观看在线观看| 久久久久久久久久久黄色| 亚洲特黄一级片| 欧美一区二区大片| 亚洲精品乱码久久久久久| 精品制服美女久久| 欧美三区在线观看| 亚洲视频免费看| 精品一区二区成人精品| 欧美猛男gaygay网站| 国产亚洲1区2区3区| 人妖欧美一区二区| 精品视频一区三区九区| 一区二区三区波多野结衣在线观看| 日本视频一区二区三区| 欧美这里有精品| 亚洲欧美日韩在线不卡| 国产999精品久久久久久| 日韩视频一区二区| 天天综合天天综合色| 色婷婷综合久久久中文一区二区| 国产日韩欧美一区二区三区乱码 | 男女激情视频一区| 色婷婷精品大在线视频| 中文字幕在线一区免费| 国产成人免费9x9x人网站视频| 日韩欧美精品三级| 奇米综合一区二区三区精品视频| 制服丝袜亚洲色图| 丝袜国产日韩另类美女| 欧美日韩国产一二三| 亚洲国产精品影院| 在线播放中文字幕一区| 日本最新不卡在线| 日韩一区二区三| 免费xxxx性欧美18vr| 欧美不卡一区二区三区| 精久久久久久久久久久| 精品国产不卡一区二区三区| 国产在线精品一区二区夜色| 精品国产网站在线观看| 国产成人在线视频播放| 国产精品视频一区二区三区不卡 | 午夜欧美在线一二页| 97久久精品人人做人人爽50路| 中文字幕在线观看一区| 国产另类ts人妖一区二区| 色哟哟精品一区| 日韩免费视频一区| 日韩国产欧美在线播放| 国产99久久久国产精品| 色婷婷综合久久久久中文一区二区| 喷水一区二区三区| 亚洲影院理伦片| 免费av网站大全久久| 国产一区日韩二区欧美三区| 玉米视频成人免费看| 天天爽夜夜爽夜夜爽精品视频| 欧美日韩精品一区二区| 成人伦理片在线| 日本一区二区成人| 国产suv精品一区二区三区| www.综合网.com| 日韩一卡二卡三卡四卡| 久久99精品国产麻豆婷婷洗澡| 91在线观看污| 国产午夜精品久久久久久免费视| 日本一二三不卡| 亚洲一二三区不卡| 欧美丰满高潮xxxx喷水动漫| 视频在线在亚洲| 日韩午夜激情电影| 成人黄色片在线观看| 亚洲一区在线电影| 日韩三级精品电影久久久| 美女网站视频久久| 国产精品美日韩| 在线观看国产日韩| 美女脱光内衣内裤视频久久网站 | xvideos.蜜桃一区二区| 91黄色小视频| 久久亚洲二区三区| 国产麻豆精品视频| 国产片一区二区| 欧美日韩一级黄| 国产欧美一区二区三区网站| 韩国欧美国产1区| 亚洲电影视频在线| 国产精品剧情在线亚洲| 日韩一级高清毛片| 欧美丝袜丝交足nylons| 成人美女在线视频| 国产精品18久久久| 久久精品国产免费看久久精品| 亚洲日本一区二区| 国产目拍亚洲精品99久久精品| 51久久夜色精品国产麻豆| 欧美亚日韩国产aⅴ精品中极品| 国产又黄又大久久| 欧美日韩一区二区电影| 国产精品久久久久婷婷二区次| 亚洲 欧美综合在线网络| 日韩一区有码在线| 国产日韩欧美精品在线| 精品国产乱码久久| 欧美日韩在线播放一区| 欧美视频完全免费看| 色综合久久综合| 色婷婷精品久久二区二区蜜臀av | 午夜国产不卡在线观看视频| 亚洲精品大片www| 亚洲男帅同性gay1069| 国产精品久久精品日日| 国产精品成人免费 | 欧美日韩在线观看一区二区| 欧美日韩在线电影| 欧美一卡二卡三卡| 日韩免费观看高清完整版| 欧美一区二区高清| 久久久久久久久99精品| 欧美激情中文不卡| 亚洲丝袜自拍清纯另类| 亚洲一级二级三级在线免费观看| 性做久久久久久| 免费在线观看成人| 国产在线不卡一卡二卡三卡四卡| 国产一区二区三区观看| 高清视频一区二区| 色婷婷av久久久久久久| 在线综合视频播放| 久久久99精品久久| 一区二区三区自拍| 男人的天堂亚洲一区| 国产精品一级片| 色哟哟一区二区三区| 欧美一区二区美女| 中文字幕欧美激情| 天堂蜜桃91精品| 国产一区二区三区四| 色综合久久99| 亚洲精品一区二区三区在线观看| 欧美国产日本韩| 爽好久久久欧美精品| 久久99精品一区二区三区三区| 成人亚洲一区二区一| 欧美乱妇20p| 国产精品女主播av| 国产91综合一区在线观看| 中文字幕精品在线不卡| 懂色av中文字幕一区二区三区 | 九九视频精品免费| 青青草精品视频| 在线综合视频播放| 一区二区三区欧美久久| 美女视频一区二区| 久久午夜免费电影| av一区二区久久| 成人性视频免费网站| 欧美丰满少妇xxxbbb|