84 lines
2.5 KiB
C++
84 lines
2.5 KiB
C++
|
/*
|
|||
|
* Copyright (c) 2021 The ZLToolKit project authors. All Rights Reserved.
|
|||
|
*
|
|||
|
* This file is part of ZLToolKit(https://github.com/ZLMediaKit/ZLToolKit).
|
|||
|
*
|
|||
|
* Use of this source code is governed by MIT license that can be found in the
|
|||
|
* LICENSE file in the root of the source tree. All contributing project authors
|
|||
|
* may be found in the AUTHORS file in the root of the source tree.
|
|||
|
*/
|
|||
|
|
|||
|
#include "Server.h"
|
|||
|
|
|||
|
using namespace std;
|
|||
|
|
|||
|
namespace toolkit {
|
|||
|
|
|||
|
Server::Server(EventPoller::Ptr poller) {
|
|||
|
_poller = poller ? std::move(poller) : EventPollerPool::Instance().getPoller();
|
|||
|
}
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
SessionHelper::SessionHelper(const std::weak_ptr<Server> &server, Session::Ptr session, std::string cls) {
|
|||
|
_server = server;
|
|||
|
_session = std::move(session);
|
|||
|
_cls = std::move(cls);
|
|||
|
//记录session至全局的map,方便后面管理
|
|||
|
_session_map = SessionMap::Instance().shared_from_this();
|
|||
|
_identifier = _session->getIdentifier();
|
|||
|
_session_map->add(_identifier, _session);
|
|||
|
}
|
|||
|
|
|||
|
SessionHelper::~SessionHelper() {
|
|||
|
if (!_server.lock()) {
|
|||
|
//务必通知Session已从TcpServer脱离
|
|||
|
_session->onError(SockException(Err_other, "Server shutdown"));
|
|||
|
}
|
|||
|
//从全局map移除相关记录
|
|||
|
_session_map->del(_identifier);
|
|||
|
}
|
|||
|
|
|||
|
const Session::Ptr &SessionHelper::session() const {
|
|||
|
return _session;
|
|||
|
}
|
|||
|
|
|||
|
const std::string &SessionHelper::className() const {
|
|||
|
return _cls;
|
|||
|
}
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
bool SessionMap::add(const string &tag, const Session::Ptr &session) {
|
|||
|
lock_guard<mutex> lck(_mtx_session);
|
|||
|
return _map_session.emplace(tag, session).second;
|
|||
|
}
|
|||
|
|
|||
|
bool SessionMap::del(const string &tag) {
|
|||
|
lock_guard<mutex> lck(_mtx_session);
|
|||
|
return _map_session.erase(tag);
|
|||
|
}
|
|||
|
|
|||
|
Session::Ptr SessionMap::get(const string &tag) {
|
|||
|
lock_guard<mutex> lck(_mtx_session);
|
|||
|
auto it = _map_session.find(tag);
|
|||
|
if (it == _map_session.end()) {
|
|||
|
return nullptr;
|
|||
|
}
|
|||
|
return it->second.lock();
|
|||
|
}
|
|||
|
|
|||
|
void SessionMap::for_each_session(const function<void(const string &id, const Session::Ptr &session)> &cb) {
|
|||
|
lock_guard<mutex> lck(_mtx_session);
|
|||
|
for (auto it = _map_session.begin(); it != _map_session.end();) {
|
|||
|
auto session = it->second.lock();
|
|||
|
if (!session) {
|
|||
|
it = _map_session.erase(it);
|
|||
|
continue;
|
|||
|
}
|
|||
|
cb(it->first, session);
|
|||
|
++it;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
} // namespace toolkit
|