diff options
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | 28 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 5 |
2 files changed, 24 insertions, 9 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 236a47c..07d1cb3 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -169,6 +169,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
169 | 169 | ||
170 | public bool SendAppearance(UUID agentId) | 170 | public bool SendAppearance(UUID agentId) |
171 | { | 171 | { |
172 | // m_log.DebugFormat("[AVFACTORY]: Sending appearance for {0}", agentId); | ||
173 | |||
172 | ScenePresence sp = m_scene.GetScenePresence(agentId); | 174 | ScenePresence sp = m_scene.GetScenePresence(agentId); |
173 | if (sp == null) | 175 | if (sp == null) |
174 | { | 176 | { |
@@ -257,7 +259,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
257 | /// </summary> | 259 | /// </summary> |
258 | public void QueueAppearanceSend(UUID agentid) | 260 | public void QueueAppearanceSend(UUID agentid) |
259 | { | 261 | { |
260 | // m_log.WarnFormat("[AVFACTORY]: Queue appearance send for {0}", agentid); | 262 | // m_log.DebugFormat("[AVFACTORY]: Queue appearance send for {0}", agentid); |
261 | 263 | ||
262 | // 10000 ticks per millisecond, 1000 milliseconds per second | 264 | // 10000 ticks per millisecond, 1000 milliseconds per second |
263 | long timestamp = DateTime.Now.Ticks + Convert.ToInt64(m_sendtime * 1000 * 10000); | 265 | long timestamp = DateTime.Now.Ticks + Convert.ToInt64(m_sendtime * 1000 * 10000); |
@@ -393,10 +395,17 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
393 | Dictionary<UUID, long> sends = new Dictionary<UUID, long>(m_sendqueue); | 395 | Dictionary<UUID, long> sends = new Dictionary<UUID, long>(m_sendqueue); |
394 | foreach (KeyValuePair<UUID, long> kvp in sends) | 396 | foreach (KeyValuePair<UUID, long> kvp in sends) |
395 | { | 397 | { |
396 | if (kvp.Value < now) | 398 | // We have to load the key and value into local parameters to avoid a race condition if we loop |
399 | // around and load kvp with a different value before FireAndForget has launched its thread. | ||
400 | UUID avatarID = kvp.Key; | ||
401 | long sendTime = kvp.Value; | ||
402 | |||
403 | // m_log.DebugFormat("[AVFACTORY]: Handling queued appearance updates for {0}, update delta to now is {1}", avatarID, sendTime - now); | ||
404 | |||
405 | if (sendTime < now) | ||
397 | { | 406 | { |
398 | Util.FireAndForget(delegate(object o) { SendAppearance(kvp.Key); }); | 407 | Util.FireAndForget(o => SendAppearance(avatarID)); |
399 | m_sendqueue.Remove(kvp.Key); | 408 | m_sendqueue.Remove(avatarID); |
400 | } | 409 | } |
401 | } | 410 | } |
402 | } | 411 | } |
@@ -406,10 +415,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
406 | Dictionary<UUID, long> saves = new Dictionary<UUID, long>(m_savequeue); | 415 | Dictionary<UUID, long> saves = new Dictionary<UUID, long>(m_savequeue); |
407 | foreach (KeyValuePair<UUID, long> kvp in saves) | 416 | foreach (KeyValuePair<UUID, long> kvp in saves) |
408 | { | 417 | { |
409 | if (kvp.Value < now) | 418 | // We have to load the key and value into local parameters to avoid a race condition if we loop |
419 | // around and load kvp with a different value before FireAndForget has launched its thread. | ||
420 | UUID avatarID = kvp.Key; | ||
421 | long sendTime = kvp.Value; | ||
422 | |||
423 | if (sendTime < now) | ||
410 | { | 424 | { |
411 | Util.FireAndForget(delegate(object o) { SaveAppearance(kvp.Key); }); | 425 | Util.FireAndForget(o => SaveAppearance(avatarID)); |
412 | m_savequeue.Remove(kvp.Key); | 426 | m_savequeue.Remove(avatarID); |
413 | } | 427 | } |
414 | } | 428 | } |
415 | } | 429 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 29966f9..3e3fb0f 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2628,7 +2628,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2628 | /// </summary> | 2628 | /// </summary> |
2629 | public void SendAppearanceToAllOtherAgents() | 2629 | public void SendAppearanceToAllOtherAgents() |
2630 | { | 2630 | { |
2631 | //m_log.DebugFormat("[SCENE PRESENCE] SendAppearanceToAllOtherAgents: {0} ({1})", Name, UUID); | 2631 | // m_log.DebugFormat("[SCENE PRESENCE] SendAppearanceToAllOtherAgents: {0} {1}", Name, UUID); |
2632 | |||
2632 | // only send update from root agents to other clients; children are only "listening posts" | 2633 | // only send update from root agents to other clients; children are only "listening posts" |
2633 | if (IsChildAgent) | 2634 | if (IsChildAgent) |
2634 | { | 2635 | { |
@@ -2656,7 +2657,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2656 | /// </summary> | 2657 | /// </summary> |
2657 | public void SendOtherAgentsAppearanceToMe() | 2658 | public void SendOtherAgentsAppearanceToMe() |
2658 | { | 2659 | { |
2659 | //m_log.DebugFormat("[SCENE PRESENCE] SendOtherAgentsAppearanceToMe: {0} ({1})", Name, UUID); | 2660 | // m_log.DebugFormat("[SCENE PRESENCE] SendOtherAgentsAppearanceToMe: {0} {1}", Name, UUID); |
2660 | 2661 | ||
2661 | int count = 0; | 2662 | int count = 0; |
2662 | m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | 2663 | m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) |