Beispiel #1
0
int MessageHandler::DefaultAsyncProcessOnWrite(SessionPtr session, IoBufferPtr data)
{
    int flags = 0; // in sync and no concurrency by default

    if(m_manager)
    {
        if(m_work)
        {
            int code = GetCode(data.get());
            int flag = GetFlag(data.get());

            data->code(code);
            data->flag(flag);

            data->SetReadPos(0);
            data->SetWritePos(0);

            flags = flags | 1; // async process
            if(!IsOrderlyMessage(data.get()) || !session->GetOrderlyHandling(2))
            {
                flags = flags | 2; // disordered messages support concurrency
                data->type(0); // concurrency needs data with no type
            }

            m_manager->AddWorkTask(m_work, data); // async process data in another thread

            return flags;
        }
        else
        {
            WorkPtr work;
            data->SetReadPos(0);
            int key = GetIntKey(data.get());
            if(key != 0) work = m_manager->GetWork(key);
            else
            {
                data->SetReadPos(0);
                std::string strkey = GetStrKey(data.get());
                if(strkey.length() > 0) work = m_manager->GetWork(strkey);
            }

            if(work)
            {
                data->SetReadPos(0);
                data->SetWritePos(0);

                flags = flags | 1; // async process
                if(!IsOrderlyMessage(data.get()) || !session->GetOrderlyHandling(2))
                {
                    flags = flags | 2; // disordered messages support concurrency
                    data->type(0); // concurrency needs data with no type
                }

                m_manager->AddWorkTask(work, data); // async process data in another thread

                return flags;
            }
        }
    }
    else
    {
        HandleMessage(session, data); // process data in current thread (in sync)
    }

    return flags;
}