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); } } }
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){
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_); }
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; } }
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; } }