Commit 57b8986638fc1b7a9a5824269250cd04b27da96a
1 parent
f44f1e79
Use std::make_shared and std::make_unique
This saves some allocations. This also meant having to set the C++ standard to 2014. The getCopy() methods of sessions and mqttpackets can't be changed, because of access errors (private).
Showing
8 changed files
with
24 additions
and
22 deletions
CMakeLists.txt
| @@ -7,7 +7,7 @@ project(FlashMQ VERSION 0.9.9 LANGUAGES CXX) | @@ -7,7 +7,7 @@ project(FlashMQ VERSION 0.9.9 LANGUAGES CXX) | ||
| 7 | add_definitions(-DOPENSSL_API_COMPAT=0x10100000L) | 7 | add_definitions(-DOPENSSL_API_COMPAT=0x10100000L) |
| 8 | add_definitions(-DFLASHMQ_VERSION=\"${PROJECT_VERSION}\") | 8 | add_definitions(-DFLASHMQ_VERSION=\"${PROJECT_VERSION}\") |
| 9 | 9 | ||
| 10 | -set(CMAKE_CXX_STANDARD 11) | 10 | +set(CMAKE_CXX_STANDARD 14) |
| 11 | set(CMAKE_CXX_STANDARD_REQUIRED ON) | 11 | set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 12 | 12 | ||
| 13 | SET(CMAKE_CXX_FLAGS "-msse4.2") | 13 | SET(CMAKE_CXX_FLAGS "-msse4.2") |
acltree.cpp
| @@ -14,7 +14,7 @@ AclNode *AclNode::getChildren(const std::string &subtopic, bool registerPattern) | @@ -14,7 +14,7 @@ AclNode *AclNode::getChildren(const std::string &subtopic, bool registerPattern) | ||
| 14 | 14 | ||
| 15 | if (!node) | 15 | if (!node) |
| 16 | { | 16 | { |
| 17 | - node.reset(new AclNode()); | 17 | + node = std::make_unique<AclNode>(); |
| 18 | 18 | ||
| 19 | if (registerPattern) | 19 | if (registerPattern) |
| 20 | { | 20 | { |
| @@ -44,7 +44,7 @@ const AclNode *AclNode::getChildren(const std::string &subtopic) const | @@ -44,7 +44,7 @@ const AclNode *AclNode::getChildren(const std::string &subtopic) const | ||
| 44 | AclNode *AclNode::getChildrenPlus() | 44 | AclNode *AclNode::getChildrenPlus() |
| 45 | { | 45 | { |
| 46 | if (!childrenPlus) | 46 | if (!childrenPlus) |
| 47 | - childrenPlus.reset(new AclNode()); | 47 | + childrenPlus = std::make_unique<AclNode>(); |
| 48 | 48 | ||
| 49 | return childrenPlus.get(); | 49 | return childrenPlus.get(); |
| 50 | } | 50 | } |
authplugin.cpp
| @@ -417,7 +417,8 @@ void Authentication::loadMosquittoPasswordFile() | @@ -417,7 +417,8 @@ void Authentication::loadMosquittoPasswordFile() | ||
| 417 | try | 417 | try |
| 418 | { | 418 | { |
| 419 | std::ifstream infile(this->mosquittoPasswordFile, std::ios::in); | 419 | std::ifstream infile(this->mosquittoPasswordFile, std::ios::in); |
| 420 | - std::unique_ptr<std::unordered_map<std::string, MosquittoPasswordFileEntry>> passwordEntries_tmp(new std::unordered_map<std::string, MosquittoPasswordFileEntry>()); | 420 | + std::unique_ptr<std::unordered_map<std::string, MosquittoPasswordFileEntry>> passwordEntries_tmp = |
| 421 | + std::make_unique<std::unordered_map<std::string, MosquittoPasswordFileEntry>>(); | ||
| 421 | 422 | ||
| 422 | for(std::string line; getline(infile, line ); ) | 423 | for(std::string line; getline(infile, line ); ) |
| 423 | { | 424 | { |
configfileparser.cpp
| @@ -121,7 +121,7 @@ ConfigFileParser::ConfigFileParser(const std::string &path) : | @@ -121,7 +121,7 @@ ConfigFileParser::ConfigFileParser(const std::string &path) : | ||
| 121 | validListenKeys.insert("inet4_bind_address"); | 121 | validListenKeys.insert("inet4_bind_address"); |
| 122 | validListenKeys.insert("inet6_bind_address"); | 122 | validListenKeys.insert("inet6_bind_address"); |
| 123 | 123 | ||
| 124 | - settings.reset(new Settings()); | 124 | + settings = std::make_unique<Settings>(); |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | void ConfigFileParser::loadFile(bool test) | 127 | void ConfigFileParser::loadFile(bool test) |
| @@ -202,7 +202,7 @@ void ConfigFileParser::loadFile(bool test) | @@ -202,7 +202,7 @@ void ConfigFileParser::loadFile(bool test) | ||
| 202 | 202 | ||
| 203 | ConfigParseLevel curParseLevel = ConfigParseLevel::Root; | 203 | ConfigParseLevel curParseLevel = ConfigParseLevel::Root; |
| 204 | std::shared_ptr<Listener> curListener; | 204 | std::shared_ptr<Listener> curListener; |
| 205 | - std::unique_ptr<Settings> tmpSettings(new Settings); | 205 | + std::unique_ptr<Settings> tmpSettings = std::make_unique<Settings>(); |
| 206 | 206 | ||
| 207 | // Then once we know the config file is valid, process it. | 207 | // Then once we know the config file is valid, process it. |
| 208 | for (std::string &line : lines) | 208 | for (std::string &line : lines) |
| @@ -215,7 +215,7 @@ void ConfigFileParser::loadFile(bool test) | @@ -215,7 +215,7 @@ void ConfigFileParser::loadFile(bool test) | ||
| 215 | if (matches[1].str() == "listen") | 215 | if (matches[1].str() == "listen") |
| 216 | { | 216 | { |
| 217 | curParseLevel = ConfigParseLevel::Listen; | 217 | curParseLevel = ConfigParseLevel::Listen; |
| 218 | - curListener.reset(new Listener); | 218 | + curListener = std::make_shared<Listener>(); |
| 219 | } | 219 | } |
| 220 | else | 220 | else |
| 221 | { | 221 | { |
| @@ -481,7 +481,7 @@ void ConfigFileParser::loadFile(bool test) | @@ -481,7 +481,7 @@ void ConfigFileParser::loadFile(bool test) | ||
| 481 | std::unique_ptr<Settings> ConfigFileParser::moveSettings() | 481 | std::unique_ptr<Settings> ConfigFileParser::moveSettings() |
| 482 | { | 482 | { |
| 483 | std::unique_ptr<Settings> tmp = std::move(settings); | 483 | std::unique_ptr<Settings> tmp = std::move(settings); |
| 484 | - settings.reset(new Settings); | 484 | + settings = std::make_unique<Settings>(); |
| 485 | return tmp; | 485 | return tmp; |
| 486 | } | 486 | } |
| 487 | 487 |
listener.cpp
| @@ -83,7 +83,7 @@ void Listener::loadCertAndKeyFromConfig() | @@ -83,7 +83,7 @@ void Listener::loadCertAndKeyFromConfig() | ||
| 83 | 83 | ||
| 84 | if (!sslctx) | 84 | if (!sslctx) |
| 85 | { | 85 | { |
| 86 | - sslctx.reset(new SslCtxManager()); | 86 | + sslctx = std::make_unique<SslCtxManager>(); |
| 87 | SSL_CTX_set_options(sslctx->get(), SSL_OP_NO_SSLv3); // TODO: config option | 87 | SSL_CTX_set_options(sslctx->get(), SSL_OP_NO_SSLv3); // TODO: config option |
| 88 | SSL_CTX_set_options(sslctx->get(), SSL_OP_NO_TLSv1); // TODO: config option | 88 | SSL_CTX_set_options(sslctx->get(), SSL_OP_NO_TLSv1); // TODO: config option |
| 89 | } | 89 | } |
mainapp.cpp
| @@ -23,6 +23,7 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | @@ -23,6 +23,7 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | ||
| 23 | #include <stdio.h> | 23 | #include <stdio.h> |
| 24 | #include <sys/sysinfo.h> | 24 | #include <sys/sysinfo.h> |
| 25 | #include <arpa/inet.h> | 25 | #include <arpa/inet.h> |
| 26 | +#include <memory> | ||
| 26 | 27 | ||
| 27 | #include <openssl/ssl.h> | 28 | #include <openssl/ssl.h> |
| 28 | #include <openssl/err.h> | 29 | #include <openssl/err.h> |
| @@ -36,12 +37,12 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | @@ -36,12 +37,12 @@ License along with FlashMQ. If not, see <https://www.gnu.org/licenses/>. | ||
| 36 | MainApp *MainApp::instance = nullptr; | 37 | MainApp *MainApp::instance = nullptr; |
| 37 | 38 | ||
| 38 | MainApp::MainApp(const std::string &configFilePath) : | 39 | MainApp::MainApp(const std::string &configFilePath) : |
| 39 | - subscriptionStore(new SubscriptionStore()) | 40 | + subscriptionStore(std::make_shared<SubscriptionStore>()) |
| 40 | { | 41 | { |
| 41 | epollFdAccept = check<std::runtime_error>(epoll_create(999)); | 42 | epollFdAccept = check<std::runtime_error>(epoll_create(999)); |
| 42 | taskEventFd = eventfd(0, EFD_NONBLOCK); | 43 | taskEventFd = eventfd(0, EFD_NONBLOCK); |
| 43 | 44 | ||
| 44 | - confFileParser.reset(new ConfigFileParser(configFilePath)); | 45 | + confFileParser = std::make_unique<ConfigFileParser>(configFilePath); |
| 45 | loadConfig(); | 46 | loadConfig(); |
| 46 | 47 | ||
| 47 | this->num_threads = get_nprocs(); | 48 | this->num_threads = get_nprocs(); |
| @@ -437,14 +438,14 @@ void MainApp::start() | @@ -437,14 +438,14 @@ void MainApp::start() | ||
| 437 | Authentication auth(settingsLocalCopy); | 438 | Authentication auth(settingsLocalCopy); |
| 438 | ThreadGlobals::assign(&auth); | 439 | ThreadGlobals::assign(&auth); |
| 439 | 440 | ||
| 440 | - std::shared_ptr<ThreadData> threaddata(new ThreadData(0, subscriptionStore, settings)); | 441 | + std::shared_ptr<ThreadData> threaddata = std::make_shared<ThreadData>(0, subscriptionStore, settings); |
| 441 | 442 | ||
| 442 | - std::shared_ptr<Client> client(new Client(fd, threaddata, nullptr, fuzzWebsockets, nullptr, settings, true)); | ||
| 443 | - std::shared_ptr<Client> subscriber(new Client(fdnull, threaddata, nullptr, fuzzWebsockets, nullptr, settings, true)); | 443 | + std::shared_ptr<Client> client = std::make_shared<Client>(fd, threaddata, nullptr, fuzzWebsockets, nullptr, settings, true); |
| 444 | + std::shared_ptr<Client> subscriber = std::make_shared<Client>(fdnull, threaddata, nullptr, fuzzWebsockets, nullptr, settings, true); | ||
| 444 | subscriber->setClientProperties(ProtocolVersion::Mqtt311, "subscriber", "subuser", true, 60, true); | 445 | subscriber->setClientProperties(ProtocolVersion::Mqtt311, "subscriber", "subuser", true, 60, true); |
| 445 | subscriber->setAuthenticated(true); | 446 | subscriber->setAuthenticated(true); |
| 446 | 447 | ||
| 447 | - std::shared_ptr<Client> websocketsubscriber(new Client(fdnull2, threaddata, nullptr, true, nullptr, settings, true)); | 448 | + std::shared_ptr<Client> websocketsubscriber = std::make_shared<Client>(fdnull2, threaddata, nullptr, true, nullptr, settings, true); |
| 448 | websocketsubscriber->setClientProperties(ProtocolVersion::Mqtt311, "websocketsubscriber", "websocksubuser", true, 60, true); | 449 | websocketsubscriber->setClientProperties(ProtocolVersion::Mqtt311, "websocketsubscriber", "websocksubuser", true, 60, true); |
| 449 | websocketsubscriber->setAuthenticated(true); | 450 | websocketsubscriber->setAuthenticated(true); |
| 450 | websocketsubscriber->setFakeUpgraded(); | 451 | websocketsubscriber->setFakeUpgraded(); |
| @@ -483,7 +484,7 @@ void MainApp::start() | @@ -483,7 +484,7 @@ void MainApp::start() | ||
| 483 | 484 | ||
| 484 | for (int i = 0; i < num_threads; i++) | 485 | for (int i = 0; i < num_threads; i++) |
| 485 | { | 486 | { |
| 486 | - std::shared_ptr<ThreadData> t(new ThreadData(i, subscriptionStore, settings)); | 487 | + std::shared_ptr<ThreadData> t = std::make_shared<ThreadData>(i, subscriptionStore, settings); |
| 487 | t->start(&do_thread_work); | 488 | t->start(&do_thread_work); |
| 488 | threads.push_back(t); | 489 | threads.push_back(t); |
| 489 | } | 490 | } |
| @@ -542,7 +543,7 @@ void MainApp::start() | @@ -542,7 +543,7 @@ void MainApp::start() | ||
| 542 | SSL_set_fd(clientSSL, fd); | 543 | SSL_set_fd(clientSSL, fd); |
| 543 | } | 544 | } |
| 544 | 545 | ||
| 545 | - std::shared_ptr<Client> client(new Client(fd, thread_data, clientSSL, listener->websocket, addr, settings)); | 546 | + std::shared_ptr<Client> client = std::make_shared<Client>(fd, thread_data, clientSSL, listener->websocket, addr, settings); |
| 546 | thread_data->giveClient(client); | 547 | thread_data->giveClient(client); |
| 547 | } | 548 | } |
| 548 | else | 549 | else |
| @@ -655,7 +656,7 @@ void MainApp::loadConfig() | @@ -655,7 +656,7 @@ void MainApp::loadConfig() | ||
| 655 | 656 | ||
| 656 | if (settings->listeners.empty()) | 657 | if (settings->listeners.empty()) |
| 657 | { | 658 | { |
| 658 | - std::shared_ptr<Listener> defaultListener(new Listener()); | 659 | + std::shared_ptr<Listener> defaultListener = std::make_shared<Listener>(); |
| 659 | defaultListener->isValid(); | 660 | defaultListener->isValid(); |
| 660 | settings->listeners.push_back(defaultListener); | 661 | settings->listeners.push_back(defaultListener); |
| 661 | } | 662 | } |
sessionsandsubscriptionsdb.cpp
| @@ -88,7 +88,7 @@ SessionsAndSubscriptionsResult SessionsAndSubscriptionsDB::readDataV1() | @@ -88,7 +88,7 @@ SessionsAndSubscriptionsResult SessionsAndSubscriptionsDB::readDataV1() | ||
| 88 | readCheck(buf.data(), 1, clientIdLength, f); | 88 | readCheck(buf.data(), 1, clientIdLength, f); |
| 89 | std::string clientId(buf.data(), clientIdLength); | 89 | std::string clientId(buf.data(), clientIdLength); |
| 90 | 90 | ||
| 91 | - std::shared_ptr<Session> ses(new Session()); | 91 | + std::shared_ptr<Session> ses = std::make_shared<Session>(); |
| 92 | result.sessions.push_back(ses); | 92 | result.sessions.push_back(ses); |
| 93 | ses->username = username; | 93 | ses->username = username; |
| 94 | ses->client_id = clientId; | 94 | ses->client_id = clientId; |
subscriptionstore.cpp
| @@ -122,7 +122,7 @@ SubscriptionNode *SubscriptionStore::getDeepestNode(const std::string &topic, co | @@ -122,7 +122,7 @@ SubscriptionNode *SubscriptionStore::getDeepestNode(const std::string &topic, co | ||
| 122 | 122 | ||
| 123 | if (!node) | 123 | if (!node) |
| 124 | { | 124 | { |
| 125 | - node.reset(new SubscriptionNode(subtopic)); | 125 | + node = std::make_unique<SubscriptionNode>(subtopic); |
| 126 | } | 126 | } |
| 127 | deepestNode = node.get(); | 127 | deepestNode = node.get(); |
| 128 | } | 128 | } |
| @@ -240,7 +240,7 @@ void SubscriptionStore::registerClientAndKickExistingOne(std::shared_ptr<Client> | @@ -240,7 +240,7 @@ void SubscriptionStore::registerClientAndKickExistingOne(std::shared_ptr<Client> | ||
| 240 | 240 | ||
| 241 | if (!session || client->getCleanSession() || originalClientDemandsSessionDestruction) | 241 | if (!session || client->getCleanSession() || originalClientDemandsSessionDestruction) |
| 242 | { | 242 | { |
| 243 | - session.reset(new Session()); | 243 | + session = std::make_shared<Session>(); |
| 244 | 244 | ||
| 245 | sessionsById[client->getClientId()] = session; | 245 | sessionsById[client->getClientId()] = session; |
| 246 | } | 246 | } |
| @@ -448,7 +448,7 @@ void SubscriptionStore::setRetainedMessage(const std::string &topic, const std:: | @@ -448,7 +448,7 @@ void SubscriptionStore::setRetainedMessage(const std::string &topic, const std:: | ||
| 448 | 448 | ||
| 449 | if (!selectedChildren) | 449 | if (!selectedChildren) |
| 450 | { | 450 | { |
| 451 | - selectedChildren.reset(new RetainedMessageNode()); | 451 | + selectedChildren = std::make_unique<RetainedMessageNode>(); |
| 452 | } | 452 | } |
| 453 | deepestNode = selectedChildren.get(); | 453 | deepestNode = selectedChildren.get(); |
| 454 | } | 454 | } |