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; }