Made terrain uploads thread-safe

This commit is contained in:
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

@@ -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);
}
}
}