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

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

?? rtl_mutex.c

?? fsmlabs的real time linux的內(nèi)核
?? C
字號(hào):
/* * RTLinux mutex and condvar implementation * * Written by Michael Barabanov * Rewritten by Victor Yodaiken after a long delay. * Copyright (C) Finite State Machine Labs Inc., 1999,2000 * Released under the terms of the GPL Version 2 * */#include <rtl_conf.h>#include <rtl_sched.h>#include <rtl_mutex.h>#include <rtl_printf.h>#include <rtl_sync.h>static void rtl_wait_abort(void *data){	pthread_t self = pthread_self();	struct rtl_wait_struct *t;	rtl_wait_t *wait = (rtl_wait_t*) data;	rtl_irqstate_t flags;	rtl_spin_lock_irqsave (wait->p_lock, flags);	if (!wait->queue) {		goto done;	}	if (wait->queue->waiter == self) {		wait->queue = wait->queue->next;		goto done;	}	for (t = wait->queue; t->next; t = t->next) {#ifdef CONFIG_RTL_WAITQUEUE_DEBUG		if (t->magic != RTL_WAIT_MAGIC) {			BUG();		}#endif		if (t->next->waiter == self) {			t->next = t->next->next;			break;		}	}done:	self->abort = 0;	self->abortdata = 0;	rtl_spin_unlock_irqrestore(wait->p_lock, flags);}int rtl_wait_sleep (rtl_wait_t *wait, spinlock_t *lock){	pthread_t self = pthread_self();	struct rtl_wait_struct wait_struct;	self->abort = &rtl_wait_abort;	self->abortdata = wait;#ifdef CONFIG_RTL_WAITQUEUE_DEBUG	wait_struct.magic = RTL_WAIT_MAGIC;#endif	wait_struct.waiter = self;	wait_struct.next = wait->queue;	wait->queue = &wait_struct;	wait->p_lock = lock;	RTL_MARK_SUSPENDED (self);	rtl_spin_unlock(lock);	return rtl_schedule();}int rtl_wait_wakeup (rtl_wait_t *wait){	struct rtl_wait_struct *t;	for (t = wait->queue; t; t = t->next) {#ifdef CONFIG_RTL_WAITQUEUE_DEBUG		if (t->magic != RTL_WAIT_MAGIC) {			BUG();		}#endif		pthread_kill (t->waiter, RTL_SIGNAL_WAKEUP);	}	wait->queue = NULL;	return 0;}int pthread_mutexattr_init(pthread_mutexattr_t *attr){	attr->type = PTHREAD_MUTEX_DEFAULT;	attr->pshared = PTHREAD_PROCESS_SHARED;	attr->protocol = PTHREAD_PRIO_NONE;	attr->prioceiling = sched_get_priority_max(SCHED_FIFO);	return 0;}int pthread_mutex_destroy(pthread_mutex_t *mutex){      mutex->valid = 0;      return 0;}int pthread_mutex_init(pthread_mutex_t *mutex,		    const pthread_mutexattr_t *attr){	pthread_mutexattr_t defattr;        mutex->valid = 1;	mutex->busy = 0;	mutex->flags = 0;	rtl_wait_init(&mutex->wait);	rtl_spin_lock_init (&mutex->lock);	if (!attr) {		pthread_mutexattr_init(&defattr);		attr = &defattr;	}	mutex->type = attr->type;	mutex->protocol = attr->protocol;	mutex->prioceiling = attr->prioceiling;	return 0;}static inline int __pthread_mutex_trylock(pthread_mutex_t *mutex){#ifdef _RTL_POSIX_THREAD_PRIO_PROTECT/* if _RTL_POSIX_THREAD_PRIO_PROTECT, this code is protected by a spinlock */	if (mutex->protocol == PTHREAD_PRIO_PROTECT) {		if (RTL_PRIO(RTL_CURRENT) > mutex->prioceiling) {			return EINVAL;		}				mutex->oldprio = RTL_PRIO (RTL_CURRENT);		RTL_PRIO (RTL_CURRENT) = mutex->prioceiling;	}#endif	if (test_and_set_bit(0, &mutex->busy)) {		return EBUSY;	}	return 0;}int pthread_mutex_trylock(pthread_mutex_t *mutex){	rtl_irqstate_t flags;	int ret;	switch (mutex->type) {		case PTHREAD_MUTEX_SPINLOCK_NP:			rtl_no_interrupts (flags);			if (rtl_spin_trylock(&mutex->lock)) {				rtl_restore_interrupts (flags);				return EBUSY;			} else {				mutex->flags = flags;				return 0;			}			break;		case PTHREAD_MUTEX_NORMAL:		default:#ifdef _RTL_POSIX_THREAD_PRIO_PROTECT			rtl_spin_lock_irqsave (&mutex->lock, flags);#endif			ret = __pthread_mutex_trylock(mutex);#ifdef _RTL_POSIX_THREAD_PRIO_PROTECT			rtl_spin_unlock_irqrestore(&mutex->lock, flags);#endif			return ret;	}}int pthread_mutex_lock(pthread_mutex_t *mutex){	rtl_irqstate_t flags;	int ret;	switch (mutex->type) {		case PTHREAD_MUTEX_SPINLOCK_NP:			rtl_no_interrupts (flags);			rtl_spin_lock (&mutex->lock);			mutex->flags = flags;			return 0;		case PTHREAD_MUTEX_NORMAL:		default:			if (!mutex->valid) {				return EINVAL;			}			rtl_spin_lock_irqsave (&mutex->lock, flags);			while ((ret = __pthread_mutex_trylock(mutex))) {				if (ret == EINVAL) {					rtl_spin_unlock_irqrestore(&mutex->lock, flags);					return ret;				}								ret = rtl_wait_sleep (&mutex->wait, &mutex->lock);				rtl_spin_lock(&mutex->lock);			}			rtl_spin_unlock_irqrestore(&mutex->lock, flags);			return 0;	}}int pthread_mutex_unlock(pthread_mutex_t *mutex){	rtl_irqstate_t flags;	switch (mutex->type) {		case PTHREAD_MUTEX_SPINLOCK_NP:			flags = mutex->flags;			rtl_spin_unlock(&mutex->lock);			rtl_restore_interrupts (flags);			return 0;		case PTHREAD_MUTEX_NORMAL:		default:			if (!mutex->valid) {				return EINVAL;			}			rtl_spin_lock_irqsave (&mutex->lock, flags);#ifdef _RTL_POSIX_THREAD_PRIO_PROTECT			if (mutex->protocol == PTHREAD_PRIO_PROTECT) {				RTL_PRIO(RTL_CURRENT) = mutex->oldprio;			}#endif			clear_bit (0, &mutex->busy);			rtl_wait_wakeup(&mutex->wait);			rtl_spin_unlock_irqrestore (&mutex->lock, flags);			/* XXX we do not call the scheduler here by design;			 * for fast wakeups, use semaphores & pthread_wakeup_np */			return 0;	}}#ifdef _RTL_POSIX_TIMEOUTS/* not supported for spinlock mutexes */int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime){	rtl_sigset_t reason;	int ret;	rtl_irqstate_t flags;	pthread_t self = pthread_self();	hrtime_t save_resume_time;	hrtime_t timeout;	if (mutex->type == PTHREAD_MUTEX_SPINLOCK_NP) {		return EINVAL;	}	if (!mutex->valid) {		return EINVAL;	}	rtl_spin_lock_irqsave (&mutex->lock, flags);	while ((ret = __pthread_mutex_trylock(mutex))) {		if (ret == EINVAL) {			rtl_spin_unlock_irqrestore(&mutex->lock, flags);			return ret;		}		if (abstime == (const struct timespec *) &self->timeval) {			timeout = self->timeval;		} else {			timeout = timespec_to_ns(abstime);		}		timeout = __rtl_fix_timeout_for_clock(CLOCK_REALTIME, timeout);		save_resume_time = self->resume_time;		__rtl_setup_timeout(self, timeout);		reason = rtl_wait_sleep (&mutex->wait, &mutex->lock);		if (RTL_TIMED_OUT(&reason)) {			rtl_restore_interrupts(flags);			return ETIMEDOUT;		}		rtl_spin_lock(&mutex->lock);		self->resume_time = save_resume_time;	}	rtl_spin_unlock_irqrestore(&mutex->lock, flags);	return 0;}#endif#ifdef _RTL_POSIX_THREAD_PRIO_PROTECTint pthread_mutex_setprioceiling(pthread_mutex_t *mutex, int prioceiling, int *old_ceiling){	int ret;	ret = pthread_mutex_lock (mutex);	if (ret) {		return ret;	}	*old_ceiling = mutex->prioceiling;	mutex->prioceiling = prioceiling;	pthread_mutex_unlock (mutex);	return 0;}#endif/* For condvar wait and signal operations the mutex should * be locked; otherwise the behaviour is undefined */int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex){	int ret;	rtl_irqstate_t flags;	rtl_no_interrupts (flags);	pthread_mutex_unlock (mutex);	rtl_spin_lock(&cond->lock);	ret = rtl_wait_sleep(&cond->wait, &cond->lock);	pthread_mutex_lock (mutex);	pthread_testcancel();	rtl_restore_interrupts (flags);	return 0;}int pthread_cond_broadcast(pthread_cond_t *cond){	rtl_irqstate_t flags;	rtl_spin_lock_irqsave (&cond->lock, flags);	rtl_wait_wakeup(&cond->wait);	rtl_spin_unlock_irqrestore (&cond->lock, flags);	return 0;}int pthread_cond_timedwait(pthread_cond_t *cond,		    pthread_mutex_t *mutex, const struct timespec *abstime){	rtl_sigset_t reason;	rtl_irqstate_t flags;	pthread_t self = pthread_self();	hrtime_t save_resume_time;	hrtime_t timeout;	if (abstime == (const struct timespec *) &self->timeval) {		timeout = self->timeval;	} else {		timeout = timespec_to_ns(abstime);	}	timeout = __rtl_fix_timeout_for_clock(CLOCK_REALTIME, timeout);	rtl_no_interrupts (flags);	pthread_mutex_unlock (mutex);	save_resume_time = self->resume_time;	__rtl_setup_timeout(self, timeout);	rtl_spin_lock(&cond->lock);	reason = rtl_wait_sleep(&cond->wait, &cond->lock);	self->resume_time = save_resume_time;	pthread_mutex_lock (mutex);	pthread_testcancel();	rtl_restore_interrupts (flags);	return RTL_TIMED_OUT(&reason) ? ETIMEDOUT : 0;}int pthread_cond_init(pthread_cond_t *cond,		    const pthread_condattr_t *attr){	rtl_wait_init(&cond->wait);	spin_lock_init(&cond->lock);	return 0;}int pthread_cond_destroy(pthread_cond_t *mutex){	return 0;}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧洲人成人精品| 欧美三日本三级三级在线播放| 亚洲精品国久久99热| 宅男在线国产精品| 成人黄色在线视频| 蜜桃av一区二区在线观看| 日韩理论片在线| 国产日韩欧美综合一区| 欧美丰满高潮xxxx喷水动漫| 91在线无精精品入口| 国产一区二区三区四区在线观看| 亚洲精品水蜜桃| 中文字幕av资源一区| 日韩免费观看高清完整版在线观看| 欧美综合在线视频| av一区二区三区四区| 国产伦精一区二区三区| 日韩电影在线免费| 一区二区三区精密机械公司| 欧美激情在线一区二区三区| 欧美va亚洲va在线观看蝴蝶网| 欧美肥胖老妇做爰| 91久久国产综合久久| 91丨porny丨最新| 成人性生交大片免费看视频在线| 久久99国产精品免费| 日韩成人一级大片| 全国精品久久少妇| 香蕉av福利精品导航| 亚洲一区二区三区小说| 亚洲男女毛片无遮挡| 亚洲人午夜精品天堂一二香蕉| 中文字幕的久久| 日本一区二区在线不卡| 欧美激情一区在线观看| 国产欧美日韩中文久久| 国产欧美一区二区三区鸳鸯浴 | 欧美日韩精品系列| 91久久免费观看| 欧美在线free| 欧美伊人精品成人久久综合97| 99riav一区二区三区| 99精品黄色片免费大全| 91在线观看视频| 91免费视频网| 欧美性色欧美a在线播放| 在线免费不卡电影| 欧美高清视频www夜色资源网| 欧美日韩国产免费| 制服丝袜日韩国产| 日韩欧美成人激情| 久久久久久久久久久99999| 久久久久久久久久电影| 国产精品美女视频| 亚洲精品高清在线| 日本不卡一二三区黄网| 激情成人综合网| 国产馆精品极品| av成人免费在线观看| 色噜噜狠狠色综合中国| 宅男噜噜噜66一区二区66| www国产亚洲精品久久麻豆| 欧美极品aⅴ影院| 一区二区在线观看免费视频播放| 亚洲一区二区三区免费视频| 美女视频黄 久久| 国产福利一区二区三区视频在线| 成人av在线观| 欧美日韩色一区| 久久久综合视频| 亚洲精品v日韩精品| 三级影片在线观看欧美日韩一区二区| 轻轻草成人在线| 国产999精品久久久久久绿帽| 91美女蜜桃在线| 欧美一卡2卡三卡4卡5免费| 久久青草国产手机看片福利盒子| 亚洲色图丝袜美腿| 男男gaygay亚洲| a级高清视频欧美日韩| 欧美日韩不卡在线| 欧美激情一区二区三区不卡| 亚洲一区二区精品久久av| 狠狠网亚洲精品| 欧美视频一二三区| 亚洲精品一区二区三区蜜桃下载 | 精品国产91久久久久久久妲己 | 久久aⅴ国产欧美74aaa| 91麻豆国产在线观看| 日韩美女视频在线| 日韩码欧中文字| 极品美女销魂一区二区三区免费| 色婷婷综合在线| 久久久久久久电影| 爽爽淫人综合网网站| 99免费精品在线观看| 精品欧美一区二区在线观看| 一区二区三国产精华液| 国产精品亚洲综合一区在线观看| 欧美日韩亚洲综合一区二区三区| 欧美国产日韩精品免费观看| 青草av.久久免费一区| 91麻豆国产在线观看| 久久蜜臀中文字幕| 欧美aaaaa成人免费观看视频| 色美美综合视频| 国产精品福利一区| 国产一区在线不卡| 欧美猛男gaygay网站| 亚洲欧美偷拍另类a∨色屁股| 国产剧情av麻豆香蕉精品| 制服丝袜中文字幕亚洲| 亚洲综合久久久| 成人av集中营| 国产欧美一区二区精品性| 精品一区二区在线看| 制服视频三区第一页精品| 亚洲午夜精品17c| 91福利资源站| 一个色妞综合视频在线观看| 99久久精品免费看| 国产精品污网站| 国产二区国产一区在线观看| 精品国产电影一区二区| 精品一二线国产| 欧美成人aa大片| 久久99这里只有精品| 精品国产亚洲一区二区三区在线观看| 三级不卡在线观看| 欧美精品日韩一本| 石原莉奈在线亚洲三区| 91精品国产综合久久香蕉的特点| 亚洲成人综合网站| 在线播放一区二区三区| 亚洲国产精品尤物yw在线观看| 91极品美女在线| 亚洲国产精品麻豆| 欧美肥大bbwbbw高潮| 日韩极品在线观看| 精品久久久网站| 国产成人亚洲综合色影视| 国产欧美日韩在线| av中文字幕不卡| 一区二区视频免费在线观看| 欧美性受xxxx黑人xyx性爽| 天堂va蜜桃一区二区三区漫画版| 在线成人高清不卡| 另类小说色综合网站| 久久综合狠狠综合久久综合88| 国产suv精品一区二区三区| 中文字幕在线观看不卡视频| 91日韩一区二区三区| 亚洲一区二区高清| 91精品国产色综合久久ai换脸| 久久99国内精品| 欧美激情一区在线| 欧美影院一区二区| 毛片不卡一区二区| 日本一区二区免费在线观看视频| 成人av电影免费在线播放| 亚洲精品高清在线| 日韩免费看网站| av亚洲产国偷v产偷v自拍| 亚洲一区自拍偷拍| 日韩午夜中文字幕| 成人午夜激情在线| 亚洲一区二区三区视频在线播放| 日韩一卡二卡三卡四卡| 懂色av一区二区在线播放| 亚洲美女一区二区三区| 91麻豆精品国产91久久久使用方法 | 日韩高清不卡一区二区三区| 久久精品日韩一区二区三区| 色综合久久综合网欧美综合网| 亚洲成人手机在线| 国产欧美日韩视频在线观看| 欧美色中文字幕| 国产suv精品一区二区三区| 亚洲国产精品久久一线不卡| 国产欧美一区二区三区在线看蜜臀 | 国产成人免费在线| 午夜视频一区二区三区| 日本一区免费视频| 在线播放国产精品二区一二区四区| 国产一区二区在线看| 亚洲综合一区在线| 中文字幕精品一区二区三区精品| 欧美日韩黄色影视| 成人aaaa免费全部观看| 男女性色大片免费观看一区二区| 综合激情网...| 久久综合久久综合亚洲| 精品视频1区2区3区| 成人av资源下载| 精品在线亚洲视频| 天天爽夜夜爽夜夜爽精品视频| 国产精品三级电影| 欧美v亚洲v综合ⅴ国产v| 欧美视频一二三区| 色婷婷av一区二区三区大白胸|