diff options
author | attilamolnar <attilamolnar@hush.com> | 2013-08-19 19:15:41 +0200 |
---|---|---|
committer | attilamolnar <attilamolnar@hush.com> | 2013-08-27 15:33:05 +0200 |
commit | 27ecc025acf7b01f51b2ecc32c28180dc49d793c (patch) | |
tree | 675924b55fa4f0d9b6a099d8e83ca8a9095371e1 | |
parent | 5384ddf545575bc27904b3534fb9d2340de7a1d7 (diff) |
m_spanningtree Changes to TreeSocket::WriteLine() to avoid string copies
- Change argument type to a reference to avoid copies of the string object
- If the std::string implementation is using copy-on-write then calling operator[] on a mutable string results in a copy; avoid this by calling .c_str() instead
-rw-r--r-- | src/modules/m_spanningtree/compat.cpp | 16 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket.h | 2 |
2 files changed, 12 insertions, 6 deletions
diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp index 0fc837beb..a9e48a10c 100644 --- a/src/modules/m_spanningtree/compat.cpp +++ b/src/modules/m_spanningtree/compat.cpp @@ -24,17 +24,19 @@ static std::string newline("\n"); -void TreeSocket::WriteLine(std::string line) +void TreeSocket::WriteLine(const std::string& original_line) { if (LinkState == CONNECTED) { - if (line[0] != ':') + if (original_line.c_str()[0] != ':') { ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Sending line without server prefix!"); - line = ":" + ServerInstance->Config->GetSID() + " " + line; + WriteLine(":" + ServerInstance->Config->GetSID() + " " + original_line); + return; } if (proto_version != ProtocolVersion) { + std::string line = original_line; std::string::size_type a = line.find(' '); std::string::size_type b = line.find(' ', a + 1); std::string command = line.substr(a + 1, b-a-1); @@ -159,11 +161,15 @@ void TreeSocket::WriteLine(std::string line) } } } + ServerInstance->Logs->Log(MODNAME, LOG_RAWIO, "S[%d] O %s", this->GetFd(), line.c_str()); + this->WriteData(line); + this->WriteData(newline); + return; } } - ServerInstance->Logs->Log(MODNAME, LOG_RAWIO, "S[%d] O %s", this->GetFd(), line.c_str()); - this->WriteData(line); + ServerInstance->Logs->Log(MODNAME, LOG_RAWIO, "S[%d] O %s", this->GetFd(), original_line.c_str()); + this->WriteData(original_line); this->WriteData(newline); } diff --git a/src/modules/m_spanningtree/treesocket.h b/src/modules/m_spanningtree/treesocket.h index 47bdef884..6d79711cc 100644 --- a/src/modules/m_spanningtree/treesocket.h +++ b/src/modules/m_spanningtree/treesocket.h @@ -237,7 +237,7 @@ class TreeSocket : public BufferedSocket /** Send one or more complete lines down the socket */ - void WriteLine(std::string line); + void WriteLine(const std::string& line); /** Handle ERROR command */ void Error(parameterlist ¶ms); |