/// <summary>
        ///     Creates a new args object for the <see cref="IRemoteServer.MessageReceived"/> event.
        /// </summary>
        /// <param name="message">The message received.</param>
        /// <param name="sendMode">The send mode the message was received with.</param>
        /// <param name="remoteServer">The server the message was received from.</param>
        public static ServerMessageReceivedEventArgs Create(Message message, SendMode sendMode, IRemoteServer remoteServer)
        {
            ServerMessageReceivedEventArgs messageReceivedEventArgs = ServerObjectCache.GetServerMessageReceivedEventArgs();

            messageReceivedEventArgs.message      = message;
            messageReceivedEventArgs.SendMode     = sendMode;
            messageReceivedEventArgs.RemoteServer = remoteServer;

            messageReceivedEventArgs.isCurrentlyLoungingInAPool = false;

            return(messageReceivedEventArgs);
        }
Beispiel #2
0
        public static void ReturnServerMessageReceivedEventArgs(ServerMessageReceivedEventArgs writer)
        {
            if (!initialized)
            {
                ThreadInitialize();
            }

#if DEBUG
            ServerObjectCacheTestHelper.ServerMessageReceivedEventArgsWasReturned();
#endif
            serverMessageReceivedEventArgsPool.ReturnInstance(writer);
        }
        /// <summary>
        ///     Handles a message received.
        /// </summary>
        /// <param name="message">The message that was received.</param>
        /// <param name="sendMode">The send mode the emssage was received with.</param>
        private void HandleMessage(Message message, SendMode sendMode)
        {
            // Get another reference to the message so 1. we can control the backing array's lifecycle and thus it won't get disposed of before we dispatch, and
            // 2. because the current message will be disposed of when this method returns.
            Message messageReference = message.Clone();

            void DoMessageReceived()
            {
                ServerMessageReceivedEventArgs args = ServerMessageReceivedEventArgs.Create(message, sendMode, this);

                long startTimestamp = Stopwatch.GetTimestamp();

                try
                {
                    MessageReceived?.Invoke(this, args);
                }
                catch (Exception e)
                {
                    messageReceivedEventFailuresCounter.Increment();

                    logger.Error("A plugin encountered an error whilst handling the MessageReceived event. (See logs for exception)", e);
                }
                finally
                {
                    // Now we've executed everything, dispose the message reference and release the backing array!
                    messageReference.Dispose();
                    args.Dispose();
                }

                double time = (double)(Stopwatch.GetTimestamp() - startTimestamp) / Stopwatch.Frequency;

                messageReceivedEventTimeHistogram.Report(time);
            }

            //Inform plugins
            threadHelper.DispatchIfNeeded(DoMessageReceived);
        }