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 /src/net/eathena/network.cpp | |
parent | 45f076bd429c40d81607f43837f1cc571f3f6be0 (diff) | |
download | manaplus-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.tar.gz manaplus-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.tar.bz2 manaplus-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.tar.xz manaplus-0dae81cae8d0d95b137f2fca1f74b7aa14e964ce.zip |
Improve network code speed.
Diffstat (limited to 'src/net/eathena/network.cpp')
-rw-r--r-- | src/net/eathena/network.cpp | 41 |
1 files changed, 22 insertions, 19 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) |