diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index 1e70b849c2..ac21b53bd6 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs @@ -56,6 +56,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement // The cache protected Dictionary m_UserCache = new Dictionary(); + private object m_AddUserLock = new object(); #region ISharedRegionModule @@ -475,9 +476,11 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement UserData oldUser; //lock the whole block - prevent concurrent update - lock (m_UserCache) + lock (m_AddUserLock) { - m_UserCache.TryGetValue (id, out oldUser); + lock (m_UserCache) + m_UserCache.TryGetValue(id, out oldUser); + if (oldUser != null) { if (creatorData == null || creatorData == String.Empty) @@ -488,9 +491,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement //try update unknown users //and creator's home URL's - if ((oldUser.FirstName == "Unknown" && !creatorData.Contains ("Unknown")) || (oldUser.HomeURL != null && !creatorData.StartsWith (oldUser.HomeURL))) + if ((oldUser.FirstName == "Unknown" && !creatorData.Contains("Unknown")) || (oldUser.HomeURL != null && !creatorData.StartsWith(oldUser.HomeURL))) { - m_UserCache.Remove (id); + lock (m_UserCache) + m_UserCache.Remove(id); m_log.DebugFormat("[USER MANAGEMENT MODULE]: Re-adding user with id {0}, creatorData [{1}] and old HomeURL {2}", id, creatorData, oldUser.HomeURL); } else @@ -500,38 +504,38 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement } } - UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount (m_Scenes [0].RegionInfo.ScopeID, id); + UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id); if (account != null) { - AddUser (id, account.FirstName, account.LastName); + AddUser(id, account.FirstName, account.LastName); } else { - UserData user = new UserData (); + UserData user = new UserData(); user.Id = id; if (creatorData != null && creatorData != string.Empty) { //creatorData = ; - string[] parts = creatorData.Split (';'); + string[] parts = creatorData.Split(';'); if (parts.Length >= 1) { - user.HomeURL = parts [0]; + user.HomeURL = parts[0]; try { - Uri uri = new Uri (parts [0]); + Uri uri = new Uri(parts[0]); user.LastName = "@" + uri.Authority; } catch (UriFormatException) { - m_log.DebugFormat ("[SCENE]: Unable to parse Uri {0}", parts [0]); + m_log.DebugFormat("[SCENE]: Unable to parse Uri {0}", parts[0]); user.LastName = "@unknown"; } } if (parts.Length >= 2) - user.FirstName = parts [1].Replace (' ', '.'); + user.FirstName = parts[1].Replace(' ', '.'); } else { @@ -539,7 +543,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement user.LastName = "UserUMMAU"; } - AddUserInternal (user); + AddUserInternal(user); } } }