From e6cb7b47646f8d7a23aca50d92fb57a639bbf702 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 15 Jun 2013 00:52:57 +0100 Subject: Lock m_classifiedCache and m_classifiedInterest dictionary reads in UserProfileModule since in the presence of writes these are not thread-safe operations. Simplified locking to m_classifiedCache only since r/w of both dictionaries always occurs together --- .../Avatar/UserProfiles/UserProfileModule.cs | 27 +++++++++++----------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'OpenSim/Region/CoreModules/Avatar/UserProfiles') diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index d7ffea8..161f160 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -331,17 +331,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles classifieds[cid] = name; - if (!m_classifiedCache.ContainsKey(cid)) + lock (m_classifiedCache) { - lock(m_classifiedCache) + if (!m_classifiedCache.ContainsKey(cid)) + { m_classifiedCache.Add(cid,creatorId); - - lock(m_classifiedInterest) m_classifiedInterest.Add(cid, 0); - } + } - lock(m_classifiedInterest) m_classifiedInterest[cid]++; + } } remoteClient.SendAvatarClassifiedReply(new UUID(args[0]), classifieds); @@ -353,19 +352,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles UserClassifiedAdd ad = new UserClassifiedAdd(); ad.ClassifiedId = queryClassifiedID; - if (m_classifiedCache.ContainsKey(queryClassifiedID)) - { - target = m_classifiedCache[queryClassifiedID]; + lock (m_classifiedCache) + { + if (m_classifiedCache.ContainsKey(queryClassifiedID)) + { + target = m_classifiedCache[queryClassifiedID]; - lock(m_classifiedInterest) m_classifiedInterest[queryClassifiedID] --; - if(m_classifiedInterest[queryClassifiedID] == 0) - { - lock(m_classifiedInterest) + if (m_classifiedInterest[queryClassifiedID] == 0) + { m_classifiedInterest.Remove(queryClassifiedID); - lock(m_classifiedCache) m_classifiedCache.Remove(queryClassifiedID); + } } } -- cgit v1.1