From 1ef62ca75ef8c551303b4e86e737b5d958d07ce7 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 30 Mar 2012 01:23:34 +0100
Subject: Lock NullFriendsData.m_Data for consistency and against concurrent
read/write
---
OpenSim/Data/Null/NullFriendsData.cs | 69 ++++++++++++++++++++----------------
1 file changed, 39 insertions(+), 30 deletions(-)
(limited to 'OpenSim/Data')
diff --git a/OpenSim/Data/Null/NullFriendsData.cs b/OpenSim/Data/Null/NullFriendsData.cs
index 0be32a4..473999f 100644
--- a/OpenSim/Data/Null/NullFriendsData.cs
+++ b/OpenSim/Data/Null/NullFriendsData.cs
@@ -29,6 +29,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
+using System.Threading;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
@@ -54,7 +55,8 @@ namespace OpenSim.Data.Null
///
public static void Clear()
{
- m_Data.Clear();
+ lock (m_Data)
+ m_Data.Clear();
}
public FriendsData[] GetFriends(UUID principalID)
@@ -71,27 +73,30 @@ namespace OpenSim.Data.Null
///
public FriendsData[] GetFriends(string userID)
{
- List lst = m_Data.FindAll(fdata =>
+ lock (m_Data)
{
- return fdata.PrincipalID == userID.ToString();
- });
-
- if (lst != null)
- {
- lst.ForEach(f =>
+ List lst = m_Data.FindAll(fdata =>
{
- FriendsData f2 = m_Data.Find(candidateF2 => f.Friend == candidateF2.PrincipalID);
- if (f2 != null)
- f.Data["TheirFlags"] = f2.Data["Flags"];
-
-// m_log.DebugFormat(
-// "[NULL FRIENDS DATA]: Got {0} {1} {2} for {3}",
-// f.Friend, f.Data["Flags"], f2 != null ? f.Data["TheirFlags"] : "not found!", f.PrincipalID);
+ return fdata.PrincipalID == userID.ToString();
});
-
-// m_log.DebugFormat("[NULL FRIENDS DATA]: Got {0} friends for {1}", lst.Count, userID);
-
- return lst.ToArray();
+
+ if (lst != null)
+ {
+ lst.ForEach(f =>
+ {
+ FriendsData f2 = m_Data.Find(candidateF2 => f.Friend == candidateF2.PrincipalID);
+ if (f2 != null)
+ f.Data["TheirFlags"] = f2.Data["Flags"];
+
+ // m_log.DebugFormat(
+ // "[NULL FRIENDS DATA]: Got {0} {1} {2} for {3}",
+ // f.Friend, f.Data["Flags"], f2 != null ? f.Data["TheirFlags"] : "not found!", f.PrincipalID);
+ });
+
+ // m_log.DebugFormat("[NULL FRIENDS DATA]: Got {0} friends for {1}", lst.Count, userID);
+
+ return lst.ToArray();
+ }
}
return new FriendsData[0];
@@ -105,7 +110,8 @@ namespace OpenSim.Data.Null
// m_log.DebugFormat(
// "[NULL FRIENDS DATA]: Storing {0} {1} {2}", data.PrincipalID, data.Friend, data.Data["Flags"]);
- m_Data.Add(data);
+ lock (m_Data)
+ m_Data.Add(data);
return true;
}
@@ -117,18 +123,21 @@ namespace OpenSim.Data.Null
public bool Delete(string userID, string friendID)
{
- List lst = m_Data.FindAll(delegate(FriendsData fdata) { return fdata.PrincipalID == userID.ToString(); });
- if (lst != null)
+ lock (m_Data)
{
- FriendsData friend = lst.Find(delegate(FriendsData fdata) { return fdata.Friend == friendID; });
- if (friendID != null)
+ List lst = m_Data.FindAll(delegate(FriendsData fdata) { return fdata.PrincipalID == userID.ToString(); });
+ if (lst != null)
{
-// m_log.DebugFormat(
-// "[NULL FRIENDS DATA]: Deleting friend {0} {1} for {2}",
-// friend.Friend, friend.Data["Flags"], friend.PrincipalID);
-
- m_Data.Remove(friend);
- return true;
+ FriendsData friend = lst.Find(delegate(FriendsData fdata) { return fdata.Friend == friendID; });
+ if (friendID != null)
+ {
+ // m_log.DebugFormat(
+ // "[NULL FRIENDS DATA]: Deleting friend {0} {1} for {2}",
+ // friend.Friend, friend.Data["Flags"], friend.PrincipalID);
+
+ m_Data.Remove(friend);
+ return true;
+ }
}
}
--
cgit v1.1