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/tmwa/network.cpp | 42 ++++++++++++++++++++++-------------------- src/net/tmwa/network.h | 4 +--- 2 files changed, 23 insertions(+), 23 deletions(-) (limited to 'src/net/tmwa') 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(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( - 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 MessageHandlers; - typedef MessageHandlers::iterator MessageHandlerIterator; - MessageHandlers mMessageHandlers; + MessageHandler **mMessageHandlers; static Network *mInstance; }; -- cgit v1.2.3-70-g09d2