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

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

?? select.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 * This file contains the procedures for the handling of select
 *
 * Created for Linux based loosely upon Mathius Lattner's minix
 * patches by Peter MacDonald. Heavily edited by Linus.
 */

#include <linux/types.h>
#include <linux/time.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/stat.h>
#include <linux/signal.h>
#include <linux/errno.h>

#include <asm/segment.h>
#include <asm/system.h>

#define ROUND_UP(x,y) (((x)+(y)-1)/(y))

/*
 * Ok, Peter made a complicated, but straightforward multiple_wait() function.
 * I have rewritten this, taking some shortcuts: This code may not be easy to
 * follow, but it should be free of race-conditions, and it's practical. If you
 * understand what I'm doing here, then you understand how the linux
 * sleep/wakeup mechanism works.
 *
 * Two very simple procedures, select_wait() and free_wait() make all the work.
 * select_wait() is a inline-function defined in <linux/sched.h>, as all select
 * functions have to call it to add an entry to the select table.
 */

/*
 * I rewrote this again to make the select_table size variable, take some
 * more shortcuts, improve responsiveness, and remove another race that
 * Linus noticed.  -- jrs
 */

static void free_wait(select_table * p)
{
	struct select_table_entry * entry = p->entry + p->nr;

	while (p->nr > 0) {
		p->nr--;
		entry--;
		remove_wait_queue(entry->wait_address,&entry->wait);
	}
}

/*
 * The check function checks the ready status of a file using the vfs layer.
 *
 * If the file was not ready we were added to its wait queue.  But in
 * case it became ready just after the check and just before it called
 * select_wait, we call it again, knowing we are already on its
 * wait queue this time.  The second call is not necessary if the
 * select_table is NULL indicating an earlier file check was ready
 * and we aren't going to sleep on the select_table.  -- jrs
 */

static int check(int flag, select_table * wait, struct file * file)
{
	struct inode * inode;
	struct file_operations *fops;
	int (*select) (struct inode *, struct file *, int, select_table *);

	inode = file->f_inode;
	if ((fops = file->f_op) && (select = fops->select))
		return select(inode, file, flag, wait)
		    || (wait && select(inode, file, flag, NULL));
	if (S_ISREG(inode->i_mode))
		return 1;
	return 0;
}

int do_select(int n, fd_set *in, fd_set *out, fd_set *ex,
	fd_set *res_in, fd_set *res_out, fd_set *res_ex)
{
	int count;
	select_table wait_table, *wait;
	struct select_table_entry *entry;
	unsigned long set;
	int i,j;
	int max = -1;

	for (j = 0 ; j < __FDSET_LONGS ; j++) {
		i = j << 5;
		if (i >= n)
			break;
		set = in->fds_bits[j] | out->fds_bits[j] | ex->fds_bits[j];
		for ( ; set ; i++,set >>= 1) {
			if (i >= n)
				goto end_check;
			if (!(set & 1))
				continue;
			if (!current->filp[i])
				return -EBADF;
			if (!current->filp[i]->f_inode)
				return -EBADF;
			max = i;
		}
	}
end_check:
	n = max + 1;
	if(!(entry = (struct select_table_entry*) __get_free_page(GFP_KERNEL)))
		return -ENOMEM;
	FD_ZERO(res_in);
	FD_ZERO(res_out);
	FD_ZERO(res_ex);
	count = 0;
	wait_table.nr = 0;
	wait_table.entry = entry;
	wait = &wait_table;
repeat:
	current->state = TASK_INTERRUPTIBLE;
	for (i = 0 ; i < n ; i++) {
		if (FD_ISSET(i,in) && check(SEL_IN,wait,current->filp[i])) {
			FD_SET(i, res_in);
			count++;
			wait = NULL;
		}
		if (FD_ISSET(i,out) && check(SEL_OUT,wait,current->filp[i])) {
			FD_SET(i, res_out);
			count++;
			wait = NULL;
		}
		if (FD_ISSET(i,ex) && check(SEL_EX,wait,current->filp[i])) {
			FD_SET(i, res_ex);
			count++;
			wait = NULL;
		}
	}
	wait = NULL;
	if (!count && current->timeout && !(current->signal & ~current->blocked)) {
		schedule();
		goto repeat;
	}
	free_wait(&wait_table);
	free_page((unsigned long) entry);
	current->state = TASK_RUNNING;
	return count;
}

/*
 * We do a VERIFY_WRITE here even though we are only reading this time:
 * we'll write to it eventually..
 */
static int __get_fd_set(int nr, unsigned long * fs_pointer, unsigned long * fdset)
{
	int error;

	FD_ZERO(fdset);
	if (!fs_pointer)
		return 0;
	error = verify_area(VERIFY_WRITE,fs_pointer,sizeof(fd_set));
	if (error)
		return error;
	while (nr > 0) {
		*fdset = get_fs_long(fs_pointer);
		fdset++;
		fs_pointer++;
		nr -= 32;
	}
	return 0;
}

static void __set_fd_set(int nr, unsigned long * fs_pointer, unsigned long * fdset)
{
	if (!fs_pointer)
		return;
	while (nr > 0) {
		put_fs_long(*fdset, fs_pointer);
		fdset++;
		fs_pointer++;
		nr -= 32;
	}
}

#define get_fd_set(nr,fsp,fdp) \
__get_fd_set(nr, (unsigned long *) (fsp), (unsigned long *) (fdp))

#define set_fd_set(nr,fsp,fdp) \
__set_fd_set(nr, (unsigned long *) (fsp), (unsigned long *) (fdp))

/*
 * We can actually return ERESTARTSYS insetad of EINTR, but I'd
 * like to be certain this leads to no problems. So I return
 * EINTR just for safety.
 *
 * Update: ERESTARTSYS breaks at least the xview clock binary, so
 * I'm trying ERESTARTNOHAND which restart only when you want to.
 */
asmlinkage int sys_select( unsigned long *buffer )
{
/* Perform the select(nd, in, out, ex, tv) system call. */
	int i;
	fd_set res_in, in, *inp;
	fd_set res_out, out, *outp;
	fd_set res_ex, ex, *exp;
	int n;
	struct timeval *tvp;
	unsigned long timeout;

	i = verify_area(VERIFY_READ, buffer, 20);
	if (i)
		return i;
	n = get_fs_long(buffer++);
	if (n < 0)
		return -EINVAL;
	if (n > NR_OPEN)
		n = NR_OPEN;
	inp = (fd_set *) get_fs_long(buffer++);
	outp = (fd_set *) get_fs_long(buffer++);
	exp = (fd_set *) get_fs_long(buffer++);
	tvp = (struct timeval *) get_fs_long(buffer);
	if ((i = get_fd_set(n, inp, &in)) ||
	    (i = get_fd_set(n, outp, &out)) ||
	    (i = get_fd_set(n, exp, &ex))) return i;
	timeout = ~0UL;
	if (tvp) {
		i = verify_area(VERIFY_WRITE, tvp, sizeof(*tvp));
		if (i)
			return i;
		timeout = ROUND_UP(get_fs_long((unsigned long *)&tvp->tv_usec),(1000000/HZ));
		timeout += get_fs_long((unsigned long *)&tvp->tv_sec) * HZ;
		if (timeout)
			timeout += jiffies + 1;
	}
	current->timeout = timeout;
	i = do_select(n, &in, &out, &ex, &res_in, &res_out, &res_ex);
	if (current->timeout > jiffies)
		timeout = current->timeout - jiffies;
	else
		timeout = 0;
	current->timeout = 0;
	if (tvp) {
		put_fs_long(timeout/HZ, (unsigned long *) &tvp->tv_sec);
		timeout %= HZ;
		timeout *= (1000000/HZ);
		put_fs_long(timeout, (unsigned long *) &tvp->tv_usec);
	}
	if (i < 0)
		return i;
	if (!i && (current->signal & ~current->blocked))
		return -ERESTARTNOHAND;
	set_fd_set(n, inp, &res_in);
	set_fd_set(n, outp, &res_out);
	set_fd_set(n, exp, &res_ex);
	return i;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美韩日一区二区三区| 亚洲靠逼com| 亚洲精品国产品国语在线app| 夜夜精品视频一区二区| 国产美女娇喘av呻吟久久| 日本高清不卡aⅴ免费网站| 精品国产一二三| 亚洲高清久久久| 粗大黑人巨茎大战欧美成人| 欧美喷水一区二区| 自拍偷拍亚洲欧美日韩| 精品制服美女丁香| 欧美日韩在线播放一区| 亚洲国产精品二十页| 久久99国产精品成人| 欧美剧情电影在线观看完整版免费励志电影| 欧美tk—视频vk| 三级久久三级久久| 欧美影院一区二区| 亚洲欧美区自拍先锋| 丁香婷婷综合色啪| 久久综合久久综合九色| 日本最新不卡在线| 欧美日韩不卡在线| 亚洲一区二区三区中文字幕在线| 成人高清视频在线观看| 国产亚洲欧美激情| 国产精品一区二区你懂的| 欧美成人a∨高清免费观看| 婷婷丁香久久五月婷婷| 欧美三级一区二区| 亚洲高清免费一级二级三级| 欧美日韩在线电影| 亚洲国产精品综合小说图片区| 91伊人久久大香线蕉| 国产精品进线69影院| av毛片久久久久**hd| 最好看的中文字幕久久| 99久久综合精品| 亚洲欧美日韩在线播放| 91黄色小视频| 五月天精品一区二区三区| 欧美伦理电影网| 人人狠狠综合久久亚洲| 日韩一区二区电影| 国产一区二区不卡在线| 国产精品全国免费观看高清| av成人老司机| 亚洲色图欧美在线| 欧美日韩精品电影| 久久精品噜噜噜成人av农村| 久久先锋影音av鲁色资源| 国产精品一区二区果冻传媒| 国产精品视频麻豆| 欧美性感一类影片在线播放| 日韩精品亚洲专区| 久久久美女艺术照精彩视频福利播放| 国产不卡高清在线观看视频| 亚洲日本电影在线| 91精品国产全国免费观看| 国产资源精品在线观看| 亚洲日本一区二区三区| 欧美精品免费视频| 国产东北露脸精品视频| 一区二区三区在线观看国产| 欧美精品在线一区二区三区| 久久99精品国产.久久久久久| 亚洲国产成人私人影院tom| 在线欧美日韩精品| 狠狠色丁香久久婷婷综合丁香| 国产精品电影一区二区三区| 7777精品伊人久久久大香线蕉的 | 26uuu国产在线精品一区二区| 国产精品一区二区黑丝| 亚洲va国产天堂va久久en| 欧美www视频| 日本高清免费不卡视频| 国产精品自拍av| 亚洲电影一级黄| 国产精品成人午夜| 日韩精品中午字幕| 91黄色免费观看| 国产99久久久国产精品潘金网站| 亚洲自拍另类综合| 日本一区二区免费在线观看视频| 欧美性猛交xxxxxx富婆| 国产不卡一区视频| 精品在线一区二区| 偷拍一区二区三区| 综合久久一区二区三区| 精品久久久久久久久久久久久久久| a亚洲天堂av| 国产乱码精品一区二区三| 石原莉奈一区二区三区在线观看 | 欧美成人精品3d动漫h| 在线免费观看日韩欧美| 国产69精品久久777的优势| 奇米色一区二区| 一区二区三区不卡视频在线观看| 中文乱码免费一区二区| 日韩精品专区在线影院重磅| 88在线观看91蜜桃国自产| 色天使久久综合网天天| av亚洲精华国产精华| 国产成人精品综合在线观看| 久久aⅴ国产欧美74aaa| 日韩在线播放一区二区| 亚洲成av人片在线观看无码| 亚洲乱码中文字幕| 中文字幕亚洲精品在线观看| 日本一区二区电影| 国产午夜精品美女毛片视频| 久久先锋影音av鲁色资源| 欧美成人艳星乳罩| 欧美精品一区视频| 久久综合999| 久久精品亚洲一区二区三区浴池 | 欧美日韩一区久久| 在线观看中文字幕不卡| 欧美三区在线观看| 51精品久久久久久久蜜臀| 欧美日韩高清一区二区不卡| 欧美三级资源在线| 欧美一区二区三区人| 日韩三级在线观看| 日韩精品一区二区三区视频| 久久亚洲一区二区三区明星换脸 | 国产精品 欧美精品| 国产不卡视频一区| 99国产精品国产精品毛片| 91蝌蚪porny成人天涯| 欧美性色综合网| 欧美精品乱码久久久久久| 日韩视频永久免费| 国产日韩一级二级三级| 国产精品国产三级国产普通话三级| 国产精品久久久久久亚洲毛片 | 国产亚洲va综合人人澡精品 | 欧美精品一区二区在线播放| 国产精品女主播av| 一区二区三区四区乱视频| 天天av天天翘天天综合网色鬼国产| 青青青伊人色综合久久| 国产成人高清在线| 色综合久久精品| 日韩亚洲电影在线| 国产精品欧美久久久久无广告 | 极品销魂美女一区二区三区| 高清不卡在线观看av| 欧洲色大大久久| 欧美tk丨vk视频| 亚洲女子a中天字幕| 丝袜国产日韩另类美女| 国产福利一区二区三区在线视频| 色综合中文综合网| 亚洲欧美国产毛片在线| 首页国产丝袜综合| 成人做爰69片免费看网站| 欧美三级在线看| 国产精品久久久久影院亚瑟| 亚洲成人av中文| 国产成人啪午夜精品网站男同| 91福利资源站| 久久久精品免费网站| 亚洲一区二区三区爽爽爽爽爽| 黄页视频在线91| 欧美日免费三级在线| 久久久久久久久久久久电影| 亚洲国产一区二区a毛片| 国产精品77777| 884aa四虎影成人精品一区| **欧美大码日韩| 国产一区91精品张津瑜| 欧美在线不卡一区| 国产精品久久久久久久久久免费看| 日韩二区三区在线观看| 91国模大尺度私拍在线视频| 中文字幕av一区二区三区免费看| 天堂成人免费av电影一区| 色综合久久久久久久| 国产日韩欧美不卡| 久久不见久久见免费视频7| 欧美群妇大交群中文字幕| 一区二区在线观看视频在线观看| 盗摄精品av一区二区三区| 精品国产一区二区三区四区四| 亚洲成人激情综合网| 欧洲亚洲精品在线| 综合欧美一区二区三区| 成人在线综合网| 国产日韩欧美电影| 国产精品资源站在线| 久久伊99综合婷婷久久伊| 久久99国产精品免费网站| 欧美一级久久久| 蜜臀av一区二区| 日韩一区二区精品| 久久精品国产色蜜蜜麻豆| 欧美第一区第二区| 极品少妇xxxx精品少妇|