diff options
author | Andrei Karas <akaras@inbox.ru> | 2013-02-10 02:13:26 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2013-02-10 03:07:44 +0300 |
commit | 0dae81cae8d0d95b137f2fca1f74b7aa14e964ce (patch) | |
tree | 73476a1f0d7296286f10261c0aa4457961389835 | |
parent | 45f076bd429c40d81607f43837f1cc571f3f6be0 (diff) | |
download | manaverse-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.tar.gz manaverse-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.tar.bz2 manaverse-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.tar.xz manaverse-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.zip |
Improve network code speed.
-rw-r--r-- | src/net/eathena/network.cpp | 41 | ||||
-rw-r--r-- | src/net/eathena/network.h | 4 | ||||
-rw-r--r-- | src/net/tmwa/network.cpp | 42 | ||||
-rw-r--r-- | src/net/tmwa/network.h | 4 |
4 files changed, 46 insertions, 45 deletions
diff --git a/src/net/eathena/network.cpp b/src/net/eathena/network.cpp index 00e2fa9cf..b72f78487 100644 --- a/src/net/eathena/network.cpp +++ b/src/net/eathena/network.cpp @@ -108,17 +108,24 @@ short packet_lengths[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +static constexpr const int packet_lengths_size + = static_cast<int>(sizeof(packet_lengths) / sizeof (short)); +static constexpr const unsigned int messagesSize = 0xffff; Network *Network::mInstance = nullptr; Network::Network() : Ea::Network() { mInstance = this; + mMessageHandlers = new MessageHandler*[messagesSize]; + memset(&mMessageHandlers[0], 0, sizeof(MessageHandler*) * 0xffff); } Network::~Network() { clearHandlers(); + delete mMessageHandlers; + mMessageHandlers = nullptr; mInstance = nullptr; } @@ -139,19 +146,21 @@ void Network::unregisterHandler(MessageHandler *handler) return; for (const uint16_t *i = handler->handledMessages; *i; ++i) - mMessageHandlers.erase(*i); + mMessageHandlers[*i] = nullptr; handler->setNetwork(nullptr); } void Network::clearHandlers() { - FOR_EACH (MessageHandlerIterator, i, mMessageHandlers) + for (int f = 0; f < messagesSize; f ++) { - if (i->second) - i->second->setNetwork(nullptr); + if (mMessageHandlers[f]) + { + mMessageHandlers[f]->setNetwork(nullptr); + mMessageHandlers[f] = nullptr; + } } - mMessageHandlers.clear(); } void Network::dispatchMessages() @@ -160,20 +169,17 @@ void Network::dispatchMessages() { MessageIn *const msg = getNextMessage(); - const MessageHandlerIterator iter = mMessageHandlers.find( - msg->getId()); - if (msg->getLength() == 0) logger->safeError("Zero length packet received. Exiting."); - if (iter != mMessageHandlers.end()) - { - if (iter->second) - iter->second->handleMessage(*msg); - } - else + const int id = msg->getId(); + if (id >= 0 && id < messagesSize) { - logger->log("Unhandled packet: %x", msg->getId()); + MessageHandler *const handler = mMessageHandlers[id]; + if (handler) + handler->handleMessage(*msg); + else + logger->log("Unhandled packet: %x", msg->getId()); } skip(msg->getLength()); @@ -227,11 +233,8 @@ MessageIn *Network::getNextMessage() } else { - if (msgId >= 0 && msgId < static_cast<signed>( - sizeof(packet_lengths) / sizeof (short))) - { + if (msgId >= 0 && msgId < packet_lengths_size) len = packet_lengths[msgId]; - } } if (len == -1) diff --git a/src/net/eathena/network.h b/src/net/eathena/network.h index 52ab60a90..e2405f63d 100644 --- a/src/net/eathena/network.h +++ b/src/net/eathena/network.h @@ -69,9 +69,7 @@ class Network final : public Ea::Network static Network *instance() A_WARN_UNUSED; - typedef std::map<uint16_t, MessageHandler*> MessageHandlers; - typedef MessageHandlers::iterator MessageHandlerIterator; - MessageHandlers mMessageHandlers; + MessageHandler **mMessageHandlers; static Network *mInstance; }; diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp index d0e0686fc..6f940cf23 100644 --- a/src/net/tmwa/network.cpp +++ b/src/net/tmwa/network.cpp @@ -86,17 +86,24 @@ short packet_lengths[] = -1, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +static constexpr const int packet_lengths_size + = static_cast<int>(sizeof(packet_lengths) / sizeof (short)); +static constexpr const unsigned int messagesSize = 0xffff; Network *Network::mInstance = nullptr; Network::Network() : Ea::Network() { mInstance = this; + mMessageHandlers = new MessageHandler*[messagesSize]; + memset(&mMessageHandlers[0], 0, sizeof(MessageHandler*) * 0xffff); } Network::~Network() { clearHandlers(); + delete mMessageHandlers; + mMessageHandlers = nullptr; mInstance = nullptr; } @@ -117,19 +124,21 @@ void Network::unregisterHandler(MessageHandler *handler) return; for (const uint16_t *i = handler->handledMessages; *i; ++i) - mMessageHandlers.erase(*i); + mMessageHandlers[*i] = nullptr; handler->setNetwork(nullptr); } void Network::clearHandlers() { - FOR_EACH (MessageHandlerIterator, i, mMessageHandlers) + for (int f = 0; f < messagesSize; f ++) { - if (i->second) - i->second->setNetwork(nullptr); + if (mMessageHandlers[f]) + { + mMessageHandlers[f]->setNetwork(nullptr); + mMessageHandlers[f] = nullptr; + } } - mMessageHandlers.clear(); } void Network::dispatchMessages() @@ -138,21 +147,17 @@ void Network::dispatchMessages() while (messageReady()) { MessageIn *const msg = getNextMessage(); - - const MessageHandlerIterator iter = mMessageHandlers.find( - msg->getId()); - if (msg->getLength() == 0) logger->safeError("Zero length packet received. Exiting."); - if (iter != mMessageHandlers.end()) - { - if (iter->second) - iter->second->handleMessage(*msg); - } - else + const int id = msg->getId(); + if (id >= 0 && id < messagesSize) { - logger->log("Unhandled packet: %x", msg->getId()); + MessageHandler *const handler = mMessageHandlers[id]; + if (handler) + handler->handleMessage(*msg); + else + logger->log("Unhandled packet: %x", msg->getId()); } skip(msg->getLength()); @@ -179,11 +184,8 @@ bool Network::messageReady() } else { - if (msgId >= 0 && msgId < static_cast<signed>( - sizeof(packet_lengths) / sizeof (short))) - { + if (msgId >= 0 && msgId < packet_lengths_size) len = packet_lengths[msgId]; - } } if (len == -1 && mInSize > 4) diff --git a/src/net/tmwa/network.h b/src/net/tmwa/network.h index 7806147a9..9878239d5 100644 --- a/src/net/tmwa/network.h +++ b/src/net/tmwa/network.h @@ -70,9 +70,7 @@ class Network final : public Ea::Network static Network *instance() A_WARN_UNUSED; - typedef std::map<uint16_t, MessageHandler*> MessageHandlers; - typedef MessageHandlers::iterator MessageHandlerIterator; - MessageHandlers mMessageHandlers; + MessageHandler **mMessageHandlers; static Network *mInstance; }; |