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