Made terrain uploads thread-safe

link-sitting
Oren Hurvitz 2013-09-18 15:55:42 +03:00 committed by Justin Clark-Casey (justincc)
parent a27c2432bb
commit f106ba87ca
4 changed files with 45 additions and 22 deletions

View File

@ -33,6 +33,7 @@ using OpenSim.Framework;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
using OpenSim.Region.Framework.Interfaces;
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{
@ -119,6 +120,14 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
}
else
{
// Check if the xfer is a terrain xfer
IEstateModule estateModule = m_Scene.RequestModuleInterface<IEstateModule>();
if (estateModule != null)
{
if (estateModule.IsTerrainXfer(xferID))
return;
}
m_log.ErrorFormat(
"[AGENT ASSET TRANSACTIONS]: Could not find uploader for xfer id {0}, packet id {1}, data length {2}",
xferID, packetID, data.Length);

View File

@ -829,26 +829,23 @@ namespace OpenSim.Region.CoreModules.World.Estate
private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID)
{
if (TerrainUploader != null)
lock (this)
{
lock (TerrainUploader)
if ((TerrainUploader != null) && (XferID == TerrainUploader.XferID))
{
if (XferID == TerrainUploader.XferID)
{
remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
TerrainUploader = null;
remoteClient.SendAlertMessage("Terrain Upload aborted by the client");
}
TerrainUploader = null;
remoteClient.SendAlertMessage("Terrain Upload aborted by the client");
}
}
}
private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient)
{
lock (TerrainUploader)
lock (this)
{
remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
@ -907,22 +904,32 @@ namespace OpenSim.Region.CoreModules.World.Estate
private void handleUploadTerrain(IClientAPI remote_client, string clientFileName)
{
if (TerrainUploader == null)
lock (this)
{
TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName);
lock (TerrainUploader)
if (TerrainUploader == null)
{
m_log.DebugFormat("Starting to receive uploaded terrain");
TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName);
remote_client.OnXferReceive += TerrainUploader.XferReceive;
remote_client.OnAbortXfer += AbortTerrainXferHandler;
TerrainUploader.TerrainUploadDone += HandleTerrainApplication;
TerrainUploader.RequestStartXfer(remote_client);
}
else
{
remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!");
}
TerrainUploader.RequestStartXfer(remote_client);
}
else
}
public bool IsTerrainXfer(ulong xferID)
{
lock (this)
{
remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!");
if (TerrainUploader == null)
return false;
else
return TerrainUploader.XferID == xferID;
}
}

View File

@ -78,7 +78,10 @@ namespace OpenSim.Region.CoreModules.World.Estate
/// <param name="data"></param>
public void XferReceive(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data)
{
if (mXferID == xferID)
if (mXferID != xferID)
return;
lock (this)
{
if (m_asset.Data.Length > 1)
{
@ -99,7 +102,6 @@ namespace OpenSim.Region.CoreModules.World.Estate
if ((packetID & 0x80000000) != 0)
{
SendCompleteMessage(remoteClient);
}
}
}

View File

@ -54,5 +54,10 @@ namespace OpenSim.Region.Framework.Interfaces
void setEstateTerrainBaseTexture(int level, UUID texture);
void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue);
/// <summary>
/// Returns whether the transfer ID is being used for a terrain transfer.
/// </summary>
bool IsTerrainXfer(ulong xferID);
}
}