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

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

?? rtl_fifo.c

?? fsmlabs的real time linux的內(nèi)核
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* * (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);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91欧美一区二区| 国产一区二区三区久久久| 欧美精品乱人伦久久久久久| 黄色日韩网站视频| 亚洲综合激情小说| 国产日韩综合av| 欧美色图一区二区三区| 免费成人小视频| 一区二区三区丝袜| 国产精品一线二线三线精华| 久久精品人人做人人综合| 国产成人精品一区二| 精品国产免费久久| 国产精品小仙女| 麻豆一区二区在线| 精品卡一卡二卡三卡四在线| 国产精品自拍毛片| 久久精品国产99| 亚洲一区二三区| 精品裸体舞一区二区三区| 色哟哟国产精品| 久久99精品国产| 亚洲18影院在线观看| 亚洲日本欧美天堂| 国产拍欧美日韩视频二区| 国产欧美va欧美不卡在线| 亚洲欧洲日本在线| 国产精品美女久久久久av爽李琼| 精品国产伦一区二区三区观看体验 | 91麻豆精品国产91久久久久| 99精品偷自拍| 粉嫩一区二区三区在线看| 九色综合国产一区二区三区| 国产成人在线影院| 色诱视频网站一区| 日韩午夜在线播放| 日韩免费观看2025年上映的电影| 欧美三级日韩在线| 日韩美女一区二区三区| 亚洲欧美在线视频观看| 天堂精品中文字幕在线| 日韩影院在线观看| 国产91精品入口| 欧美最新大片在线看| 欧美日韩五月天| 久久青草国产手机看片福利盒子 | 亚洲欧洲精品一区二区三区不卡| 亚洲一区免费在线观看| 国产一区二区视频在线| 色综合天天综合网天天看片| 91丨porny丨中文| 欧美一区二区三区四区视频| 日韩欧美一级在线播放| 亚洲黄色性网站| 亚洲免费在线看| 一区二区在线观看视频在线观看| 亚洲一区二区在线视频| 久久se精品一区二区| 91老师片黄在线观看| 久久网这里都是精品| 色伊人久久综合中文字幕| 欧美福利电影网| 亚洲欧美日韩电影| 26uuu国产在线精品一区二区| 欧美午夜精品电影| 国产主播一区二区三区| 成人综合激情网| 日本va欧美va瓶| 成人av网站免费| 欧美在线不卡一区| 国产午夜精品一区二区三区嫩草 | 久久久久久久综合狠狠综合| 亚洲一二三四在线| 国产91精品在线观看| 欧美刺激脚交jootjob| 一区二区免费在线| 99这里都是精品| 欧美日本一道本在线视频| 日韩欧美高清dvd碟片| 一区二区三区中文字幕电影| 东方欧美亚洲色图在线| 精品国产自在久精品国产| 石原莉奈一区二区三区在线观看| 色哟哟一区二区三区| 国产精品美女久久久久久2018| 国产精品一级在线| 精品国产区一区| 蜜桃视频一区二区三区| 91精品中文字幕一区二区三区| 亚洲黄网站在线观看| 色综合久久99| 亚洲免费大片在线观看| 99久久免费精品高清特色大片| 中文在线一区二区| 热久久一区二区| 欧美日韩一区不卡| 亚洲一区在线看| 91久久精品国产91性色tv| 精品国产一二三| 精一区二区三区| 亚洲精品一区二区三区香蕉| 久久影院午夜片一区| 国产精品自拍三区| 日韩—二三区免费观看av| 国产精品1024| 亚洲第一综合色| 国产喷白浆一区二区三区| 91欧美一区二区| 国产一区 二区| 石原莉奈在线亚洲二区| 亚洲国产精品国自产拍av| 欧美久久久久免费| 色婷婷久久久亚洲一区二区三区| 久久天天做天天爱综合色| 麻豆精品久久久| 久久综合国产精品| 国产不卡一区视频| 国产精品福利一区| 亚洲风情在线资源站| 成人国产在线观看| 综合自拍亚洲综合图不卡区| 色婷婷精品大在线视频| 亚洲一区二区视频| 91精品福利在线一区二区三区| 国产在线一区二区综合免费视频| 国产亚洲成aⅴ人片在线观看| 波多野结衣中文字幕一区二区三区| 亚洲欧美另类图片小说| 欧美午夜电影网| 国模少妇一区二区三区| 国产精品福利一区二区| 欧美蜜桃一区二区三区| 精品一区二区免费看| 国产精品久线观看视频| 欧美日韩高清一区二区不卡| 精品一区二区三区在线观看 | 国产亚洲精品久| 成人手机在线视频| 亚洲国产精品久久人人爱蜜臀| 日韩欧美资源站| 97久久超碰国产精品| 免费观看在线色综合| 中文字幕中文字幕一区| 欧美日韩aaaaa| 国产成a人亚洲| 五月综合激情日本mⅴ| 欧美视频在线一区二区三区 | 欧美军同video69gay| 国产原创一区二区| 亚洲六月丁香色婷婷综合久久| 91麻豆精品国产91久久久资源速度 | 亚洲精品乱码久久久久久久久 | 日韩午夜在线播放| 欧美一区二区在线播放| 久久精品一区四区| 国产在线视频不卡二| 精品国产91久久久久久久妲己| www.久久精品| 久久成人免费电影| 亚洲激情一二三区| 久久蜜桃香蕉精品一区二区三区| 色94色欧美sute亚洲13| 狠狠狠色丁香婷婷综合激情| 亚洲福利电影网| 亚洲欧洲成人自拍| 精品国产一区二区亚洲人成毛片| 91老司机福利 在线| 国产一区二区美女诱惑| 亚洲成人综合在线| 成人免费在线播放视频| 欧美精品一区二区三区在线| 欧美色老头old∨ideo| www.在线欧美| 国产在线乱码一区二区三区| 午夜精品久久久久影视| 1000精品久久久久久久久| 久久精品一二三| 日韩欧美一区电影| 欧美另类高清zo欧美| 99国产精品视频免费观看| 国产伦精品一区二区三区免费迷| 日韩影院精彩在线| 亚洲第一二三四区| 亚洲自拍与偷拍| 亚洲视频免费观看| 国产精品视频一二| 久久免费国产精品| 精品国产免费人成在线观看| 欧美精品成人一区二区三区四区| 91免费视频观看| 成人av第一页| 成人性生交大片免费看中文| 国产精品一区二区在线观看不卡| 美女一区二区三区| 另类综合日韩欧美亚洲| 蜜桃在线一区二区三区| 男女男精品视频| 久久se精品一区精品二区| 看片的网站亚洲| 久久99国产精品久久|