* refactor: break out archiver's combined sync-async asset request routine ready for analysis of inventory item types other than objects

0.6.0-stable
Justin Clarke Casey 2008-07-04 18:36:12 +00:00
parent 35bd6e8760
commit e1782bc249
1 changed files with 37 additions and 25 deletions

View File

@ -83,6 +83,35 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
}
}
/// <summary>
/// Get an asset synchronously, potentially using an asynchronous callback. If the
/// asynchronous callback is used, we will wait for it to complete.
/// </summary>
/// <param name="uuid"></param>
/// <returns></returns>
protected AssetBase GetAsset(LLUUID uuid)
{
m_waitingForObjectAsset = true;
m_scene.AssetCache.GetAsset(uuid, AssetRequestCallback, true);
// The asset cache callback can either
//
// 1. Complete on the same thread (if the asset is already in the cache) or
// 2. Come in via a different thread (if we need to go fetch it).
//
// The code below handles both these alternatives.
lock (this)
{
if (m_waitingForObjectAsset)
{
Monitor.Wait(this);
m_waitingForObjectAsset = false;
}
}
return m_requestedObjectAsset;
}
/// <summary>
/// Get all the asset uuids associated with a given object. This includes both those directly associated with
/// it (e.g. face textures) and recursively, those of items within it's inventory (e.g. objects contained
@ -116,44 +145,27 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
assetUuids[texture.TextureID] = 1;
}
}
foreach (TaskInventoryItem tii in part.TaskInventory.Values)
{
if (!assetUuids.ContainsKey(tii.AssetID))
{
assetUuids[tii.AssetID] = 1;
if (tii.Type != (int)InventoryType.Object)
if ((int)InventoryType.Object == tii.Type)
{
m_log.DebugFormat("[ARCHIVER]: Recording asset {0} in object {1}", tii.AssetID, part.UUID);
}
else
{
m_waitingForObjectAsset = true;
m_scene.AssetCache.GetAsset(tii.AssetID, AssetRequestCallback, true);
AssetBase objectAsset = GetAsset(tii.AssetID);
// The asset cache callback can either
//
// 1. Complete on the same thread (if the asset is already in the cache) or
// 2. Come in via a different thread (if we need to go fetch it).
//
// The code below handles both these alternatives.
lock (this)
if (null != objectAsset)
{
if (m_waitingForObjectAsset)
{
Monitor.Wait(this);
m_waitingForObjectAsset = false;
}
}
if (null != m_requestedObjectAsset)
{
string xml = Helpers.FieldToUTF8String(m_requestedObjectAsset.Data);
string xml = Helpers.FieldToUTF8String(objectAsset.Data);
SceneObjectGroup sog = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, xml);
GetSceneObjectAssetUuids(sog, assetUuids);
}
}
else
{
m_log.DebugFormat("[ARCHIVER]: Recording asset {0} in object {1}", tii.AssetID, part.UUID);
}
}
}
}