示例#1
0
// 会话停止(删除网络事件以及关闭描述符)
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;
    }
}
示例#2
0
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;
}
示例#3
0
// 反注册网络事件
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;
    }
}
示例#4
0
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;
}
示例#5
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;
}
示例#6
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;
}
示例#7
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;
}