Merge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork

avinationmerge
ubit 2012-09-01 03:12:10 +02:00
commit c93b2db9f2
4 changed files with 114 additions and 36 deletions

View File

@ -927,6 +927,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
packetInbox.EnqueueHigh(new IncomingPacket((LLClientView)client, packet)); packetInbox.EnqueueHigh(new IncomingPacket((LLClientView)client, packet));
else else
packetInbox.EnqueueLow(new IncomingPacket((LLClientView)client, packet)); packetInbox.EnqueueLow(new IncomingPacket((LLClientView)client, packet));
// packetInbox.Enqueue(new IncomingPacket((LLClientView)client, packet));
} }
#region BinaryStats #region BinaryStats

View File

@ -86,7 +86,10 @@ namespace OpenSim.Region.CoreModules.World.Land
/// <value> /// <value>
/// Land objects keyed by local id /// Land objects keyed by local id
/// </value> /// </value>
private readonly Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>(); // private readonly Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>();
//ubit: removed the readonly so i can move it around
private Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>();
private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
@ -242,15 +245,19 @@ namespace OpenSim.Region.CoreModules.World.Land
{ {
LandData newData = data.Copy(); LandData newData = data.Copy();
newData.LocalID = local_id; newData.LocalID = local_id;
ILandObject landobj = null;
lock (m_landList) lock (m_landList)
{ {
if (m_landList.ContainsKey(local_id)) if (m_landList.ContainsKey(local_id))
{ {
m_landList[local_id].LandData = newData; m_landList[local_id].LandData = newData;
m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]); landobj = m_landList[local_id];
// m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
} }
} }
if(landobj != null)
m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, landobj);
} }
public bool AllowedForcefulBans public bool AllowedForcefulBans
@ -617,21 +624,28 @@ namespace OpenSim.Region.CoreModules.World.Land
/// </summary> /// </summary>
public void Clear(bool setupDefaultParcel) public void Clear(bool setupDefaultParcel)
{ {
Dictionary<int, ILandObject> landworkList;
// move to work pointer since we are deleting it all
lock (m_landList) lock (m_landList)
{ {
foreach (ILandObject lo in m_landList.Values) landworkList = m_landList;
{ m_landList = new Dictionary<int, ILandObject>();
//m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
} }
m_landList.Clear(); // this 2 methods have locks (now)
ResetSimLandObjects(); ResetSimLandObjects();
if (setupDefaultParcel) if (setupDefaultParcel)
CreateDefaultParcel(); CreateDefaultParcel();
// fire outside events unlocked
foreach (ILandObject lo in landworkList.Values)
{
//m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
} }
landworkList.Clear();
} }
private void performFinalLandJoin(ILandObject master, ILandObject slave) private void performFinalLandJoin(ILandObject master, ILandObject slave)
@ -1324,22 +1338,32 @@ namespace OpenSim.Region.CoreModules.World.Land
public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data) public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data)
{ {
Dictionary<int, ILandObject> landworkList;
// move to work pointer since we are deleting it all
lock (m_landList) lock (m_landList)
{ {
//Remove all the land objects in the sim and then process our new data landworkList = m_landList;
foreach (int n in m_landList.Keys) m_landList = new Dictionary<int, ILandObject>();
{
m_scene.EventManager.TriggerLandObjectRemoved(m_landList[n].LandData.GlobalID);
} }
//Remove all the land objects in the sim and then process our new data
foreach (int n in landworkList.Keys)
{
m_scene.EventManager.TriggerLandObjectRemoved(landworkList[n].LandData.GlobalID);
}
landworkList.Clear();
lock (m_landList)
{
m_landIDList.Initialize(); m_landIDList.Initialize();
m_landList.Clear(); m_landList.Clear();
}
for (int i = 0; i < data.Count; i++) for (int i = 0; i < data.Count; i++)
{ {
IncomingLandObjectFromStorage(data[i]); IncomingLandObjectFromStorage(data[i]);
} }
} }
}
public void IncomingLandObjectFromStorage(LandData data) public void IncomingLandObjectFromStorage(LandData data)
{ {
@ -1366,7 +1390,8 @@ namespace OpenSim.Region.CoreModules.World.Land
public void EventManagerOnNoLandDataFromStorage() public void EventManagerOnNoLandDataFromStorage()
{ {
lock (m_landList) // called methods already have locks
// lock (m_landList)
{ {
ResetSimLandObjects(); ResetSimLandObjects();
CreateDefaultParcel(); CreateDefaultParcel();

View File

@ -422,6 +422,20 @@ namespace OpenSim.Region.Framework.Scenes
); );
} }
private class DescendentsRequestData
{
public IClientAPI RemoteClient;
public UUID FolderID;
public UUID OwnerID;
public bool FetchFolders;
public bool FetchItems;
public int SortOrder;
}
private Queue<DescendentsRequestData> m_descendentsRequestQueue = new Queue<DescendentsRequestData>();
private Object m_descendentsRequestLock = new Object();
private bool m_descendentsRequestProcessing = false;
/// <summary> /// <summary>
/// Tell the client about the various child items and folders contained in the requested folder. /// Tell the client about the various child items and folders contained in the requested folder.
/// </summary> /// </summary>
@ -458,17 +472,38 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
lock (m_descendentsRequestLock)
{
if (!m_descendentsRequestProcessing)
{
m_descendentsRequestProcessing = true;
// We're going to send the reply async, because there may be // We're going to send the reply async, because there may be
// an enormous quantity of packets -- basically the entire inventory! // an enormous quantity of packets -- basically the entire inventory!
// We don't want to block the client thread while all that is happening. // We don't want to block the client thread while all that is happening.
SendInventoryDelegate d = SendInventoryAsync; SendInventoryDelegate d = SendInventoryAsync;
d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d);
return;
}
DescendentsRequestData req = new DescendentsRequestData();
req.RemoteClient = remoteClient;
req.FolderID = folderID;
req.OwnerID = ownerID;
req.FetchFolders = fetchFolders;
req.FetchItems = fetchItems;
req.SortOrder = sortOrder;
m_descendentsRequestQueue.Enqueue(req);
}
} }
delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder)
{ {
Thread.Sleep(20);
SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
} }
@ -476,6 +511,21 @@ namespace OpenSim.Region.Framework.Scenes
{ {
SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState;
d.EndInvoke(iar); d.EndInvoke(iar);
lock (m_descendentsRequestLock)
{
if (m_descendentsRequestQueue.Count > 0)
{
DescendentsRequestData req = m_descendentsRequestQueue.Dequeue();
d = SendInventoryAsync;
d.BeginInvoke(req.RemoteClient, req.FolderID, req.OwnerID, req.FetchFolders, req.FetchItems, req.SortOrder, SendInventoryComplete, d);
return;
}
m_descendentsRequestProcessing = false;
}
} }
/// <summary> /// <summary>

View File

@ -5475,7 +5475,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// for completion and should LSL_Key ever be implemented // for completion and should LSL_Key ever be implemented
// as it's own struct // as it's own struct
else if (!(src.Data[index] is LSL_String || else if (!(src.Data[index] is LSL_String ||
src.Data[index] is LSL_Key)) src.Data[index] is LSL_Key ||
src.Data[index] is String))
{ {
return ""; return "";
} }
@ -12818,7 +12819,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llCollisionSprite(string impact_sprite) public void llCollisionSprite(string impact_sprite)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llCollisionSprite"); // Viewer 2.0 broke this and it's likely LL has no intention
// of fixing it. Therefore, letting this be a NOP seems appropriate.
} }
public void llGodLikeRezObject(string inventory, LSL_Vector pos) public void llGodLikeRezObject(string inventory, LSL_Vector pos)