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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rtl_fifo.c

?? fsmlabs的real time linux的內核
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * (C) Finite State Machine Labs Inc. 1995-2000 <business@fsmlabs.com> * * Released under the terms of GPL 2. * Open RTLinux makes use of a patented process described in * US Patent 5,995,745. Use of this process is governed * by the Open RTLinux Patent License which can be obtained from * www.fsmlabs.com/PATENT or by sending email to * licensequestions@fsmlabs.com *//* * Includes a tiny bit of code from Linux fs/pipe.c copyright (C) Linus Torvalds. * */#include <linux/module.h>#include <linux/major.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/slab.h>#include <linux/poll.h>#include <linux/smp.h>#include <linux/vmalloc.h>#include <asm/uaccess.h>#include <asm/system.h>#include <asm/irq.h>#include <rtl_conf.h>#include <rtl_sync.h>#include <rtl_fifo.h>#include <rtl_core.h>#include <rtl.h>MODULE_LICENSE("GPL v2");MODULE_AUTHOR("FSMLabs Inc.");MODULE_DESCRIPTION("RTLinux FIFOs");struct rt_fifo_struct {	int allocated;	int bidirectional;	int user_open;	struct task_struct *opener;	char *base;	int bufsize;	int start;	int len;	spinlock_t fifo_spinlock;	int (*user_handler) (unsigned int fifo);	int (*rt_handler) (unsigned int fifo);	int (*user_ioctl)(unsigned int fifo, unsigned int cmd, unsigned long arg);	struct module *creator;#if LINUX_VERSION_CODE >= 0x020300	wait_queue_head_t wait;#else	struct wait_queue *wait;#endif};struct rt_fifo_struct rtl_fifos[RTF_MAX_FIFO];static int rtl_fifo_to_wakeup[RTF_MAX_FIFO] = {0,}; static int rtl_fifo_irq = 0; #ifdef CONFIG_RTFPREALLOC#define PREALLOC_BUFFERS CONFIG_NRTFBUFF#define PREALLOC_SIZE CONFIG_SIZE_RTFBUFFstatic int fifo_buffer_control[PREALLOC_BUFFERS]={0,};static char fifo_buffer[PREALLOC_BUFFERS*PREALLOC_SIZE];static char * get_prealloc(void){	int i; 	for(i=0; i < PREALLOC_BUFFERS; i++){		if(!test_and_set_bit(0,&fifo_buffer_control[i])){			return &fifo_buffer[i*PREALLOC_SIZE];		}	}		return 0;}static int free_prealloc(char *b){	int i;	for(i = 0; i < PREALLOC_BUFFERS; i++){		if(b == &fifo_buffer[i*PREALLOC_SIZE])		{			clear_bit(0, &fifo_buffer_control[i]);			return 1;		}	}	return 0;}static int find_prealloc(char *b){	int i;	for(i = 0; i < PREALLOC_BUFFERS; i++){		if(b == &fifo_buffer[i*PREALLOC_SIZE])		{			return 1;		}	}	return 0;}#else#define get_prealloc() 0#define free_prealloc(x) 0#define find_prealloc(x) 0#define  PREALLOC_SIZE 8192 // used for O_CREATE in posix open even if no prealloc#endif#define RTF_ADDR(minor)		(&rtl_fifos[minor])#define RTF_BI(minor)		(RTF_ADDR(minor)->bidirectional)#define RTF_ALLOCATED(minor)		(RTF_ADDR(minor)->allocated)#define RTF_USER_OPEN(minor)	(RTF_ADDR(minor)->user_open)#define RTF_OPENER(minor)	(RTF_ADDR(minor)->opener)#define RTF_BASE(minor)		(RTF_ADDR(minor)->base)#define RTF_SPIN(minor)		(RTF_ADDR(minor)->fifo_spinlock)#define RTF_BUF(minor)		(RTF_ADDR(minor)->bufsize)#define RTF_START(minor)	(RTF_ADDR(minor)->start)#define RTF_HANDLER(minor)	(RTF_ADDR(minor)->user_handler)#define RTF_RT_HANDLER(minor)	(RTF_ADDR(minor)->rt_handler)#define RTF_USER_IOCTL(minor)	(RTF_ADDR(minor)->user_ioctl)#define RTF_LEN(minor)		(RTF_ADDR(minor)->len)#define RTF_FREE(minor)		(RTF_BUF(minor) - RTF_LEN(minor))#define RTF_WAIT(minor)		(RTF_ADDR(minor)->wait)#define RTF_WRAP(minor,pos)	((pos) < RTF_BUF(minor)? (pos) : (pos) - RTF_BUF(minor))#define RTF_END(minor)		RTF_WRAP(minor, RTF_START(minor)+RTF_LEN(minor))#define RTF_EMPTY(minor)	(RTF_LEN(minor)==0)#define RTF_FULL(minor)		(RTF_FREE(minor)==0)#define RTF_MAX_RCHUNK(minor)	(RTF_BUF(minor) - RTF_START(minor))#define RTF_MAX_WCHUNK(minor)	(RTF_BUF(minor) - RTF_END(minor))#define RTL_SLEEP_POS 1#define RTL_NEEDS_WAKE_POS 2static int default_handler (unsigned int fifo){	return 0;}static void rtf_wake_up(void *p){	struct rt_fifo_struct *fifo_ptr = (struct rt_fifo_struct *) p;	wake_up_interruptible(&(fifo_ptr->wait));	current->need_resched = 1;}static void fifo_wake_sleepers(int );/* These are for use in the init and exit code of real-time modules   DO NOT call these from a RT task  */int rtf_resize(unsigned int minor, int size){	void *mem=0;	void *old;	rtl_irqstate_t interrupt_state;	if (size <= 0) {		return -EINVAL;	}	if (minor >= RTF_MAX_FIFO) {		return -ENODEV;	}	if(size == PREALLOC_SIZE){		mem=get_prealloc();	}		if(!mem){ 		if (!rtl_rt_system_is_idle()) { 			return -EINVAL; 		}		mem = vmalloc(size);	}	if (!mem) {		return -ENOMEM;	}	memset(mem, 0, size);	old = RTF_BASE(minor);	rtl_spin_lock_irqsave(&RTF_SPIN(minor), interrupt_state);	RTF_BASE(minor) = mem;	RTF_BUF(minor) = size;	RTF_START(minor) = 0;	RTF_LEN(minor) = 0;	rtl_spin_unlock_irqrestore(&RTF_SPIN(minor), interrupt_state);	if (RTF_ALLOCATED(minor) && old && !free_prealloc(old)){		vfree(old);	}	return 0;}extern int rtf_link_user_ioctl (unsigned int minor,		int (*handler)(unsigned int fifo, unsigned int cmd, unsigned long arg)){	if (minor >= RTF_MAX_FIFO) {		return -ENODEV;	}	RTF_USER_IOCTL(minor) = handler;	return 0;}extern int rtf_make_user_pair (unsigned int fifo_get, unsigned int fifo_put){	if (fifo_get >= RTF_MAX_FIFO || fifo_put >= RTF_MAX_FIFO) {		return -ENODEV;	}	if (!RTF_ALLOCATED(fifo_get) || !RTF_ALLOCATED(fifo_put)) {		return -EINVAL;	}	RTF_BI(fifo_get) = (fifo_put - fifo_get);	RTF_BI(fifo_put) = -(fifo_put - fifo_get);	return 0;}int __rtf_create(unsigned int minor, int size, struct module *creator){	int ret;	if (minor >= RTF_MAX_FIFO) {		return -ENODEV;	}	if (RTF_ALLOCATED(minor)) {		return -EBUSY;	}	spin_lock_init(&RTF_SPIN(minor));	RTF_BI(minor) = 0;	if ((ret = rtf_resize(minor, size)) < 0) {		return -ENOMEM;	}	RTF_ADDR(minor)->creator = creator;	RTF_USER_OPEN(minor) = 0;	RTF_OPENER(minor) = 0;	RTF_HANDLER(minor) = &default_handler;	RTF_RT_HANDLER(minor) = &default_handler;	RTF_USER_IOCTL(minor) = 0;#if LINUX_VERSION_CODE >= 0x020300	init_waitqueue_head(&RTF_WAIT(minor));#else	init_waitqueue (&RTF_WAIT(minor));#endif	RTF_ALLOCATED(minor) = 1;	return 0;}int rtf_destroy(unsigned int minor){	if (minor >= RTF_MAX_FIFO) {		return -ENODEV;	}	if (RTF_USER_OPEN(minor)) {		return -EINVAL;	}	if (!RTF_ALLOCATED(minor)) {		return -EINVAL;	}	RTF_ADDR(minor)->creator = 0;	RTF_HANDLER(minor) = &default_handler;	RTF_RT_HANDLER(minor) = &default_handler;	if (!free_prealloc(RTF_BASE(minor))){		vfree(RTF_BASE(minor));	}	RTF_ALLOCATED(minor) = 0;	return 0;}int rtf_create_handler(unsigned int minor, int (*handler) (unsigned int fifo)){	if (minor >= RTF_MAX_FIFO || !RTF_ALLOCATED(minor) || !handler) {		return -EINVAL;	}	RTF_HANDLER(minor) = handler;	return 0;}extern int rtf_create_rt_handler(unsigned int minor,		int (*handler)(unsigned int fifo)){	if (minor >= RTF_MAX_FIFO || !RTF_ALLOCATED(minor) || !handler) {		return -EINVAL;	}	RTF_RT_HANDLER(minor) = handler;	return 0;}/* these can be called from RT tasks and interrupt handlers */int rtf_isempty(unsigned int minor){	return RTF_LEN(minor) == 0;}int rtf_isused(unsigned int minor){	return RTF_USER_OPEN(minor) != 0;}int rtf_flush(unsigned int minor){	rtl_irqstate_t interrupt_state;	rtl_spin_lock_irqsave(&RTF_SPIN(minor), interrupt_state);	RTF_LEN(minor) = 0;	rtl_spin_unlock_irqrestore(&RTF_SPIN(minor), interrupt_state);	return 0;}int rtf_put(unsigned int minor, void *buf, int count){	rtl_irqstate_t interrupt_state;	int chars = 0, free = 0, written = 0;	char *pipebuf;	if (minor >= RTF_MAX_FIFO) {		return -ENODEV;	}	if (!RTF_ALLOCATED(minor))		return -EINVAL;	rtl_spin_lock_irqsave(&RTF_SPIN(minor), interrupt_state);	if (RTF_FREE(minor) < count) {		rtl_spin_unlock_irqrestore(&RTF_SPIN(minor), interrupt_state);		return -ENOSPC;	}	while (count > 0 && (free = RTF_FREE(minor))) {		chars = RTF_MAX_WCHUNK(minor);		if (chars > count)			chars = count;		if (chars > free)			chars = free;		pipebuf = RTF_BASE(minor) + RTF_END(minor);		written += chars;		RTF_LEN(minor) += chars;		count -= chars;		memcpy(pipebuf, buf, chars);		buf += chars;	}	rtl_spin_unlock_irqrestore(&RTF_SPIN(minor), interrupt_state);	(*RTF_RT_HANDLER(minor))(minor);	if (RTF_USER_OPEN(minor)) {		fifo_wake_sleepers(minor - (RTF_BI(minor) < 0));	}	return written;}int rtf_get(unsigned int minor, void *buf, int count){	rtl_irqstate_t interrupt_state;	int chars = 0, size = 0, read = 0;	char *pipebuf;	if (minor >= RTF_MAX_FIFO) {		return -ENODEV;	}	if (!RTF_ALLOCATED(minor))		return -EINVAL;	rtl_spin_lock_irqsave(&RTF_SPIN(minor), interrupt_state);	while (count > 0 && (size = RTF_LEN(minor))) {		chars = RTF_MAX_RCHUNK(minor);		if (chars > count)			chars = count;		if (chars > size)			chars = size;		read += chars;		pipebuf = RTF_BASE(minor) + RTF_START(minor);		RTF_START(minor) += chars;		RTF_START(minor) = RTF_WRAP(minor, RTF_START(minor));		RTF_LEN(minor) -= chars;		count -= chars;		memcpy(buf, pipebuf, chars);		buf += chars;	}	rtl_spin_unlock_irqrestore(&RTF_SPIN(minor), interrupt_state);	(*RTF_RT_HANDLER(minor))(minor);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美中文字幕公布| 国产精品久久久久久一区二区三区| 国产一区二区成人久久免费影院 | 欧美日韩亚洲不卡| 91麻豆国产福利精品| 成人毛片在线观看| 不卡一区二区中文字幕| 99国产精品国产精品毛片| 99精品桃花视频在线观看| 色综合天天综合在线视频| 91国偷自产一区二区使用方法| 色综合久久中文字幕综合网| 在线影视一区二区三区| 欧美精选一区二区| 精品国产成人系列| 中文字幕va一区二区三区| 亚洲精品免费播放| 亚洲国产一区二区在线播放| 亚洲va欧美va天堂v国产综合| 婷婷丁香久久五月婷婷| 精品亚洲免费视频| 91美女视频网站| 欧美精品一二三四| 日本一二三四高清不卡| 亚洲精品国产a久久久久久| 日韩在线a电影| 国产精品77777| 欧美日韩一级视频| 精品国产精品一区二区夜夜嗨 | av动漫一区二区| 欧美日韩国产三级| 国产日韩欧美不卡在线| 亚洲一区二区五区| 国产精品一区二区在线观看网站| www.色综合.com| 日韩欧美一区二区视频| 国产精品的网站| 蜜桃精品视频在线观看| 97精品久久久久中文字幕| 欧美一区二区三区在线观看视频| 久久久精品黄色| 日韩精品一卡二卡三卡四卡无卡| 国产精品亚洲视频| 555www色欧美视频| 亚洲激情一二三区| 国产白丝网站精品污在线入口| 欧美三级中文字幕在线观看| 国产日韩欧美a| 久久99这里只有精品| 欧美午夜精品久久久久久超碰| 久久网这里都是精品| 亚洲成人久久影院| 99精品国产一区二区三区不卡| 日韩欧美专区在线| 亚洲va韩国va欧美va| 91婷婷韩国欧美一区二区| 久久综合精品国产一区二区三区| 一区二区三区中文字幕| 国产99久久久国产精品潘金| 日韩免费福利电影在线观看| 曰韩精品一区二区| 91偷拍与自偷拍精品| 中文字幕中文字幕在线一区| 国产精品一二一区| 337p粉嫩大胆噜噜噜噜噜91av | 欧美视频日韩视频在线观看| 国产精品久久毛片a| 国产成人免费视频网站| 日韩欧美国产综合一区| 乱一区二区av| 日韩欧美中文字幕精品| 麻豆精品一区二区综合av| 制服丝袜av成人在线看| 日韩中文字幕91| 日韩视频一区二区三区| 久久er99热精品一区二区| 精品剧情在线观看| 国产精品一区二区男女羞羞无遮挡| 精品国产sm最大网站免费看| 久久99国产精品久久99| 久久久蜜桃精品| 成人性生交大片免费看在线播放| 国产女人水真多18毛片18精品视频 | 国产欧美久久久精品影院| 国产成人精品网址| 国产精品久久久久久久久免费相片| 丁香天五香天堂综合| 亚洲欧美在线高清| 在线亚洲欧美专区二区| 午夜精品一区二区三区电影天堂| 欧美日韩高清一区二区三区| 日韩电影免费在线| 久久久久久亚洲综合| av亚洲精华国产精华精华| 亚洲黄色在线视频| 欧美一区中文字幕| 国产91富婆露脸刺激对白| 亚洲视频电影在线| 欧美日韩国产一二三| 国产一区在线观看麻豆| 亚洲天堂a在线| 欧美一区二区视频免费观看| 高清免费成人av| 亚洲成人av在线电影| 精品国产1区二区| 一本色道久久综合亚洲91| 日本不卡视频在线| 综合网在线视频| 欧美一区二区久久久| 成人综合婷婷国产精品久久 | 国产美女在线观看一区| 亚洲欧美综合另类在线卡通| 欧美老肥妇做.爰bbww视频| 国产一区二区美女| 五月激情六月综合| 国产精品不卡一区二区三区| 欧美精品三级日韩久久| a在线欧美一区| 老司机精品视频导航| 亚洲一本大道在线| 中文字幕欧美区| 日韩三级视频中文字幕| 欧美午夜电影一区| 99在线精品观看| 国产一区999| 麻豆精品在线观看| 午夜精品福利一区二区蜜股av| 国产精品视频一区二区三区不卡| 欧美一级二级在线观看| 日本韩国精品在线| 成人污污视频在线观看| 六月丁香婷婷久久| 视频在线观看一区二区三区| 亚洲三级在线免费观看| 久久精品男人天堂av| 日韩精品一区二区三区老鸭窝| 色又黄又爽网站www久久| 粉嫩aⅴ一区二区三区四区五区| 免费在线视频一区| 亚洲bt欧美bt精品| 亚洲高清免费视频| 亚洲国产一区二区视频| 一区二区三区波多野结衣在线观看| 欧美国产日产图区| 国产欧美一区二区精品性色超碰| 欧美va日韩va| 亚洲精品一区二区三区福利| 欧美一二三四区在线| 日韩一级免费观看| 日韩亚洲电影在线| 欧美mv日韩mv| 精品国产乱码久久久久久夜甘婷婷| 欧美高清精品3d| 91精品国产乱| 精品国产区一区| 国产欧美一区二区精品性色| 久久久精品日韩欧美| 欧美韩日一区二区三区| 国产精品成人免费| 洋洋成人永久网站入口| 亚洲一区二区av在线| 亚洲va国产天堂va久久en| 日本最新不卡在线| 精品亚洲欧美一区| 成人国产精品免费网站| 一本大道久久a久久综合| 欧美无砖砖区免费| 欧美一二三区在线观看| 国产色91在线| 亚洲三级视频在线观看| 午夜精品123| 国内久久精品视频| 91一区二区三区在线观看| 欧美色图激情小说| 精品福利一二区| 1000精品久久久久久久久| 亚洲一区二区四区蜜桃| 日韩不卡一区二区| 国产999精品久久| 欧美三级韩国三级日本三斤| 欧美videos大乳护士334| 国产欧美日韩在线| 午夜视频在线观看一区二区三区| 喷白浆一区二区| 99久久免费国产| 91精品婷婷国产综合久久性色| 亚洲精品在线一区二区| 亚洲日穴在线视频| 精品中文字幕一区二区小辣椒 | 亚洲人吸女人奶水| 蜜臀久久久久久久| 99这里都是精品| 日韩欧美成人一区| 亚洲欧美偷拍卡通变态| 久久www免费人成看片高清| 91国产成人在线| 国产偷国产偷精品高清尤物| 五月天激情综合网| eeuss鲁一区二区三区| 欧美一区二区三区四区久久|