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

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

?? htevtlst.c

?? www工具包. 這是W3C官方支持的www支撐庫. 其中提供通用目的的客戶端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*				    				     HTEvtLst.c**	EVENT MANAGER****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTEvtLst.c,v 2.45 2000/08/02 10:38:07 kahan Exp $****	Updated HTEvent module **	This new module combines the functions of the old HTEvent module and **	the HTThread module. We retain the old HTThread module, but it**	consists of calls to the HTEvent interfaces**** Authors:**	HFN	Henrik Frystyk <frystyk@w3.org>**	CLB    	Charlie Brooks <cbrooks@osf.org>** Bugs***//*   WSAAsyncSelect and windows app stuff need the following definitions: *   WWW_WIN_ASYNC - enable WSAAsyncSelect instead of select *   _WIN23 - win32 libararies - may be window or console app *   _WINSOCKAPI_ - using WINSOCK.DLL - not necessarily the async routines. *   _CONSOLE - the console app for NT * * first pass: EGP - 10/26/95 *//* Implementation dependent include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "HTReqMan.h"#include "HTTimer.h"#include "HTEvent.h"#include "HTEvtLst.h"					 /* Implemented here *//* Type definitions and global variables etc. local to this module */#define MILLI_PER_SECOND	1000#define HASH(s)			((s) % HT_M_HASH_SIZE) #define EVENTS_TO_EXECUTE	10 /* how many to execute in one select loop */#define HT_FS_BYTES(a)		((((a)/16)+1) * 4)typedef struct {    SOCKET 	s ;	 		/* our socket */    HTEvent * 	events[HTEvent_TYPES];	/* event parameters for read, write, oob */    HTTimer *	timeouts[HTEvent_TYPES];} SockEvents;typedef struct {    HTEvent *	event;    SOCKET	s;    HTEventType	type;    HTPriority	skipped;} EventOrder;typedef enum {    SockEvents_mayCreate,    SockEvents_find} SockEvents_action;PRIVATE HTList * HashTable [HT_M_HASH_SIZE]; PRIVATE HTList * EventOrderList = NULL;PRIVATE int HTEndLoop = 0;		       /* If !0 then exit event loop */PRIVATE BOOL HTInLoop = NO;#ifdef WWW_WIN_ASYNC#define TIMEOUT	1 /* WM_TIMER id */PRIVATE HWND HTSocketWin;PRIVATE ATOM HTclass;PRIVATE HINSTANCE HTinstance;PRIVATE unsigned long HTwinMsg;#else /* WWW_WIN_ASYNC */PRIVATE fd_set FdArray[HTEvent_TYPES];PRIVATE SOCKET MaxSock = 0;			  /* max socket value in use */#endif /* !WWW_WIN_ASYNC *//* ------------------------------------------------------------------------- *//* 				DEBUG FUNCTIONS	    		             *//* ------------------------------------------------------------------------- */#ifdef HTDEBUGPRIVATE void Event_trace (HTEvent * event){    if (event) {	HTTRACE(ALL_TRACE, "%8p: %3d %6d %8p %8p %8p" _		event _ event->priority _ event->millis _ event->cbf _		event->param _ event->request);    }}PRIVATE void Event_traceHead (void){    HTTRACE(ALL_TRACE, "     event: pri millis  callback   param    request  ");}PRIVATE void Timer_trace (HTTimer * timer){    if (timer) {	HTTRACE(ALL_TRACE, "%8p: %6d %ld %c %8p" _		timer _		HTTimer_expiresAbsolute(timer) _		HTTimer_expiresRelative(timer) _		HTTimer_isRelative(timer) ? 'R' : 'A' _		HTTimer_callback(timer));    }}PRIVATE void Timer_traceHead (void){    HTTRACE(ALL_TRACE, "     timer: millis expires ?   param   callback  ");}/***  A simple debug function that dumps all the socket arrays**  as trace messages*/PRIVATE void EventList_dump (void){    int v = 0;    HTList* cur;    SockEvents * pres;    HTTRACE(ALL_TRACE, "Event....... Dumping socket events\n");    HTTRACE(ALL_TRACE, "soc ");    Event_traceHead();    HTTRACE(ALL_TRACE, " ");    Timer_traceHead();    HTTRACE(ALL_TRACE, "\n");    for (v = 0; v < HT_M_HASH_SIZE; v++) {	cur = HashTable[v];	while ((pres = (SockEvents *) HTList_nextObject(cur))) {	    int i;	    HTTRACE(ALL_TRACE, "%3d \n" _ pres->s);	    for (i = 0; i < HTEvent_TYPES; i++)		if (pres->events[i]) {		    static char * names[HTEvent_TYPES] = {"read", "writ", "xcpt"};		    HTTRACE(ALL_TRACE, "%s " _ names[i]);		    Event_trace(pres->events[i]);		    HTTRACE(ALL_TRACE, " ");		    Timer_trace(pres->timeouts[i]);		    HTTRACE(ALL_TRACE, " ");		}	    HTTRACE(ALL_TRACE, "\n");	}    }}PRIVATE void fd_dump (SOCKET maxfs, fd_set * rset, fd_set * wset, fd_set * oset, 		      struct timeval * wt){    SOCKET cnt;    /* Check read set */    HTTRACE(THD_TRACE, "............ READ :");    for (cnt=0; cnt<=maxfs; cnt++)	if (FD_ISSET(cnt, rset)) HTTRACE(THD_TRACE, " %d" _ cnt);    HTTRACE(THD_TRACE, "\n");    /* Check write set */    HTTRACE(THD_TRACE, "............ WRITE:");    for (cnt=0; cnt<=maxfs; cnt++)	if (FD_ISSET(cnt, wset)) HTTRACE(THD_TRACE, " %d" _ cnt);    HTTRACE(THD_TRACE, "\n");    /* Check oob set */    HTTRACE(THD_TRACE, "............ OOB  :");    for (cnt=0; cnt<=maxfs; cnt++)	if (FD_ISSET(cnt, oset)) HTTRACE(THD_TRACE, " %d" _ cnt);    HTTRACE(THD_TRACE, "\n");    if (wt)	HTTRACE(THD_TRACE, "............ Timeout is %ld s, %ld microsecs\n" _		wt->tv_sec _ wt->tv_usec);}#endif /* HTDEBUG *//* ------------------------------------------------------------------------- *//*		           EVENT TIMING FUNCTIONS			     *//* ------------------------------------------------------------------------- */#ifdef WWW_WIN_ASYNCPRIVATE BOOL Timer_setWindowsTimer (HTTimer * timer){    UINT id;    HWND hwnd = HTEventList_getWinHandle(&id);    BOOL status = (SetTimer(hwnd, (UINT)timer, (UINT)HTTimer_getTime(timer), NULL) == 0) ? NO : YES;    return status;}PRIVATE BOOL Timer_deleteWindowsTimer (HTTimer * timer){    UINT id;    HWND hwnd = HTEventList_getWinHandle(&id);    BOOL status = (KillTimer(hwnd, (UINT)timer) == 0) ? NO : YES;    return status;}#endif /* WWW_WIN_ASYNC *//***  Event timeout handler**  If an event didn't occur before the timeout then call it explicitly**  indicating that it timed out.*/PRIVATE int EventListTimerHandler (HTTimer * timer, void * param, HTEventType type){    SockEvents * sockp = (SockEvents *) param;    HTEvent * event = NULL;    /* Check for read timeout */    if (sockp->timeouts[HTEvent_INDEX(HTEvent_READ)] == timer) {	event = sockp->events[HTEvent_INDEX(HTEvent_READ)];	HTTRACE(THD_TRACE, "Event....... READ timed out on %d.\n" _ sockp->s);	return (*event->cbf) (sockp->s, event->param, HTEvent_TIMEOUT);    }    /* Check for write timeout */    if (sockp->timeouts[HTEvent_INDEX(HTEvent_WRITE)] == timer) {	event = sockp->events[HTEvent_INDEX(HTEvent_WRITE)];	HTTRACE(THD_TRACE, "Event....... WRITE timed out on %d.\n" _ sockp->s);	return (*event->cbf) (sockp->s, event->param, HTEvent_TIMEOUT);    }    /* Check for out-of-band data timeout */    if (sockp->timeouts[HTEvent_INDEX(HTEvent_OOB)] == timer) {	event = sockp->events[HTEvent_INDEX(HTEvent_OOB)];	HTTRACE(THD_TRACE, "Event....... OOB timed out on %d.\n" _ sockp->s);	return (*event->cbf) (sockp->s, event->param, HTEvent_TIMEOUT);    }    HTTRACE(THD_TRACE, "Event....... No event for timer %p with context %p\n" _ timer _ param);    return HT_ERROR;}PUBLIC void CheckSockEvent (HTTimer * timer, HTTimerCallback * cbf, void * param){    SockEvents * sockp = (SockEvents *)param;    if (cbf == EventListTimerHandler && 	sockp->timeouts[0] != timer && 	sockp->timeouts[1] != timer && 	sockp->timeouts[2] != timer) {	HTDEBUGBREAK("Bad timer %p\n" _ timer);    }}/* ------------------------------------------------------------------------- *//*		             EVENT ORDERING STUFF			     *//* ------------------------------------------------------------------------- */PRIVATE SockEvents * SockEvents_get (SOCKET s, SockEvents_action action){    long v = HASH(s);    HTList* cur;    SockEvents * pres;    /* if the socket doesn't exists, don't do anything */    if (s == INVSOC)      return NULL;    if (HashTable[v] == NULL) HashTable[v] = HTList_new();    cur = HashTable[v];    while ((pres = (SockEvents *) HTList_nextObject(cur)))	if (pres->s == s) return pres;    if (action == SockEvents_mayCreate) {        if ((pres = (SockEvents *) HT_CALLOC(1, sizeof(SockEvents))) == NULL)	    HT_OUTOFMEM("HTEventList_register");	pres->s = s;	HTList_addObject(HashTable[v], (void *)pres);	return pres;    }    return NULL;}PRIVATE int EventOrder_add (SOCKET s, HTEventType type, ms_t now){    EventOrder * pres;    HTList * cur = EventOrderList;    HTList * insertAfter = cur;    SockEvents * sockp = SockEvents_get(s, SockEvents_find);    HTEvent * event;    if (sockp == NULL || (event = sockp->events[HTEvent_INDEX(type)]) == NULL) {	HTTRACE(THD_TRACE, "EventOrder.. no event found for socket %d, type %s.\n" _		s _ HTEvent_type2str(type));	return HT_ERROR;    }    /*	Fixup the timeout */    if (sockp->timeouts[HTEvent_INDEX(type)])	HTTimer_refresh(sockp->timeouts[HTEvent_INDEX(type)], now);    /* Look to see if it's already here from before */    while ((pres = (EventOrder *) HTList_nextObject(cur))) {	if (pres->s == s && pres->event == event && pres->type == type) {	    pres->skipped++;	    return HT_OK;	}	if (pres->event->priority+pres->skipped > event->priority)	    insertAfter = cur;    }    /* Create a new element */    if ((pres = (EventOrder *) HT_CALLOC(1, sizeof(EventOrder))) == NULL)	HT_OUTOFMEM("EventOrder_add");    pres->event = event;    pres->s = s;    pres->type = type;    HTList_addObject(insertAfter, (void *)pres);    return HT_OK;}PUBLIC int EventOrder_executeAndDelete (void) {    HTList * cur = EventOrderList;    EventOrder * pres;    int i = 0;    HTTRACE(THD_TRACE, "EventOrder.. execute ordered events\n");    if (cur == NULL) return NO;    while ((pres=(EventOrder *) HTList_removeLastObject(cur)) && i<EVENTS_TO_EXECUTE) {	HTEvent * event = pres->event;	int ret;	HTTRACE(THD_TRACE, "EventList... calling socket %d, request %p handler %p type %s\n" _ 		    pres->s _ (void *) event->request _ 		    (void *) event->cbf _ HTEvent_type2str(pres->type));	ret = (*pres->event->cbf)(pres->s, pres->event->param, pres->type);	HT_FREE(pres);	if (ret != HT_OK) return ret;	i++;    }    return HT_OK;}PRIVATE BOOL EventOrder_clearAll (void){    HTList * cur = EventOrderList;    EventOrder * pres;    HTTRACE(THD_TRACE, "EventOrder.. Clearing all ordered events\n");    if (cur) {	while ((pres = (EventOrder *) HTList_nextObject(cur)))	    HT_FREE(pres);	return YES;    }    return NO;}PUBLIC BOOL EventOrder_deleteAll (void) {    EventOrder_clearAll();    HTList_delete(EventOrderList);    EventOrderList = NULL;    return YES;}/* ------------------------------------------------------------------------- *//*				EVENT REGISTRATION			     *//* ------------------------------------------------------------------------- *//*** ResetMaxSock - reset the value of the maximum socket in use */#ifndef WWW_WIN_ASYNCPRIVATE void __ResetMaxSock (void){    SOCKET cnt;    SOCKET t_max = 0;    SOCKET old_max = MaxSock;    for (cnt = 0 ; cnt <= MaxSock; cnt++) { 	if (FD_ISSET(cnt, (FdArray + HTEvent_INDEX(HTEvent_READ))) ||	    FD_ISSET(cnt, (FdArray + HTEvent_INDEX(HTEvent_WRITE))) ||	    FD_ISSET(cnt, (FdArray + HTEvent_INDEX(HTEvent_OOB))))  	    if (cnt > t_max) t_max = cnt;    }    MaxSock = t_max+1;    HTTRACE(THD_TRACE, "Event....... Reset MaxSock from %u to %u\n" _ old_max _ MaxSock);    return;}  #endif /* !WWW_WIN_ASYNC */PRIVATE int EventList_remaining (SockEvents * pres){    int ret = 0;    int i;    for (i = 0; i < HTEvent_TYPES; i++)	if (pres->events[i] != NULL)	    ret |= 1<<i;    return ret;}/***  For a given socket, reqister a request structure, a set of operations, **  a HTEventCallback function, and a priority. For this implementation, **  we allow only a single HTEventCallback function for all operations.**  and the priority field is ignored.*/PUBLIC int HTEventList_register (SOCKET s, HTEventType type, HTEvent * event){    int newset = 0;    SockEvents * sockp;    HTTRACE(THD_TRACE, "Event....... Register socket %d, request %p handler %p type %s at priority %d\n" _ 		s _ (void *) event->request _ 		(void *) event->cbf _ HTEvent_type2str(type) _ 		(unsigned) event->priority);    if (s==INVSOC || HTEvent_INDEX(type) >= HTEvent_TYPES)	return 0;    /*    ** Insert socket into appropriate file descriptor set. We also make sure    ** that it is registered in the global set.    */    HTTRACE(THD_TRACE, "Event....... Registering socket for %s\n" _ HTEvent_type2str(type));    sockp = SockEvents_get(s, SockEvents_mayCreate);    sockp->s = s;    sockp->events[HTEvent_INDEX(type)] = event;    newset = EventList_remaining(sockp);#ifdef WWW_WIN_ASYNC    if (WSAAsyncSelect(s, HTSocketWin, HTwinMsg, HTEvent_BITS(newset)) < 0) {        HTTRACE(THD_TRACE, "Event....... WSAAsyncSelect returned `%s'!" _ HTErrnoString(socerrno));	return HT_ERROR;    }#else /* WWW_WIN_ASYNC */    FD_SET(s, FdArray+HTEvent_INDEX(type));    HTTRACEDATA((char *) FdArray+HTEvent_INDEX(type), 8, "HTEventList_register: (s:%d)" _ s);    if (s > MaxSock) {	MaxSock = s ;	HTTRACE(THD_TRACE, "Event....... New value for MaxSock is %d\n" _ MaxSock);    }#endif /* !WWW_WIN_ASYNC */    /*    **  If the timeout has been set (relative in millis) then we register     **  a new timeout for this event unless we already have a timer.    */    if (event->millis >= 0) {	sockp->timeouts[HTEvent_INDEX(type)] =	    HTTimer_new(sockp->timeouts[HTEvent_INDEX(type)],			EventListTimerHandler, sockp, event->millis, YES, YES);    }    return HT_OK;}/*** Remove the registered information for the specified socket for the actions ** specified in ops. if no actions remain after the unregister, the registered** info is deleted, and, if the socket has been registered for notification, ** the HTEventCallback will be invoked.*/PUBLIC int HTEventList_unregister (SOCKET s, HTEventType type) {    long 		v = HASH(s);    HTList * 		cur = HashTable[v];    HTList * 		last = cur;    SockEvents *	pres;    int			ret = HT_ERROR;    /* if the socket doesn't exists, don't do anything */    if (s == INVSOC)      return HT_OK;    while (cur && (pres = (SockEvents *) HTList_nextObject(cur))) {        if (pres->s == s) {	    int	remaining = 0;	    /*	    **  Unregister the event from this action	    */	    pres->events[HTEvent_INDEX(type)] = NULL;            remaining = EventList_remaining(pres);	    /*	    **  Check to see of there was a timeout connected with the event.	    **  If so then delete the timeout as well.	    */	    {		HTTimer * timer = pres->timeouts[HTEvent_INDEX(type)];                if (timer) HTTimer_delete(timer);                pres->timeouts[HTEvent_INDEX(type)] = NULL;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产精品一区二区夜夜嗨| 国产欧美日韩视频在线观看| 日韩精品一区二区三区swag| 欧美午夜一区二区三区| 欧美一区二区免费| 国产精品嫩草久久久久| 一级特黄大欧美久久久| 久久99精品久久久久久国产越南 | 精品国产伦一区二区三区免费| 日韩欧美123| 国产精品久久久久久久久免费樱桃| 亚洲国产视频一区二区| 午夜激情一区二区三区| 国产成人综合在线播放| 欧美日韩www| 久久综合九色综合欧美亚洲| 亚洲狠狠丁香婷婷综合久久久| 蜜臀99久久精品久久久久久软件| 91影院在线免费观看| 精品国产伦一区二区三区观看方式 | 三级不卡在线观看| 色香蕉久久蜜桃| 日韩限制级电影在线观看| 中文字幕一区二区三区视频| 国产乱子伦一区二区三区国色天香| 91电影在线观看| 欧美国产日韩一二三区| 国模娜娜一区二区三区| 欧洲色大大久久| 亚洲天天做日日做天天谢日日欢 | 国产精品一卡二卡| 欧美电影在哪看比较好| 国产精品无遮挡| 免费视频最近日韩| 欧美日韩视频在线观看一区二区三区 | 国产毛片精品视频| 日韩西西人体444www| 亚洲一区二区三区中文字幕| 色欧美日韩亚洲| 国产精品网站在线| 国产成人av一区| 久久精品人人做人人爽人人| 婷婷夜色潮精品综合在线| 91麻豆自制传媒国产之光| 中文字幕av资源一区| 日本久久精品电影| 欧美日精品一区视频| 亚洲高清免费一级二级三级| 7777精品伊人久久久大香线蕉完整版| 午夜av一区二区三区| 日韩欧美中文字幕一区| 国产综合久久久久久鬼色| 国产精品三级av在线播放| 色屁屁一区二区| 日韩高清不卡在线| 国产亚洲一区字幕| 91久久精品一区二区三区| 日本视频免费一区| 久久精品夜色噜噜亚洲a∨| 色94色欧美sute亚洲线路一ni | 精品成人一区二区| 成人av第一页| 天堂av在线一区| 国产欧美精品一区| 欧美日韩的一区二区| 国产成人精品一区二区三区四区| 亚洲欧洲中文日韩久久av乱码| 欧美精品粉嫩高潮一区二区| 国产美女主播视频一区| 亚洲第一成人在线| 亚洲国产精品av| 制服丝袜亚洲精品中文字幕| www.欧美日韩国产在线| 丝袜国产日韩另类美女| 久久久国产一区二区三区四区小说 | 亚洲小说欧美激情另类| 久久丝袜美腿综合| 欧美视频在线不卡| 国产风韵犹存在线视精品| 亚洲国产色一区| 中文字幕免费一区| 欧美成人伊人久久综合网| 色婷婷av一区二区三区gif| 久久er精品视频| 亚洲国产成人精品视频| 国产精品色一区二区三区| 欧美一区二区三区影视| 99精品桃花视频在线观看| 另类人妖一区二区av| 亚洲一区二区三区在线| 中文字幕中文字幕一区二区| 欧美大片日本大片免费观看| 欧美三级视频在线观看| 91老师国产黑色丝袜在线| 福利电影一区二区三区| 久久99国产乱子伦精品免费| 亚洲成av人片一区二区梦乃| 亚洲欧美偷拍另类a∨色屁股| 精品久久五月天| 日韩一区二区免费在线电影| 欧美午夜精品电影| 欧美性色欧美a在线播放| 成人av在线播放网站| 国产精品一二二区| 国产一区二区伦理| 国产在线精品免费av| 国内精品写真在线观看| 免费国产亚洲视频| 蜜臀av在线播放一区二区三区| 午夜精彩视频在线观看不卡| 亚洲国产精品综合小说图片区| 亚洲综合自拍偷拍| 亚洲国产人成综合网站| 亚洲妇女屁股眼交7| 亚洲综合激情网| 亚洲成人7777| 日韩av在线播放中文字幕| 午夜av区久久| 久久99精品久久久久久久久久久久| 麻豆视频一区二区| 狠狠久久亚洲欧美| 国产不卡一区视频| 成人听书哪个软件好| proumb性欧美在线观看| 91色porny| 欧美日韩美少妇| 7777精品伊人久久久大香线蕉| 日韩一区二区三区电影在线观看| 日韩欧美黄色影院| 国产亚洲欧美激情| 国产精品高潮久久久久无| 亚洲乱码国产乱码精品精98午夜| 亚洲综合一区二区三区| 肉色丝袜一区二区| 国产一区二区精品久久| proumb性欧美在线观看| 欧美日韩在线播放一区| 欧美成人aa大片| 国产精品电影一区二区三区| 亚洲国产精品久久一线不卡| 久久99最新地址| 成人美女视频在线看| 在线看日韩精品电影| 欧美一激情一区二区三区| 久久亚洲综合av| 亚洲欧美日韩中文字幕一区二区三区| 亚洲福利视频一区二区| 国产一区二区精品久久| 色婷婷精品久久二区二区蜜臂av | 另类人妖一区二区av| 国产精品18久久久久久久网站| 成人午夜激情在线| 在线播放中文字幕一区| 久久久精品免费网站| 亚洲自拍与偷拍| 国产精品白丝jk白祙喷水网站| 色综合久久久久| 精品国产第一区二区三区观看体验| 亚洲人成影院在线观看| 理论片日本一区| 在线影视一区二区三区| 国产亚洲欧美日韩在线一区| 日日夜夜免费精品视频| 99久久婷婷国产综合精品| 日韩一区二区在线观看视频播放| 成人免费视频在线观看| 久久 天天综合| 欧美色图片你懂的| 国产精品网站在线播放| 激情丁香综合五月| 51精品秘密在线观看| 最好看的中文字幕久久| 国产成人在线视频网站| 91精品福利在线一区二区三区 | 激情综合一区二区三区| 欧美在线观看视频一区二区| 日本一区二区免费在线观看视频| 午夜视频一区二区三区| 97精品国产露脸对白| 久久免费午夜影院| 麻豆精品国产91久久久久久| 欧美性xxxxxxxx| 亚洲愉拍自拍另类高清精品| www.日韩在线| 国产精品你懂的在线| 成人一区二区三区中文字幕| 精品国产青草久久久久福利| 免费在线观看精品| 欧美一级国产精品| 天天亚洲美女在线视频| 欧美视频在线观看一区二区| 亚洲乱码一区二区三区在线观看| eeuss影院一区二区三区| 久久久久久久久久美女| 国产一区二区三区久久悠悠色av | 亚洲精品国产精华液| 白白色亚洲国产精品| 欧美国产日韩一二三区| 成人精品电影在线观看| 综合久久久久久|