mirror of
https://gitee.com/zyjblog/oatpp.git
synced 2024-12-22 22:16:37 +08:00
make network::virtual_::Interface obtainable by name
This commit is contained in:
parent
c9ce09635b
commit
834c09be44
@ -54,8 +54,6 @@ private:
|
||||
|
||||
std::atomic<v_int32> m_status;
|
||||
|
||||
oatpp::String m_port;
|
||||
|
||||
std::shared_ptr<ServerConnectionProvider> m_connectionProvider;
|
||||
std::shared_ptr<ConnectionHandler> m_connectionHandler;
|
||||
|
||||
|
@ -26,6 +26,60 @@
|
||||
|
||||
namespace oatpp { namespace network { namespace virtual_ {
|
||||
|
||||
std::recursive_mutex Interface::m_registryMutex;
|
||||
std::unordered_map<oatpp::String, std::weak_ptr<Interface>> Interface::m_registry;
|
||||
|
||||
void Interface::registerInterface(const std::shared_ptr<Interface>& interface) {
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lock(m_registryMutex);
|
||||
|
||||
auto it = m_registry.find(interface->getName());
|
||||
if(it != m_registry.end()) {
|
||||
throw std::runtime_error
|
||||
("[oatpp::network::virtual_::Interface::registerInterface()]: Error. Interface with such name already exists - '" + interface->getName()->std_str() + "'.");
|
||||
}
|
||||
|
||||
m_registry.insert({interface->getName(), interface});
|
||||
|
||||
}
|
||||
|
||||
void Interface::unregisterInterface(const oatpp::String& name) {
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lock(m_registryMutex);
|
||||
|
||||
auto it = m_registry.find(name);
|
||||
if(it == m_registry.end()) {
|
||||
throw std::runtime_error
|
||||
("[oatpp::network::virtual_::Interface::unregisterInterface()]: Error. Interface NOT FOUND - '" + name->std_str() + "'.");
|
||||
}
|
||||
|
||||
m_registry.erase(it);
|
||||
|
||||
}
|
||||
|
||||
Interface::Interface(const oatpp::String& name)
|
||||
: m_name(name)
|
||||
{}
|
||||
|
||||
Interface::~Interface() {
|
||||
unregisterInterface(getName());
|
||||
}
|
||||
|
||||
std::shared_ptr<Interface> Interface::obtainShared(const oatpp::String& name) {
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lock(m_registryMutex);
|
||||
|
||||
auto it = m_registry.find(name);
|
||||
if(it != m_registry.end()) {
|
||||
return it->second.lock();
|
||||
}
|
||||
|
||||
std::shared_ptr<Interface> interface(new Interface(name));
|
||||
registerInterface(interface);
|
||||
return interface;
|
||||
|
||||
}
|
||||
|
||||
void Interface::ConnectionSubmission::setSocket(const std::shared_ptr<Socket>& socket) {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
|
@ -29,6 +29,8 @@
|
||||
|
||||
#include "oatpp/core/collection/LinkedList.hpp"
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
namespace oatpp { namespace network { namespace virtual_ {
|
||||
|
||||
/**
|
||||
@ -36,6 +38,12 @@ namespace oatpp { namespace network { namespace virtual_ {
|
||||
* "virtual" connection is represented by &id:oatpp::network::virtual_::Socket;.
|
||||
*/
|
||||
class Interface : public oatpp::base::Countable {
|
||||
private:
|
||||
static std::recursive_mutex m_registryMutex;
|
||||
static std::unordered_map<oatpp::String, std::weak_ptr<Interface>> m_registry;
|
||||
private:
|
||||
static void registerInterface(const std::shared_ptr<Interface>& interface);
|
||||
static void unregisterInterface(const oatpp::String& name);
|
||||
public:
|
||||
|
||||
/**
|
||||
@ -88,24 +96,31 @@ private:
|
||||
std::mutex m_mutex;
|
||||
std::condition_variable m_condition;
|
||||
oatpp::collection::LinkedList<std::shared_ptr<ConnectionSubmission>> m_submissions;
|
||||
public:
|
||||
private:
|
||||
/**
|
||||
* Constructor.
|
||||
* @param name - interface name.
|
||||
*/
|
||||
Interface(const oatpp::String& name)
|
||||
: m_name(name)
|
||||
{}
|
||||
Interface(const oatpp::String& name);
|
||||
|
||||
Interface(const Interface& other) = delete;
|
||||
Interface(Interface&& other) = delete;
|
||||
Interface& operator=(const Interface&) = delete;
|
||||
Interface& operator=(Interface&&) = delete;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Create shared Interface.
|
||||
* @param name - interface name.
|
||||
* Destructor.
|
||||
*/
|
||||
~Interface();
|
||||
|
||||
/**
|
||||
* Obtain interface for given name.
|
||||
* @param name - name of the interface.
|
||||
* @return - `std::shared_ptr` to Interface.
|
||||
*/
|
||||
static std::shared_ptr<Interface> createShared(const oatpp::String& name) {
|
||||
return std::make_shared<Interface>(name);
|
||||
}
|
||||
static std::shared_ptr<Interface> obtainShared(const oatpp::String& name);
|
||||
|
||||
/**
|
||||
* Connect to interface.
|
||||
|
@ -136,7 +136,7 @@ void InterfaceTest::onRun() {
|
||||
|
||||
oatpp::String dataSample = "1234567890-=][poiuytrewqasdfghjkl;'/.,mnbvcxzzxcvbnm,./';lkjhgfdsaqwertyuiop][=-0987654321";
|
||||
|
||||
auto interface = Interface::createShared("virtualhost");
|
||||
auto interface = Interface::obtainShared("virtualhost");
|
||||
v_int32 numTasks = 100;
|
||||
|
||||
ThreadList threadList;
|
||||
|
@ -66,7 +66,7 @@ public:
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::virtual_::Interface>, virtualInterface)([] {
|
||||
return oatpp::network::virtual_::Interface::createShared("virtualhost");
|
||||
return oatpp::network::virtual_::Interface::obtainShared("virtualhost");
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([this] {
|
||||
|
@ -68,7 +68,7 @@ public:
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::virtual_::Interface>, virtualInterface)([] {
|
||||
return oatpp::network::virtual_::Interface::createShared("virtualhost");
|
||||
return oatpp::network::virtual_::Interface::obtainShared("virtualhost");
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([this] {
|
||||
|
@ -66,7 +66,7 @@ public:
|
||||
{}
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::virtual_::Interface>, virtualInterface)([] {
|
||||
return oatpp::network::virtual_::Interface::createShared("virtualhost");
|
||||
return oatpp::network::virtual_::Interface::obtainShared("virtualhost");
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([this] {
|
||||
|
@ -61,7 +61,7 @@ public:
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::virtual_::Interface>, virtualInterface)([] {
|
||||
return oatpp::network::virtual_::Interface::createShared("virtualhost");
|
||||
return oatpp::network::virtual_::Interface::obtainShared("virtualhost");
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([this] {
|
||||
|
@ -57,7 +57,7 @@ public:
|
||||
{}
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::virtual_::Interface>, virtualInterface)([] {
|
||||
return oatpp::network::virtual_::Interface::createShared("virtualhost");
|
||||
return oatpp::network::virtual_::Interface::obtainShared("virtualhost");
|
||||
}());
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([this] {
|
||||
|
Loading…
Reference in New Issue
Block a user