f-stack/app/micro_thread/mt_action.cpp

256 lines
5.9 KiB
C++
Raw Normal View History

2017-04-21 10:43:26 +00:00
/**
* Tencent is pleased to support the open source community by making MSEC available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the GNU General Public License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* https://opensource.org/licenses/GPL-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
/**
* @file mt_action.cpp
* @info ΢<EFBFBD>߳<EFBFBD>ACTION<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* @time 20130924
**/
#include "micro_thread.h"
#include "mt_notify.h"
#include "mt_connection.h"
#include "mt_session.h"
#include "mt_action.h"
using namespace std;
using namespace NS_MICRO_THREAD;
/**
* @brief <EFBFBD><EFBFBD>ʼitem״̬
*/
void IMtAction::Init()
{
_flag = MULTI_FLAG_UNDEF;
_proto = MT_UDP;
_conn_type = CONN_TYPE_SHORT;
_errno = ERR_NONE;
_time_cost = 0;
_buff_size = 0;
_msg = NULL;
_conn = NULL;
_ntfy_name = 0;
memset(&_addr, 0, sizeof(_addr));
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>item״̬
*/
void IMtAction::Reset()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>Ÿ<EFBFBD><C5B8><EFBFBD>, <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹر<C6B9>
bool force_free = false;
if (_errno != ERR_NONE) {
force_free = true;
}
if (_conn) {
ConnectionMgr::Instance()->FreeConnection(_conn, force_free);
_conn = NULL;
}
}
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD>, ֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
KqueuerObj* IMtAction::GetNtfyObj() {
IMtConnection* conn = GetIConnection();
if (conn) {
return conn->GetNtfyObj();
} else {
return NULL;
}
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*/
int IMtAction::InitConnEnv()
{
MtFrame* mtframe = MtFrame::Instance();
ConnectionMgr* connmgr = ConnectionMgr::Instance();
MsgBuffPool* msgmgr = MsgBuffPool::Instance();
NtfyObjMgr* ntfymgr = NtfyObjMgr::Instance();
SessionMgr* sessionmgr = SessionMgr::Instance();
if (_conn != NULL) {
MTLOG_ERROR("Action init failed, maybe action reused in actionlist, check it!!");
return -100;
}
// 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡconn<6E><6E><EFBFBD><EFBFBD>
CONN_OBJ_TYPE conn_obj_type = OBJ_CONN_UNDEF;
NTFY_OBJ_TYPE ntfy_obj_type = NTFY_OBJ_UNDEF;
MULTI_PROTO proto = this->GetProtoType();
MULTI_CONNECT type = this->GetConnType();
if ((MT_UDP == proto) && (CONN_TYPE_SESSION == type)) // UDP sessionģʽ
{
conn_obj_type = OBJ_UDP_SESSION;
ntfy_obj_type = NTFY_OBJ_SESSION;
}
else if (MT_UDP == proto) // UDP <20><><EFBFBD><EFBFBD>ģʽ
{
conn_obj_type = OBJ_SHORT_CONN;
ntfy_obj_type = NTFY_OBJ_THREAD;
}
else // TCP ģʽ
{
conn_obj_type = OBJ_TCP_KEEP;
ntfy_obj_type = NTFY_OBJ_THREAD;
}
_conn = connmgr->GetConnection(conn_obj_type, this->GetMsgDstAddr());
if (!_conn) {
MTLOG_ERROR("Get conn failed, type: %d", conn_obj_type);
return -1;
}
_conn->SetIMtActon(this);
// 2. <20><>ȡmsg buff<66><66><EFBFBD><EFBFBD>
int max_len = this->GetMsgBuffSize();
MtMsgBuf* msg_buff = msgmgr->GetMsgBuf(max_len);
if (!msg_buff) {
MTLOG_ERROR("Maybe no memory, buffsize: %d, get failed", max_len);
return -2;
}
msg_buff->SetBuffType(BUFF_SEND);
_conn->SetMtMsgBuff(msg_buff);
// 3. <20><>ȡ ntfy <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
KqueuerObj* ntfy_obj = ntfymgr->GetNtfyObj(ntfy_obj_type, _ntfy_name);
if (!ntfy_obj) {
MTLOG_ERROR("Maybe no memory, ntfy type: %d, get failed", ntfy_obj_type);
return -3;
}
_conn->SetNtfyObj(ntfy_obj);
// 4. SESSIONģ<4E><C4A3>, <20><><EFBFBD><EFBFBD>session
MicroThread* thread = mtframe->GetActiveThread();
ntfy_obj->SetOwnerThread(thread);
this->SetIMsgPtr((IMtMsg*)thread->GetThreadArgs());
if (conn_obj_type == OBJ_UDP_SESSION)
{
this->SetOwnerThread(thread);
this->SetSessionConn(_conn);
this->SetSessionId(sessionmgr->GetSessionId());
sessionmgr->InsertSession(this);
}
return 0;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>򻯽ӿ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>
*/
int IMtAction::DoEncode()
{
MtMsgBuf* msg_buff = NULL;
if (_conn) {
msg_buff = _conn->GetMtMsgBuff();
}
if (!_conn || !msg_buff) {
MTLOG_ERROR("conn(%p) or msgbuff(%p) null", _conn, msg_buff);
return -100;
}
int msg_len = msg_buff->GetMaxLen();
int ret = this->HandleEncode(msg_buff->GetMsgBuff(), msg_len, _msg);
if (ret < 0)
{
MTLOG_DEBUG("handleecode failed, ret %d", ret);
return ret;
}
msg_buff->SetMsgLen(msg_len);
return 0;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>򻯽ӿ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>
*/
int IMtAction::DoInput()
{
MtMsgBuf* msg_buff = NULL;
if (_conn) {
msg_buff = _conn->GetMtMsgBuff();
}
if (!_conn || !msg_buff) {
MTLOG_ERROR("conn(%p) or msgbuff(%p) null", _conn, msg_buff);
return -100;
}
int msg_len = msg_buff->GetHaveRcvLen();
int ret = this->HandleInput(msg_buff->GetMsgBuff(), msg_len, _msg);
if (ret < 0)
{
MTLOG_DEBUG("HandleInput failed, ret %d", ret);
return ret;
}
return ret;
}
int IMtAction::DoProcess()
{
MtMsgBuf* msg_buff = NULL;
if (_conn) {
msg_buff = _conn->GetMtMsgBuff();
}
if (!_conn || !msg_buff) {
MTLOG_ERROR("conn(%p) or msgbuff(%p) null", _conn, msg_buff);
return -100;
}
int ret = this->HandleProcess(msg_buff->GetMsgBuff(), msg_buff->GetMsgLen(), _msg);
if (ret < 0)
{
MTLOG_DEBUG("handleprocess failed, ret %d", ret);
return ret;
}
return 0;
}
int IMtAction::DoError()
{
return this->HandleError((int)_errno, _msg);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
IMtAction::IMtAction()
{
Init();
}
IMtAction::~IMtAction()
{
Reset();
Init();
}