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

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

?? rn_sigio.c

?? linux平臺(tái)epoll封裝
?? C
字號(hào):
/*-------------------------------------------------------------------------- Copyright 1999,2001, Dan Kegel http://www.kegel.com/ Copyright 2003 Ixia http://www.ixiacom.com/ See the file COPYING This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA--------------------------------------------------------------------------*/#include <rn_config.h>	/* must come first */#include <assert.h>#include <errno.h>#include <fcntl.h>#include <rn_dprint.h>#include <rn_eclock.h>#include <rn_sigio.h>#include <signal.h>#include <stdlib.h>#ifdef HAVE_F_SETSIG#ifndef FALSE#define FALSE 0#define TRUE 1#endifint rn_sigio_init(struct rn_sigio *this, int maxfds){	int i;	(void) maxfds;	DPRINT("init()\n");	this->m_fds_used = 0;	this->m_fds_alloc = 16;	this->m_fds = (rn_client_t *)malloc(sizeof(rn_client_t) * this->m_fds_alloc);	if (!this->m_fds)		return ENOMEM;		for (i=this->m_fds_used; i<this->m_fds_alloc; i++) {		this->m_fds[i].pfn = NULL;		this->m_fds[i].data = NULL;	}	return 0;}int rn_sigio_setSignum(struct rn_sigio *this,int signum){	DPRINT("registering %d as the signal to get events on.\n", signum);	this->m_signum = signum;	sigemptyset(&this->m_sigset);	sigaddset(&this->m_sigset, signum);	sigaddset(&this->m_sigset, SIGIO);	return sigprocmask(SIG_BLOCK, &this->m_sigset, NULL);}void rn_sigio_shutdown(struct rn_sigio *this){	int i;	for (i=this->m_fds_alloc-1; (i >= 0) && (this->m_fds_used > 0); i--)		if (this->m_fds[i].pfn)			rn_sigio_del(this, i);	signal(this->m_signum, SIG_IGN);	/* POSIX says this clears the queue */	/* Can't leave signal ignored, or it might be.  (POSIX is fuzzy here.) */	signal(this->m_signum, SIG_DFL);	/* re-enable the signals we blocked	 * FIXME: is this right?	 */	sigprocmask(SIG_UNBLOCK, &this->m_sigset, NULL);	if (this->m_fds) {		free(this->m_fds);		this->m_fds = NULL;	}}int rn_sigio_prepare_fd_for_add(int fd, int pid){		int flags;	if (fcntl(fd, F_SETOWN, pid) < 0) {		int err = errno;		LOG_ERROR("add: fcntl(fd %d, F_SETOWN, %d) returns err %d\n", fd, pid, err);		return err;	}	/* FIXME: This is correct right now on Linux. May not be so later on */	flags = O_RDWR | O_NONBLOCK | O_ASYNC;	if (fcntl(fd, F_SETFL, flags) < 0) {		int err = errno;		LOG_ERROR("fcntl(fd %d, F_SETFL, 0x%x) returns err %d\n", fd, flags, err);		return err;	}	return 0;}int rn_sigio_add(struct rn_sigio *this,int fd, rn_callback_fn_t pfn, void *data){	int i, n;	int err;	/* Resize array indexed by fd if fd is beyond what we've seen. */	if (fd >= this->m_fds_alloc) {		rn_client_t *newfds;		n = this->m_fds_alloc * 2;		if (n < fd + 1)			n = fd + 1;		newfds = (rn_client_t *)realloc(this->m_fds, n * sizeof(rn_client_t));		if (!newfds)			return ENOMEM;		for (i=this->m_fds_alloc; i<n; i++) {			newfds[i].pfn = NULL;			newfds[i].data = NULL;		}		this->m_fds = newfds;		this->m_fds_alloc = n;	}	/* Set this fd to emit the right signal. */	if (fcntl(fd, F_SETSIG, this->m_signum) < 0) {		err = errno;		LOG_ERROR("add: fcntl(fd %d, F_SETSIG, %d) returns err %d\n",				fd, this->m_signum, err);		return err;	}	/* Update limits. */	this->m_fds_used++;	/* Start out claiming "all ready", and let user program try 	   reading/writing/accept/connecting.  An EWOULDBLOCK should be harmless;	   the user must then call clearReadiness() to tell us we were wrong.	   This should handle the case where the fd is already ready for something	   when we start.  (FIXME: Could call poll() here, instead.  Should we?)	*/	this->m_fds[fd].pfn = pfn;	this->m_fds[fd].data = data;	DPRINT("add(%d, %p, %p) this->m_fds_used %d\n", fd, pfn, data, this->m_fds_used);	return 0;}int rn_sigio_del(struct rn_sigio *this,int fd){	int err;	int flags;	DPRINT("del(fd %d)\n", fd);	/* Sanity checks */	if ((fd < 0) || (fd >= this->m_fds_alloc) || (this->m_fds_used == 0)) {		LOG_ERROR("del(fd %d): fd out of range\n", fd);		return EINVAL;	}#if 0	/* user must close */	/* Set this fd to no longer emit signals. */	flags = fcntl(fd, F_GETFL, 0);	if (flags < 0) {		err = errno;		LOG_ERROR("del: fcntl(fd %d, F_GETFL) returns err %d\n", fd, err);		return err;	}	flags &= ~O_ASYNC;	if (fcntl(fd, F_SETFL, flags) < 0) {		err = errno;		LOG_ERROR("del: fcntl(fd %d, F_SETFL, 0x%x) returns err %d\n",				fd, flags, err);		return err;	}#else	(void) err;	(void) flags;#endif	this->m_fds[fd].pfn = NULL;	this->m_fds[fd].data = NULL;	this->m_fds_used--;	return 0;}/** Sleep at most timeout_millisec waiting for an I/O readiness event on the file descriptors we're watching.   Call each descriptor's pfn if it's ready. @return 0 on success, EWOULDBLOCK if no events ready, EBADF if you forgot to close an fd after rn_del() */int rn_sigio_waitAndDispatchEvents(struct rn_sigio *this, int timeout_millisec){	int fd;	int signum;	siginfo_t info;	struct timespec timeout;	rn_pollevent_t event;	int overflowed = FALSE;	int handled = 0;	int saw_stale = FALSE;	timeout.tv_sec = (unsigned int)timeout_millisec / 1000U;	timeout.tv_nsec = ((unsigned int)timeout_millisec % 1000U) * 1000000;	/* Pull signals off the queue until we would block. */	do {		DPRINT("calling sigtimedwait with timeout %lu,%lu\n", 			(unsigned long)timeout.tv_sec, (unsigned long)timeout.tv_nsec);		signum = sigtimedwait(&this->m_sigset, &info, &timeout);		/* must do this, since caller may want quicker timeout		 * as a result of our first few callbacks		 */		timeout.tv_sec = 0;		timeout.tv_nsec = 0;		if (signum == -1)		    DPRINT("sigtimedwait returns -1, errno %d\n", errno);		else		    DPRINT("sigtimedwait returns %d, fd %d, band %lx\n",			signum, info.si_fd, info.si_band);		if (signum == -1) 			break;		if (signum == SIGIO) {			/* uh-oh. the realtime signal queue overflowed.  ditch all			 * remaining signals, and call poll() to get current status.			 */			overflowed = TRUE;			break;		}		assert(signum == this->m_signum);		/* Remember the new event */		fd = info.si_fd;		if ((fd < 0) || (fd >= this->m_fds_alloc) || (this->m_fds_used == 0) || !this->m_fds[fd].pfn) {			DPRINT("waitForEvents: ignoring event on fd %d.  alloc %d used %d\n", 				fd, this->m_fds_alloc, this->m_fds_used);			/* silently ignore.  Might be stale (aren't time skews fun?) */			saw_stale = TRUE;			continue;		}		event.fd = fd;		event.revents = info.si_band & (POLLIN|POLLPRI|POLLOUT|POLLERR|POLLHUP|POLLNVAL);		event.client = this->m_fds[fd];		event.client.pfn(&event);	} while (handled++ < 200);	if (overflowed) {		rn_pollevent_t event;		DPRINT("waitForEvents: SIGIO received.  Normal under very heavy load.\n");		/* We missed some events.  Ditch remaining signals.  */		signal(this->m_signum, SIG_IGN);	/* POSIX says this clears the queue */		/* Make sure that cleared the queue.  (Note that timeout is zero here.)		 * assert(sigtimedwait(&this->m_sigset, &info, &timeout) != this->m_signum);		 * Can't leave signal ignored, or it might be.  (POSIX is fuzzy here.)		 */		signal(this->m_signum, SIG_DFL);		/* send 'everything ready' to all clients. */		for (fd=0; fd<this->m_fds_alloc; fd++) {			if (this->m_fds[fd].pfn) {				event.fd = fd;				event.revents = (POLLIN|POLLOUT);				event.client = this->m_fds[fd];				event.client.pfn(&event);			}		}	}	if (saw_stale)		return EBADF;	if (!handled)		return EWOULDBLOCK;	return 0;}#elseenum { foo } empty;	/* ansi c forbids empty files */#endif

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
看电影不卡的网站| 国产黄色91视频| 2021国产精品久久精品| 99精品桃花视频在线观看| 蜜臀av一区二区| 亚洲永久免费av| 国产精品私人自拍| 日韩视频一区二区三区在线播放| 91在线视频网址| 国产麻豆视频一区二区| 日本最新不卡在线| 亚洲免费资源在线播放| 国产三级精品视频| 欧美成人高清电影在线| 欧美三区在线观看| 91理论电影在线观看| 国产91精品一区二区麻豆亚洲| 午夜精品成人在线视频| 亚洲欧美日韩国产手机在线| 久久精品人人做| 欧美tickling挠脚心丨vk| 欧美日本乱大交xxxxx| 色婷婷激情一区二区三区| 欧美一区二区性放荡片| 99久久精品免费看| 粉嫩aⅴ一区二区三区四区| 免费看日韩精品| 首页综合国产亚洲丝袜| 亚洲国产精品一区二区尤物区| 亚洲色图色小说| 国产精品国产三级国产aⅴ无密码| 欧美精品一区二| 精品伦理精品一区| 精品三级av在线| 精品入口麻豆88视频| 日韩欧美国产综合一区 | 久久亚洲捆绑美女| 91精品国产91久久综合桃花| 欧美狂野另类xxxxoooo| 欧美日韩五月天| 欧美伦理电影网| 69堂亚洲精品首页| 欧美一区二区三区在线视频| 337p亚洲精品色噜噜噜| 日韩视频一区二区在线观看| 日韩欧美的一区| 久久女同性恋中文字幕| 国产午夜精品福利| 中文字幕在线视频一区| 亚洲人精品午夜| 亚洲国产欧美一区二区三区丁香婷| 亚洲一级二级三级| 性做久久久久久免费观看欧美| 午夜精品福利一区二区三区av| 三级久久三级久久| 免费欧美高清视频| 国产精品99久久久久久宅男| av在线不卡网| 在线免费观看日韩欧美| 91精品国产高清一区二区三区蜜臀| 欧美一区二区三区公司| 精品三级在线观看| 国产精品入口麻豆九色| 亚洲女同ⅹxx女同tv| 香港成人在线视频| 久久国产剧场电影| 成人黄色软件下载| 色爱区综合激月婷婷| 欧美高清激情brazzers| 欧美精品一区二区三区蜜桃| 国产精品盗摄一区二区三区| 亚洲图片欧美色图| 老司机午夜精品99久久| 成人激情小说乱人伦| 在线免费观看视频一区| 欧美电影免费提供在线观看| 亚洲国产高清在线观看视频| 亚洲自拍偷拍麻豆| 国产在线精品免费| 色一情一伦一子一伦一区| 欧美一区二区三区日韩| 国产精品电影一区二区| 日产欧产美韩系列久久99| 国产suv一区二区三区88区| 91久久精品一区二区二区| 日韩视频在线你懂得| 中文字幕一区二区三区不卡| 日韩成人一级片| 成人av网站在线观看免费| 欧美久久久一区| 国产精品不卡在线观看| 日韩精品国产精品| 成人黄色软件下载| 日韩网站在线看片你懂的| 亚洲视频综合在线| 国产麻豆精品在线观看| 欧美日韩视频在线一区二区 | 亚洲一区二区三区影院| 国产一区二区三区四区在线观看| 色香色香欲天天天影视综合网 | 最好看的中文字幕久久| 日本不卡的三区四区五区| caoporn国产一区二区| 精品久久久久久久久久久院品网 | 久久天堂av综合合色蜜桃网| 亚洲精品国久久99热| 国产一区在线视频| 欧美日韩国产美| 日韩伦理av电影| 国产成人在线影院| 欧美一二三四在线| 亚洲图片一区二区| 91一区二区三区在线播放| 久久久久久久久久久久电影| 日本成人超碰在线观看| 色婷婷亚洲婷婷| 最新国产精品久久精品| 风间由美性色一区二区三区| 日韩免费视频一区| 日韩黄色免费电影| 亚洲自拍偷拍欧美| 色欧美88888久久久久久影院| 亚洲免费观看高清| 精品一区二区三区不卡| 欧美人成免费网站| 中文字幕在线观看一区| 国产精品一级二级三级| 精品久久久久久无| 久久电影网站中文字幕| 欧美一卡2卡3卡4卡| 偷拍亚洲欧洲综合| 欧美乱妇一区二区三区不卡视频| 一二三区精品视频| 在线亚洲+欧美+日本专区| 综合久久综合久久| 91免费观看视频| 亚洲男女毛片无遮挡| 色诱视频网站一区| 亚洲丝袜精品丝袜在线| 色综合一个色综合亚洲| 亚洲视频一区二区免费在线观看| 日韩欧美综合在线| 日本亚洲三级在线| 日韩欧美国产三级电影视频| 久久电影网电视剧免费观看| 久久影视一区二区| 国产原创一区二区| 国产精品欧美一区二区三区| 岛国av在线一区| 亚洲欧洲成人精品av97| 一本色道久久综合亚洲aⅴ蜜桃| 一区二区三区欧美日韩| 欧美性做爰猛烈叫床潮| 丝瓜av网站精品一区二区| 欧美一卡在线观看| 国产一区91精品张津瑜| 中文字幕av一区二区三区免费看| 国产高清无密码一区二区三区| 国产喷白浆一区二区三区| av成人动漫在线观看| 亚洲一级二级三级| 日韩视频在线你懂得| 国产一区二区精品久久| 国产精品久久久久久久久久久免费看| 91香蕉视频黄| 婷婷开心激情综合| 久久久久久久久97黄色工厂| 成人a级免费电影| 亚洲午夜免费福利视频| 日韩视频一区在线观看| 成人午夜激情在线| 亚洲精品写真福利| 日韩免费一区二区三区在线播放| 风间由美一区二区av101| 一区二区三区欧美日| 欧美va在线播放| 91丨porny丨户外露出| 日韩激情一二三区| 国产精品丝袜在线| 欧美日韩成人在线| 粉嫩aⅴ一区二区三区四区五区| 亚洲精品视频在线观看免费| 日韩精品最新网址| 91浏览器在线视频| 精品一区二区三区av| 一片黄亚洲嫩模| 26uuu久久天堂性欧美| 欧美中文字幕一二三区视频| 国产在线精品视频| 亚洲一区二区欧美激情| 国产视频一区在线观看| 欧美精品第1页| zzijzzij亚洲日本少妇熟睡| 奇米色777欧美一区二区| 亚洲欧洲另类国产综合| 欧美成人a在线| 精品视频在线视频| 成人福利视频网站| 激情av综合网| 午夜视频一区在线观看|