⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventlib.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
		new->u.timer.this = nextTimer;		opaqueEv->opaque = new;		return (0);	}	/* No timers, so there should be a ready file descriptor. */	x = 0;	while (ctx->fdCount > 0) {		evFile *fid;		int fd, eventmask;		if (ctx->fdNext == NULL) {			if (++x == 2) {				/*				 * Hitting the end twice means that the last				 * select() found some FD's which have since				 * been deselected.				 *				 * On some systems, the count returned by				 * selects is the total number of bits in				 * all masks that are set, and on others it's				 * the number of fd's that have some bit set,				 * and on others, it's just broken.  We 				 * always assume that it's the number of				 * bits set in all masks, because that's what				 * the man page says it should do, and				 * the worst that can happen is we do an				 * extra select().				 */				ctx->fdCount = 0;				break;			}			ctx->fdNext = ctx->files;		}		fid = ctx->fdNext;		ctx->fdNext = fid->next;		fd = fid->fd;		eventmask = 0;		if (FD_ISSET(fd, &ctx->rdLast))			eventmask |= EV_READ;		if (FD_ISSET(fd, &ctx->wrLast))			eventmask |= EV_WRITE;		if (FD_ISSET(fd, &ctx->exLast))			eventmask |= EV_EXCEPT;		eventmask &= fid->eventmask;		if (eventmask != 0) {			if ((eventmask & EV_READ) != 0) {				FD_CLR(fd, &ctx->rdLast);				ctx->fdCount--;			}			if ((eventmask & EV_WRITE) != 0) {				FD_CLR(fd, &ctx->wrLast);				ctx->fdCount--;			}			if ((eventmask & EV_EXCEPT) != 0) {				FD_CLR(fd, &ctx->exLast);				ctx->fdCount--;			}			OKNEW(new);			new->type = File;			new->u.file.this = fid;			new->u.file.eventmask = eventmask;			opaqueEv->opaque = new;			return (0);		}	}	if (ctx->fdCount < 0) {		/*		 * select()'s count is off on a number of systems, and		 * can result in fdCount < 0.		 */		evPrintf(ctx, 4, "fdCount < 0 (%d)\n", ctx->fdCount);		ctx->fdCount = 0;	}	/* We get here if the caller deselect()'s an FD. Gag me with a goto. */	goto again;}intevDispatch(evContext opaqueCtx, evEvent opaqueEv) {	evContext_p *ctx = opaqueCtx.opaque;	evEvent_p *ev = opaqueEv.opaque;#ifdef EVENTLIB_TIME_CHECKS	void *func;	struct timespec start_time;	struct timespec interval;#endif#ifdef EVENTLIB_TIME_CHECKS	if (ctx->debug > 0)		start_time = evNowTime();#endif	ctx->cur = ev;	switch (ev->type) {	    case Accept: {		evAccept *this = ev->u.accept.this;		evPrintf(ctx, 5,			"Dispatch.Accept: fd %d -> %d, func %p, uap %p\n",			 this->conn->fd, this->fd,			 this->conn->func, this->conn->uap);		errno = this->ioErrno;		(this->conn->func)(opaqueCtx, this->conn->uap, this->fd,				   &this->la, this->lalen,				   &this->ra, this->ralen);#ifdef EVENTLIB_TIME_CHECKS		func = this->conn->func;#endif		break;	    }	    case File: {		evFile *this = ev->u.file.this;		int eventmask = ev->u.file.eventmask;		evPrintf(ctx, 5,			"Dispatch.File: fd %d, mask 0x%x, func %p, uap %p\n",			 this->fd, this->eventmask, this->func, this->uap);		(this->func)(opaqueCtx, this->uap, this->fd, eventmask);#ifdef EVENTLIB_TIME_CHECKS		func = this->func;#endif		break;	    }	    case Stream: {		evStream *this = ev->u.stream.this;		evPrintf(ctx, 5,			 "Dispatch.Stream: fd %d, func %p, uap %p\n",			 this->fd, this->func, this->uap);		errno = this->ioErrno;		(this->func)(opaqueCtx, this->uap, this->fd, this->ioDone);#ifdef EVENTLIB_TIME_CHECKS		func = this->func;#endif		break;	    }	    case Timer: {		evTimer *this = ev->u.timer.this;		evPrintf(ctx, 5, "Dispatch.Timer: func %p, uap %p\n",			 this->func, this->uap);		(this->func)(opaqueCtx, this->uap, this->due, this->inter);#ifdef EVENTLIB_TIME_CHECKS		func = this->func;#endif		break;	    }	    case Wait: {		evWait *this = ev->u.wait.this;		evPrintf(ctx, 5,			 "Dispatch.Wait: tag %p, func %p, uap %p\n",			 this->tag, this->func, this->uap);		(this->func)(opaqueCtx, this->uap, this->tag);#ifdef EVENTLIB_TIME_CHECKS		func = this->func;#endif		break;	    }	    case Null: {		/* No work. */#ifdef EVENTLIB_TIME_CHECKS		func = NULL;#endif		break;	    }	    default: {		abort();	    }	}#ifdef EVENTLIB_TIME_CHECKS	if (ctx->debug > 0) {		interval = evSubTime(evNowTime(), start_time);		/* 		 * Complain if it took longer than 50 milliseconds.		 *		 * We call getuid() to make an easy to find mark in a kernel		 * trace.		 */		if (interval.tv_sec > 0 || interval.tv_nsec > 50000000)			evPrintf(ctx, 1,			 "dispatch interval %u.%09u uid %d type %d func %p\n",				 interval.tv_sec, interval.tv_nsec,				 getuid(), ev->type, func);	}#endif	ctx->cur = NULL;	evDrop(opaqueCtx, opaqueEv);	return (0);}voidevDrop(evContext opaqueCtx, evEvent opaqueEv) {	evContext_p *ctx = opaqueCtx.opaque;	evEvent_p *ev = opaqueEv.opaque;	switch (ev->type) {	    case Accept: {		FREE(ev->u.accept.this);		break;	    }	    case File: {		/* No work. */		break;	    }	    case Stream: {		evStreamID id;		id.opaque = ev->u.stream.this;		(void) evCancelRW(opaqueCtx, id);		break;	    }	    case Timer: {		evTimer *this = ev->u.timer.this;		evTimerID opaque;		/* Check to see whether the user func cleared the timer. */		if (heap_element(ctx->timers, this->index) != this) {			evPrintf(ctx, 5, "Dispatch.Timer: timer rm'd?\n");			break;		}		/*		 * Timer is still there.  Delete it if it has expired,		 * otherwise set it according to its next interval.		 */		if (this->inter.tv_sec == (time_t)0 &&		    this->inter.tv_nsec == 0L) {			opaque.opaque = this;						(void) evClearTimer(opaqueCtx, opaque);		} else {			opaque.opaque = this;			(void) evResetTimer(opaqueCtx, opaque, this->func,					    this->uap,					    evAddTime((this->mode & EV_TMR_RATE) ?						      this->due :						      ctx->lastEventTime,						      this->inter),					    this->inter);		}		break;	    }	    case Wait: {		FREE(ev->u.wait.this);		break;	    }	    case Null: {		/* No work. */		break;	    }	    default: {		abort();	    }	}	FREE(ev);}intevMainLoop(evContext opaqueCtx) {	evEvent event;	int x;	while ((x = evGetNext(opaqueCtx, &event, EV_WAIT)) == 0)		if ((x = evDispatch(opaqueCtx, event)) < 0)			break;	return (x);}intevHighestFD(evContext opaqueCtx) {	evContext_p *ctx = opaqueCtx.opaque;	return (ctx->highestFD);}voidevPrintf(const evContext_p *ctx, int level, const char *fmt, ...) {	va_list ap;	va_start(ap, fmt);	if (ctx->output != NULL && ctx->debug >= level) {		vfprintf(ctx->output, fmt, ap);		fflush(ctx->output);	}	va_end(ap);}intevSetOption(evContext *opaqueCtx, const char *option, int value) {	/* evContext_p *ctx = opaqueCtx->opaque; */	UNUSED(opaqueCtx);	UNUSED(value);#ifndef CLOCK_MONOTONIC	UNUSED(option);#endif #ifdef CLOCK_MONOTONIC	if (strcmp(option, "monotime") == 0) {		if (opaqueCtx  != NULL)			errno = EINVAL;		if (value == 0 || value == 1) {			__evOptMonoTime = value;			return (0);		} else {			errno = EINVAL;			return (-1);		}	} #endif	errno = ENOENT;	return (-1);}intevGetOption(evContext *opaqueCtx, const char *option, int *value) {	/* evContext_p *ctx = opaqueCtx->opaque; */	UNUSED(opaqueCtx);#ifndef CLOCK_MONOTONIC	UNUSED(value);	UNUSED(option);#endif #ifdef CLOCK_MONOTONIC	if (strcmp(option, "monotime") == 0) {		if (opaqueCtx  != NULL)			errno = EINVAL;		*value = __evOptMonoTime;		return (0);	}#endif	errno = ENOENT;	return (-1);}#ifdef NEED_PSELECT/* XXX needs to move to the porting library. */static intpselect(int nfds, void *rfds, void *wfds, void *efds,	struct timespec *tsp,	const sigset_t *sigmask){	struct timeval tv, *tvp;	sigset_t sigs;	int n;	if (tsp) {		tvp = &tv;		tv = evTimeVal(*tsp);	} else		tvp = NULL;	if (sigmask)		sigprocmask(SIG_SETMASK, sigmask, &sigs);	n = select(nfds, rfds, wfds, efds, tvp);	if (sigmask)		sigprocmask(SIG_SETMASK, &sigs, NULL);	if (tsp)		*tsp = evTimeSpec(tv);	return (n);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -