// 会话停止(删除网络事件以及关闭描述符) void _stop( struct session * self ) { evsets_t sets = self->evsets; // 删除网络事件 if ( self->status&SESSION_READING ) { evsets_del( sets, self->evread ); self->status &= ~SESSION_READING; } if ( self->status&SESSION_WRITING ) { evsets_del( sets, self->evwrite ); self->status &= ~SESSION_WRITING; } if ( self->status&SESSION_KEEPALIVING ) { evsets_del( sets, self->evkeepalive ); self->status &= ~SESSION_KEEPALIVING; } // 清空接收缓冲区 buffer_erase( &self->inbuffer, buffer_length(&self->inbuffer) ); // 关闭描述符 if ( self->fd > 0 ) { close( self->fd ); self->fd = -1; } }
int32_t evtimer_clean( struct evtimer * self ) { int32_t i = 0, rc = 0; for ( i = 0; i < self->bucket_count; ++i ) { struct event * ev = NULL; struct event_list * head = &( self->bucket_array[i] ); for ( ev = TAILQ_FIRST(head); ev; ) { struct event * next = TAILQ_NEXT( ev, timerlink ); evsets_del( event_get_sets((event_t)ev), (event_t)ev ); ++rc; ev = next; --self->event_count; } } self->dispatch_refer = 0; return rc; }
// 反注册网络事件 void session_del_event( struct session * self, int16_t ev ) { int8_t status = self->status; evsets_t sets = self->evsets; if ( (ev&EV_READ) && (status&SESSION_READING) ) { evsets_del( sets, self->evread ); self->status &= ~SESSION_READING; } if ( (ev&EV_WRITE) && (status&SESSION_WRITING) ) { evsets_del( sets, self->evwrite ); self->status &= ~SESSION_WRITING; } }
int32_t iolayer_free_connector( struct iolayer * self, struct connector * connector ) { if ( connector->event ) { evsets_del( connector->evsets, connector->event ); event_destroy( connector->event ); connector->event = NULL; } if ( connector->fd > 0 ) { close( connector->fd ); connector->fd = -1; } free( connector ); return 0; }
int32_t test_deltimer( evsets_t sets, event_t * events ) { int32_t i = 0; struct timeval tv_start, tv_end; gettimeofday( &tv_start, NULL ); for ( i = 0; i < NTEST; ++i ) { evsets_del( sets, events[i] ); } gettimeofday( &tv_end, NULL ); printf("evsets_del(%d) : %ld secs, %ld usecs .\n", NTEST, tv_end.tv_sec - tv_start.tv_sec, tv_end.tv_usec - tv_start.tv_usec ); return 0; }
int32_t iothread_stop( struct iothread * self ) { if ( self->queue ) { msgqueue_destroy( self->queue ); self->queue = NULL; } if ( self->cmdevent ) { evsets_del( self->sets, self->cmdevent ); event_destroy( self->cmdevent ); self->cmdevent = NULL; } if ( self->sets ) { evsets_destroy( self->sets ); self->sets = NULL; } return 0; }
int32_t evtimer_dispatch( struct evtimer * self ) { int32_t rc = 0; int32_t done = 0, index = 0; struct event * laster = NULL; struct event_list * head = NULL; index = EVTIMER_INDEX(self, self->dispatch_refer); ++self->dispatch_refer; head = &( self->bucket_array[index] ); // // 该桶中没有定时的事件 // if ( TAILQ_EMPTY(head) ) { return 0; } // // 遍历超时事件链表 // laster = TAILQ_LAST( head, event_list ); while ( !done ) { struct event * ev = TAILQ_FIRST(head); // // 由于某些事件的超时时间过长 // 所以还是需要继续添加到事件链表中的 // 必须判断当前节点是否是链表的尾部元素 // if ( ev == laster ) { done = 1; } --ev->timer_stepcnt; if ( ev->timer_stepcnt > 0 ) { // // 未超时 // TAILQ_REMOVE( head, ev, timerlink ); TAILQ_INSERT_TAIL( head, ev, timerlink ); } else if ( ev->timer_stepcnt == 0 ) { // // 超时了 // 从队列中删除, 并添加到激活队列中 // ++rc; evsets_del( event_get_sets((event_t)ev), (event_t)ev ); event_active( ev, EV_TIMEOUT ); } else { // // 出错了 // evsets_del( event_get_sets((event_t)ev), (event_t)ev ); } } return rc; }