Ejemplo n.º 1
0
int32_t session_end( struct session * self, sid_t id )
{
    // 由于会话已经从管理器中删除了
    // 会话中的ID已经非法

    // 清空发送队列
    uint32_t count = session_sendqueue_count(self);
    if ( count > 0 )
    {
        syslog(LOG_WARNING,
                "%s(SID=%ld)'s Out-Message-List (%d) is not empty .", __FUNCTION__, id, count );

        for ( ; count > 0; --count )
        {
            struct message * msg = NULL;
            QUEUE_POP(sendqueue)( &self->sendqueue, &msg );

            // 检查消息是否可以销毁了
            message_add_failure( msg, id );
            if ( message_is_complete(msg) )
            {
                message_destroy( msg );
            }
        }
    }

    // 停止会话
    _stop( self );
    _del_session( self );

    return 0;
}
Ejemplo n.º 2
0
int32_t _broadcast_direct( struct iolayer * self, uint8_t index, struct session_manager * manager, struct message * msg )
{
    uint32_t i = 0;
    int32_t count = 0;

    // 数据改造
    if ( self->transform != NULL )
    {
        // 数据需要改造
        char * buffer = NULL;
        uint32_t nbytes = message_get_length( msg );
        buffer = self->transform( self->context, message_get_buffer(msg), &nbytes );
        if ( buffer == NULL )
        {
            // 数据改造失败
            message_destroy( msg );
            return -1;
        }
        if ( buffer != message_get_buffer(msg) )
        {
            // 数据改造成功
            message_set_buffer( msg, buffer, nbytes );
        }
    }

    for ( i = 0; i < sidlist_count(msg->tolist); ++i )
    {
        sid_t id = sidlist_get(msg->tolist, i);

        if ( SID_INDEX(id) != index )
        {
            message_add_failure( msg, id );
            continue;
        }

        struct session * session = session_manager_get( manager, id );
        if ( unlikely(session == NULL) )
        {
            message_add_failure( msg, id );
            continue;
        }

        if ( session_append(session, msg) >= 0 )
        {
            // 尝试单独发送
            // 添加到发送队列成功
            ++count;
        }
    }

    // 消息发送完毕, 直接销毁
    if ( message_is_complete(msg) )
    {
        message_destroy( msg );
    }

    return count;
}