示例#1
0
static void event_set_all(ACL_EVENT *eventp)
{
	EVENT_KERNEL *ev = (EVENT_KERNEL *) eventp;
	ACL_EVENT_FDTABLE *fdp;
	int   i;

	/* 优先处理添加读/写监控任务, 这样可以把中间的 ADD 状态转换成正式状态 */

	eventp->fdcnt_ready = 0;

	if (eventp->present - eventp->last_check >= eventp->check_inter) {
		eventp->last_check = eventp->present;
		event_check_fds(eventp);
	}

	/* 处理任务项 */

	while (1) {
		ACL_RING *r = acl_ring_pop_head(&ev->fdp_delay_list);
		if (r == NULL)
			break;
		fdp = acl_ring_to_appl(r, ACL_EVENT_FDTABLE, delay_entry);

		if ((fdp->flag & EVENT_FDTABLE_FLAG_ADD_READ)) {
			enable_read(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_ADD_WRITE)) {
			enable_write(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_DEL_READ)) {
			disable_read(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_DEL_WRITE)) {
			disable_write(ev, fdp);
		}

		fdp->flag &= ~EVENT_FDTABLE_FLAG_DELAY_OPER;
	}

	for (i = 0; i < eventp->fdcnt; i++) {
		fdp = eventp->fdtabs[i];
		if ((fdp->event_type & (ACL_EVENT_XCPT | ACL_EVENT_RW_TIMEOUT)))
			continue;
		if ((fdp->flag & EVENT_FDTABLE_FLAG_READ)
			&& (fdp->event_read == NULL || fdp->event_read->type == 0))
		{
			enable_read(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_WRITE)
			&& (fdp->event_write == NULL || fdp->event_write->type == 0))
		{
			enable_write(ev, fdp);
		}
	}
}
示例#2
0
static int32_t 
imp_engine_add(engine *e,handle *h,
			   generic_callback callback)
{
	assert(e && h && callback);
	if(h->e) return -EASSENG;
	int32_t ret;
#ifdef _LINUX
	ret = event_add(e,h,EPOLLRDHUP);
#elif   _BSD
	if((ret = event_add(e,h,EVFILT_READ)) == 0 &&
	   (ret = event_add(e,h,EVFILT_READ)) == 0){
		disable_read(h);
		disable_write(h)
	}else if(h->e){
示例#3
0
void aio_istream::gets(int timeout /* = 0 */, bool nonl /* = true */,
	acl_int64 delay /* = 0 */, aio_timer_reader* callback /* = NULL */)
{
	if (delay > 0)
	{
		// 设置新的或重置读延迟定时器

		disable_read();

		if (callback != NULL)
		{
			if (timer_reader_ != NULL)
			{
				handle_->del_timer(timer_reader_);
				timer_reader_->destroy();
			}
			timer_reader_= callback;
		}

		if (timer_reader_ == NULL)
			timer_reader_ = NEW aio_timer_reader();
		// 设置 timer_reader_ 对象的成员变量
		timer_reader_->in_ = this;
		timer_reader_->delay_gets_ = true;
		timer_reader_->delay_timeout_ = timeout;
		timer_reader_->delay_nonl_ = nonl;

		// 设置异步读定时器
		handle_->set_timer(timer_reader_, delay);
		return;
	}
	else if (timer_reader_ != NULL)
	{
		// 立即取消之前设置的异步读定时器
		handle_->del_timer(timer_reader_);
		timer_reader_->destroy();
		timer_reader_ = NULL;
	}

	// 设置流的异步读超时时间
	if (timeout >= 0)
		if (timeout >= 0)
			ACL_AIO_SET_TIMEOUT(stream_, timeout);
	if (nonl)
		acl_aio_gets_nonl(stream_);
	else
		acl_aio_gets(stream_);
}
示例#4
0
static void event_set_all(ACL_EVENT *eventp)
{
	EVENT_KERNEL *ev = (EVENT_KERNEL *) eventp;
	ACL_EVENT_FDTABLE *fdp;

	/* 优先处理添加读/写监控任务, 这样可以把 ADD 中间态转换成正式状态 */

	eventp->ready_cnt = 0;

	if (eventp->present - eventp->last_check >= eventp->check_inter
		|| eventp->read_ready > 0)
	{
		eventp->read_ready = 0;
		eventp->last_check = eventp->present;
		event_check_fds(eventp);
	}

	/* 处理任务项 */

	while (1) {
		ACL_RING *r = acl_ring_pop_head(&ev->fdp_delay_list);
		if (r == NULL)
			break;
		fdp = acl_ring_to_appl(r, ACL_EVENT_FDTABLE, delay_entry);

		if ((fdp->flag & EVENT_FDTABLE_FLAG_ADD_READ)) {
			enable_read(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_ADD_WRITE)) {
			enable_write(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_DEL_READ)) {
			disable_read(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_DEL_WRITE)) {
			disable_write(ev, fdp);
		}

		fdp->flag &= ~EVENT_FDTABLE_FLAG_DELAY_OPER;
	}
}
示例#5
0
static void event_set_all(ACL_EVENT *eventp)
{
	EVENT_KERNEL *ev = (EVENT_KERNEL *) eventp;
	ACL_EVENT_FDTABLE *fdp;
	int   i;

	/* 优先处理添加读/写监控任务, 这样可以把中间的 ADD 状态转换成正式状态 */

	eventp->fdcnt_ready = 0;

	if (eventp->event_present - ev->last_check >= 1000000) {
		ev->last_check = eventp->event_present;
		for (i = 0; i < eventp->fdcnt; i++) {
			fdp = eventp->fdtabs[i];
			if ((fdp->stream->flag & ACL_VSTREAM_FLAG_BAD) != 0) {
				fdp->stream->flag &= ~ACL_VSTREAM_FLAG_BAD;
				fdp->event_type |= ACL_EVENT_XCPT;
				fdp->fdidx_ready = eventp->fdcnt_ready;
				eventp->fdtabs_ready[eventp->fdcnt_ready++] = fdp;
			} else if ((fdp->flag & EVENT_FDTABLE_FLAG_READ)) {
				if (ACL_VSTREAM_BFRD_CNT(fdp->stream) > 0) {
					fdp->stream->sys_read_ready = 0;
					fdp->event_type |= ACL_EVENT_READ;
					fdp->fdidx_ready = eventp->fdcnt_ready;
					eventp->fdtabs_ready[eventp->fdcnt_ready++] = fdp;
				} else if (fdp->r_ttl > 0 &&  eventp->event_present > fdp->r_ttl) {
					fdp->event_type |= ACL_EVENT_RW_TIMEOUT;
					fdp->fdidx_ready = eventp->fdcnt_ready;
					eventp->fdtabs_ready[eventp->fdcnt_ready++] = fdp;
				}
			} else if ((fdp->flag & EVENT_FDTABLE_FLAG_WRITE)) {
				if (fdp->w_ttl > 0 && eventp->event_present > fdp->w_ttl) {
					fdp->event_type |= ACL_EVENT_RW_TIMEOUT;
					fdp->fdidx_ready = eventp->fdcnt_ready;
					eventp->fdtabs_ready[eventp->fdcnt_ready++] = fdp;
				}
			}
		}
	}

	/* 处理任务项 */

	while (1) {
		ACL_RING *r = acl_ring_pop_head(&ev->fdp_delay_list);
		if (r == NULL)
			break;
		fdp = acl_ring_to_appl(r, ACL_EVENT_FDTABLE, delay_entry);

		if ((fdp->flag & EVENT_FDTABLE_FLAG_ADD_READ)) {
			enable_read(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_ADD_WRITE)) {
			enable_write(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_DEL_READ)) {
			disable_read(ev, fdp);
		}
		if ((fdp->flag & EVENT_FDTABLE_FLAG_DEL_WRITE)) {
			disable_write(ev, fdp);
		}

		fdp->flag &= ~EVENT_FDTABLE_FLAG_DELAY_OPER;
	}
}