From 0dae81cae8d0d95b137f2fca1f74b7aa14e964ce Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 10 Feb 2013 02:13:26 +0300 Subject: Improve network code speed. --- src/net/eathena/network.cpp | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'src/net/eathena/network.cpp') 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(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( - sizeof(packet_lengths) / sizeof (short))) - { + if (msgId >= 0 && msgId < packet_lengths_size) len = packet_lengths[msgId]; - } } if (len == -1) -- cgit v1.2.3-60-g2f50