From 7b094a35dde581e72d74c21cd6d0db2e99344af2 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey Date: Mon, 4 Aug 2014 22:14:04 +0100 Subject: [PATCH] Handle incoming caps events sync rather than async to avoid unexpected out-of-order processing Under moderate or greater CPU load, pushing to the threadpool means that events such as EstablishAgentCommunication may be processed before EnableSimulator even though the simulator sends them in the reverse order. This triggers the logging of various errors and warnings by libomv. Handling these synchronously shouldn't have a huge impact since the number of events is not high and taking time here can only hold up event upload --- OpenMetaverse/EventDictionary.cs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/OpenMetaverse/EventDictionary.cs b/OpenMetaverse/EventDictionary.cs index 5525854f..0d17073e 100644 --- a/OpenMetaverse/EventDictionary.cs +++ b/OpenMetaverse/EventDictionary.cs @@ -324,24 +324,27 @@ namespace OpenMetaverse { if (callback != null) { - CapsCallbackWrapper wrapper; - wrapper.Callback = callback; - wrapper.CapsEvent = capsEvent; - wrapper.Message = message; - wrapper.Simulator = simulator; - WorkPool.QueueUserWorkItem(_ThreadPoolCallback, wrapper); + callback(capsEvent, message, simulator); +// CapsCallbackWrapper wrapper; +// wrapper.Callback = callback; +// wrapper.CapsEvent = capsEvent; +// wrapper.Message = message; +// wrapper.Simulator = simulator; +// WorkPool.QueueUserWorkItem(_ThreadPoolCallback, wrapper); } } // Explicit handler next if (_EventTable.TryGetValue(capsEvent, out callback) && callback != null) { - CapsCallbackWrapper wrapper; - wrapper.Callback = callback; - wrapper.CapsEvent = capsEvent; - wrapper.Message = message; - wrapper.Simulator = simulator; - WorkPool.QueueUserWorkItem(_ThreadPoolCallback, wrapper); + callback(capsEvent, message, simulator); + +// CapsCallbackWrapper wrapper; +// wrapper.Callback = callback; +// wrapper.CapsEvent = capsEvent; +// wrapper.Message = message; +// wrapper.Simulator = simulator; +// WorkPool.QueueUserWorkItem(_ThreadPoolCallback, wrapper); specialHandler = true; }