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;
|
std::atomic<v_int32> m_status;
|
||||||
|
|
||||||
oatpp::String m_port;
|
|
||||||
|
|
||||||
std::shared_ptr<ServerConnectionProvider> m_connectionProvider;
|
std::shared_ptr<ServerConnectionProvider> m_connectionProvider;
|
||||||
std::shared_ptr<ConnectionHandler> m_connectionHandler;
|
std::shared_ptr<ConnectionHandler> m_connectionHandler;
|
||||||
|
|
||||||
|
@ -25,7 +25,61 @@
|
|||||||
#include "Interface.hpp"
|
#include "Interface.hpp"
|
||||||
|
|
||||||
namespace oatpp { namespace network { namespace virtual_ {
|
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) {
|
void Interface::ConnectionSubmission::setSocket(const std::shared_ptr<Socket>& socket) {
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m_mutex);
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
|
|
||||||
#include "oatpp/core/collection/LinkedList.hpp"
|
#include "oatpp/core/collection/LinkedList.hpp"
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace oatpp { namespace network { namespace virtual_ {
|
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;.
|
* "virtual" connection is represented by &id:oatpp::network::virtual_::Socket;.
|
||||||
*/
|
*/
|
||||||
class Interface : public oatpp::base::Countable {
|
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:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,24 +96,31 @@ private:
|
|||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
std::condition_variable m_condition;
|
std::condition_variable m_condition;
|
||||||
oatpp::collection::LinkedList<std::shared_ptr<ConnectionSubmission>> m_submissions;
|
oatpp::collection::LinkedList<std::shared_ptr<ConnectionSubmission>> m_submissions;
|
||||||
public:
|
private:
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
* @param name - interface name.
|
* @param name - interface name.
|
||||||
*/
|
*/
|
||||||
Interface(const oatpp::String& name)
|
Interface(const oatpp::String& name);
|
||||||
: m_name(name)
|
|
||||||
{}
|
Interface(const Interface& other) = delete;
|
||||||
|
Interface(Interface&& other) = delete;
|
||||||
|
Interface& operator=(const Interface&) = delete;
|
||||||
|
Interface& operator=(Interface&&) = delete;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create shared Interface.
|
* Destructor.
|
||||||
* @param name - interface name.
|
*/
|
||||||
|
~Interface();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtain interface for given name.
|
||||||
|
* @param name - name of the interface.
|
||||||
* @return - `std::shared_ptr` to Interface.
|
* @return - `std::shared_ptr` to Interface.
|
||||||
*/
|
*/
|
||||||
static std::shared_ptr<Interface> createShared(const oatpp::String& name) {
|
static std::shared_ptr<Interface> obtainShared(const oatpp::String& name);
|
||||||
return std::make_shared<Interface>(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect to interface.
|
* Connect to interface.
|
||||||
|
@ -136,7 +136,7 @@ void InterfaceTest::onRun() {
|
|||||||
|
|
||||||
oatpp::String dataSample = "1234567890-=][poiuytrewqasdfghjkl;'/.,mnbvcxzzxcvbnm,./';lkjhgfdsaqwertyuiop][=-0987654321";
|
oatpp::String dataSample = "1234567890-=][poiuytrewqasdfghjkl;'/.,mnbvcxzzxcvbnm,./';lkjhgfdsaqwertyuiop][=-0987654321";
|
||||||
|
|
||||||
auto interface = Interface::createShared("virtualhost");
|
auto interface = Interface::obtainShared("virtualhost");
|
||||||
v_int32 numTasks = 100;
|
v_int32 numTasks = 100;
|
||||||
|
|
||||||
ThreadList threadList;
|
ThreadList threadList;
|
||||||
|
@ -66,7 +66,7 @@ public:
|
|||||||
}());
|
}());
|
||||||
|
|
||||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::virtual_::Interface>, virtualInterface)([] {
|
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] {
|
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)([] {
|
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] {
|
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)([] {
|
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] {
|
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)([] {
|
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] {
|
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)([] {
|
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] {
|
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([this] {
|
||||||
|
Loading…
Reference in New Issue
Block a user