1*a9643ea8Slogwang 2*a9643ea8Slogwang /** 3*a9643ea8Slogwang * Tencent is pleased to support the open source community by making MSEC available. 4*a9643ea8Slogwang * 5*a9643ea8Slogwang * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 6*a9643ea8Slogwang * 7*a9643ea8Slogwang * Licensed under the GNU General Public License, Version 2.0 (the "License"); 8*a9643ea8Slogwang * you may not use this file except in compliance with the License. You may 9*a9643ea8Slogwang * obtain a copy of the License at 10*a9643ea8Slogwang * 11*a9643ea8Slogwang * https://opensource.org/licenses/GPL-2.0 12*a9643ea8Slogwang * 13*a9643ea8Slogwang * Unless required by applicable law or agreed to in writing, software distributed under the 14*a9643ea8Slogwang * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 15*a9643ea8Slogwang * either express or implied. See the License for the specific language governing permissions 16*a9643ea8Slogwang * and limitations under the License. 17*a9643ea8Slogwang */ 18*a9643ea8Slogwang 19*a9643ea8Slogwang 20*a9643ea8Slogwang /** 21*a9643ea8Slogwang * @file mt_session.cpp 22*a9643ea8Slogwang * @info �̺߳�����ӻỰ����ʵ�ֲ��� 23*a9643ea8Slogwang * @time 20130924 24*a9643ea8Slogwang **/ 25*a9643ea8Slogwang 26*a9643ea8Slogwang #include "micro_thread.h" 27*a9643ea8Slogwang #include "mt_session.h" 28*a9643ea8Slogwang 29*a9643ea8Slogwang using namespace std; 30*a9643ea8Slogwang using namespace NS_MICRO_THREAD; 31*a9643ea8Slogwang 32*a9643ea8Slogwang /** 33*a9643ea8Slogwang * @brief session�ӿ���Դ�Ի��մ��� 34*a9643ea8Slogwang */ 35*a9643ea8Slogwang ISession::~ISession() 36*a9643ea8Slogwang { 37*a9643ea8Slogwang if (_session_flg) { 38*a9643ea8Slogwang SessionMgr* sessionmgr = SessionMgr::Instance(); 39*a9643ea8Slogwang sessionmgr->RemoveSession(_session_id); 40*a9643ea8Slogwang _session_flg = (int)SESSION_IDLE; // �����, ��remove�����ڴ����Ӵ��� 41*a9643ea8Slogwang } 42*a9643ea8Slogwang } 43*a9643ea8Slogwang 44*a9643ea8Slogwang 45*a9643ea8Slogwang /** 46*a9643ea8Slogwang * @brief sessionȫ�ֹ����� 47*a9643ea8Slogwang * @return ȫ�־��ָ�� 48*a9643ea8Slogwang */ 49*a9643ea8Slogwang SessionMgr* SessionMgr::_instance = NULL; 50*a9643ea8Slogwang SessionMgr* SessionMgr::Instance (void) 51*a9643ea8Slogwang { 52*a9643ea8Slogwang if (NULL == _instance) 53*a9643ea8Slogwang { 54*a9643ea8Slogwang _instance = new SessionMgr; 55*a9643ea8Slogwang } 56*a9643ea8Slogwang 57*a9643ea8Slogwang return _instance; 58*a9643ea8Slogwang } 59*a9643ea8Slogwang 60*a9643ea8Slogwang /** 61*a9643ea8Slogwang * @brief session����ȫ�ֵ����ٽӿ� 62*a9643ea8Slogwang */ 63*a9643ea8Slogwang void SessionMgr::Destroy() 64*a9643ea8Slogwang { 65*a9643ea8Slogwang if( _instance != NULL ) 66*a9643ea8Slogwang { 67*a9643ea8Slogwang delete _instance; 68*a9643ea8Slogwang _instance = NULL; 69*a9643ea8Slogwang } 70*a9643ea8Slogwang } 71*a9643ea8Slogwang 72*a9643ea8Slogwang /** 73*a9643ea8Slogwang * @brief ��Ϣbuff�Ĺ��캯�� 74*a9643ea8Slogwang */ 75*a9643ea8Slogwang SessionMgr::SessionMgr() 76*a9643ea8Slogwang { 77*a9643ea8Slogwang _curr_session = 0; 78*a9643ea8Slogwang _hash_map = new HashList(100000); 79*a9643ea8Slogwang } 80*a9643ea8Slogwang 81*a9643ea8Slogwang /** 82*a9643ea8Slogwang * @brief ��������, ��������Դ, ������������ 83*a9643ea8Slogwang */ 84*a9643ea8Slogwang SessionMgr::~SessionMgr() 85*a9643ea8Slogwang { 86*a9643ea8Slogwang if (_hash_map) { 87*a9643ea8Slogwang delete _hash_map; 88*a9643ea8Slogwang _hash_map = NULL; 89*a9643ea8Slogwang } 90*a9643ea8Slogwang } 91*a9643ea8Slogwang 92*a9643ea8Slogwang /** 93*a9643ea8Slogwang * @brief Session���ݴ洢 94*a9643ea8Slogwang */ 95*a9643ea8Slogwang int SessionMgr::InsertSession(ISession* session) 96*a9643ea8Slogwang { 97*a9643ea8Slogwang if (!_hash_map || !session) { 98*a9643ea8Slogwang MTLOG_ERROR("Mngr not init(%p), or session null(%p)", _hash_map, session); 99*a9643ea8Slogwang return -100; 100*a9643ea8Slogwang } 101*a9643ea8Slogwang 102*a9643ea8Slogwang int flag = session->GetSessionFlag(); 103*a9643ea8Slogwang if (flag & SESSION_INUSE) { 104*a9643ea8Slogwang MTLOG_ERROR("Session already in hash, bugs, %p, %d", session, flag); 105*a9643ea8Slogwang return -200; 106*a9643ea8Slogwang } 107*a9643ea8Slogwang 108*a9643ea8Slogwang session->SetSessionFlag((int)SESSION_INUSE); 109*a9643ea8Slogwang return _hash_map->HashInsert(session); 110*a9643ea8Slogwang } 111*a9643ea8Slogwang 112*a9643ea8Slogwang /** 113*a9643ea8Slogwang * @brief ��ѯsession���� 114*a9643ea8Slogwang */ 115*a9643ea8Slogwang ISession* SessionMgr::FindSession(int session_id) 116*a9643ea8Slogwang { 117*a9643ea8Slogwang if (!_hash_map) { 118*a9643ea8Slogwang MTLOG_ERROR("Mngr not init(%p)", _hash_map); 119*a9643ea8Slogwang return NULL; 120*a9643ea8Slogwang } 121*a9643ea8Slogwang 122*a9643ea8Slogwang ISession key; 123*a9643ea8Slogwang key.SetSessionId(session_id); 124*a9643ea8Slogwang return dynamic_cast<ISession*>(_hash_map->HashFind(&key)); 125*a9643ea8Slogwang } 126*a9643ea8Slogwang 127*a9643ea8Slogwang /** 128*a9643ea8Slogwang * @brief ɾ��session���� 129*a9643ea8Slogwang */ 130*a9643ea8Slogwang void SessionMgr::RemoveSession(int session_id) 131*a9643ea8Slogwang { 132*a9643ea8Slogwang if (!_hash_map) { 133*a9643ea8Slogwang MTLOG_ERROR("Mngr not init(%p)", _hash_map); 134*a9643ea8Slogwang return; 135*a9643ea8Slogwang } 136*a9643ea8Slogwang 137*a9643ea8Slogwang ISession key; 138*a9643ea8Slogwang key.SetSessionId(session_id); 139*a9643ea8Slogwang return _hash_map->HashRemove(&key); 140*a9643ea8Slogwang } 141*a9643ea8Slogwang 142*a9643ea8Slogwang 143