change mapandarray array update time
parent
be94a0bffa
commit
f2b447a08f
|
@ -41,14 +41,16 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
private Dictionary<TKey, TValue> m_dict;
|
private Dictionary<TKey, TValue> m_dict;
|
||||||
private TValue[] m_array;
|
private TValue[] m_array;
|
||||||
private object m_syncRoot = new object();
|
private int m_lastArrayVersion;
|
||||||
|
private int m_arrayVersion;
|
||||||
|
|
||||||
/// <summary>Number of values currently stored in the collection</summary>
|
/// <summary>Number of values currently stored in the collection</summary>
|
||||||
public int Count { get { return m_array.Length; } }
|
public int Count { get { return m_dict.Count; } }
|
||||||
/// <summary>NOTE: This collection is thread safe. You do not need to
|
/// <summary>NOTE: This collection is thread safe. You do not need to
|
||||||
/// acquire a lock to add, remove, or enumerate entries. This
|
/// acquire a lock to add, remove, or enumerate entries. This
|
||||||
/// synchronization object should only be locked for larger
|
/// synchronization object should only be locked for larger
|
||||||
/// transactions</summary>
|
/// transactions</summary>
|
||||||
|
private object m_syncRoot = new object();
|
||||||
public object SyncRoot { get { return m_syncRoot; } }
|
public object SyncRoot { get { return m_syncRoot; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -58,6 +60,8 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
m_dict = new Dictionary<TKey, TValue>();
|
m_dict = new Dictionary<TKey, TValue>();
|
||||||
m_array = new TValue[0];
|
m_array = new TValue[0];
|
||||||
|
m_lastArrayVersion = 0;
|
||||||
|
m_arrayVersion = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -68,6 +72,8 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
m_dict = new Dictionary<TKey, TValue>(capacity);
|
m_dict = new Dictionary<TKey, TValue>(capacity);
|
||||||
m_array = new TValue[0];
|
m_array = new TValue[0];
|
||||||
|
m_lastArrayVersion = 0;
|
||||||
|
m_arrayVersion = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -85,7 +91,7 @@ namespace OpenSim.Framework
|
||||||
bool containedKey = m_dict.ContainsKey(key);
|
bool containedKey = m_dict.ContainsKey(key);
|
||||||
|
|
||||||
m_dict[key] = value;
|
m_dict[key] = value;
|
||||||
CreateArray();
|
++m_arrayVersion;
|
||||||
|
|
||||||
return !containedKey;
|
return !containedKey;
|
||||||
}
|
}
|
||||||
|
@ -103,8 +109,8 @@ namespace OpenSim.Framework
|
||||||
lock (m_syncRoot)
|
lock (m_syncRoot)
|
||||||
{
|
{
|
||||||
m_dict.Add(key, value);
|
m_dict.Add(key, value);
|
||||||
CreateArray();
|
++m_arrayVersion;
|
||||||
return m_array.Length;
|
return m_dict.Count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,8 +124,7 @@ namespace OpenSim.Framework
|
||||||
lock (m_syncRoot)
|
lock (m_syncRoot)
|
||||||
{
|
{
|
||||||
bool removed = m_dict.Remove(key);
|
bool removed = m_dict.Remove(key);
|
||||||
CreateArray();
|
++m_arrayVersion;
|
||||||
|
|
||||||
return removed;
|
return removed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -159,6 +164,8 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
m_dict = new Dictionary<TKey, TValue>();
|
m_dict = new Dictionary<TKey, TValue>();
|
||||||
m_array = new TValue[0];
|
m_array = new TValue[0];
|
||||||
|
m_lastArrayVersion = 0;
|
||||||
|
m_arrayVersion = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,20 +177,17 @@ namespace OpenSim.Framework
|
||||||
/// values</returns>
|
/// values</returns>
|
||||||
public TValue[] GetArray()
|
public TValue[] GetArray()
|
||||||
{
|
{
|
||||||
|
lock (m_syncRoot)
|
||||||
|
{
|
||||||
|
if(m_lastArrayVersion != m_arrayVersion)
|
||||||
|
{
|
||||||
|
TValue[] array = new TValue[m_dict.Count];
|
||||||
|
m_dict.Values.CopyTo(array, 0);
|
||||||
|
m_array = array;
|
||||||
|
m_lastArrayVersion = m_arrayVersion;
|
||||||
|
}
|
||||||
return m_array;
|
return m_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateArray()
|
|
||||||
{
|
|
||||||
// Rebuild the array from the dictionary. This method must be
|
|
||||||
// called from inside a lock
|
|
||||||
TValue[] array = new TValue[m_dict.Count];
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
foreach (TValue value in m_dict.Values)
|
|
||||||
array[i++] = value;
|
|
||||||
|
|
||||||
m_array = array;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue