From 53d5aeec2459b5788da9882f651ed33d3138a753 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Wed, 20 Feb 2008 19:02:04 +0000 Subject: * Remove unused texture dictionaries from AssetCache * Add documentation to AssetCache --- .../Framework/Communications/Cache/AssetCache.cs | 117 ++++++++++++--------- .../Communications/Cache/AssetServerBase.cs | 4 + 2 files changed, 73 insertions(+), 48 deletions(-) (limited to 'OpenSim/Framework') diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index d94af44..0d85345 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs @@ -41,38 +41,60 @@ namespace OpenSim.Framework.Communications.Cache /// /// Manages local cache of assets and their sending to viewers. + /// + /// This class actually encapsulates two largely separate mechanisms. One mechanism fetches assets either + /// synchronously or async and passes the data back to the requester. The second mechanism fetches assets and + /// sends packetised data directly back to the client. The only point where they meets is AssetReceived() and + /// AssetNotFound(). + /// + /// TODO Assets in this cache are effectively immortal (they are never disposed off through old age). + /// This is not a huge problem at the moment since other memory use usually dwarfs that used by assets + /// but it's something to bear in mind. /// public class AssetCache : IAssetReceiver { - private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private static readonly log4net.ILog m_log + = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - public Dictionary Assets; - public Dictionary Textures; - - public List AssetRequests; //assets ready to be sent to viewers - public List TextureRequests; //textures ready to be sent - - public Dictionary RequestedAssets; - //Assets requested from the asset server + /// + /// The cache of assets. This does not include textures. + /// + private Dictionary Assets; + + /// + /// The cache of textures. + /// + private Dictionary Textures; - public Dictionary RequestedTextures; - //Textures requested from the asset server + /// + /// Assets requests which are waiting for asset server data. This includes texture requests + /// + private Dictionary RequestedAssets; + + /// + /// Asset requests with data which are ready to be sent back to requesters. This includes textures. + /// + private List AssetRequests; - public Dictionary RequestLists; + /// + /// Until the asset request is fulfilled, each asset request is associated with a list of requesters + /// + private Dictionary RequestLists; private readonly IAssetServer m_assetServer; private readonly Thread m_assetCacheThread; + /// + /// Report statistical data. + /// public void ShowState() { - m_log.InfoFormat("Assets:{0} Textures:{1} AssetRequests:{2} TextureRequests:{3} RequestedAssets:{4} RequestedTextures:{5} RequestLists:{6}", + m_log.InfoFormat("Assets:{0} Textures:{1} AssetRequests:{2} RequestedAssets:{3} RequestLists:{4}", Assets.Count, Textures.Count, AssetRequests.Count, - TextureRequests.Count, RequestedAssets.Count, - RequestedTextures.Count, RequestLists.Count); int temporaryImages = 0; @@ -81,9 +103,6 @@ namespace OpenSim.Framework.Communications.Cache long imageBytes = 0; long assetBytes = 0; - - - foreach (TextureImage texture in Textures.Values) { if (texture.Temporary) @@ -109,30 +128,37 @@ namespace OpenSim.Framework.Communications.Cache temporaryAssets); m_log.InfoFormat("Image data: {0}kb Asset data: {1}kb", - imageBytes / 1024, - assetBytes / 1024); + imageBytes / 1024, + assetBytes / 1024); } + /// + /// Clear the asset cache. + /// public void Clear() { m_log.Info("[ASSET CACHE]: Clearing Asset cache"); Initialize(); } + /// + /// Initialize the cache. + /// private void Initialize() { Assets = new Dictionary(); Textures = new Dictionary(); - AssetRequests = new List(); //assets ready to be sent to viewers - TextureRequests = new List(); //textures ready to be sent - + AssetRequests = new List(); + RequestedAssets = new Dictionary(); - RequestedTextures = new Dictionary(); RequestLists = new Dictionary(); } - + /// + /// Constructor. Initialize will need to be called separately. + /// + /// public AssetCache(IAssetServer assetServer) { m_log.Info("[ASSET CACHE]: Creating Asset cache"); @@ -148,7 +174,8 @@ namespace OpenSim.Framework.Communications.Cache } /// - /// + /// Process the asset queue which holds data which is packeted up and sent + /// directly back to the client. /// public void RunAssetManager() { @@ -359,6 +386,12 @@ namespace OpenSim.Framework.Communications.Cache m_log.InfoFormat("[ASSET CACHE]: Adding {0} {1} [{2}]: {3}.", temporary, type, asset.FullID, result); } + /// + /// Copy an asset and add it to the cache with a new assetID. + /// XXX We shouldn't actually ever need to do this! + /// + /// + /// public AssetBase CopyAsset(LLUUID assetID) { AssetBase asset; @@ -402,19 +435,6 @@ namespace OpenSim.Framework.Communications.Cache { StatsManager.SimExtraStats.AddTexture(image); } - - if (RequestedTextures.ContainsKey(image.FullID)) - { - m_log.InfoFormat("[ASSET CACHE]: Moving {0} from RequestedTextures to TextureRequests", asset.FullID); - - AssetRequest req = RequestedTextures[image.FullID]; - req.ImageInfo = image; - - req.NumPackets = CalculateNumPackets(image.Data); - - RequestedTextures.Remove(image.FullID); - TextureRequests.Add(req); - } } } else @@ -422,7 +442,7 @@ namespace OpenSim.Framework.Communications.Cache AssetInfo assetInf = new AssetInfo(asset); if (Assets.ContainsKey(assetInf.FullID)) { - m_log.InfoFormat("[ASSET CACHE]: There's already an asset {0} in memory. Skipping.", asset.FullID); + m_log.DebugFormat("[ASSET CACHE]: There's already an asset {0} in memory. Skipping.", asset.FullID); } else { @@ -435,7 +455,7 @@ namespace OpenSim.Framework.Communications.Cache if (RequestedAssets.ContainsKey(assetInf.FullID)) { - m_log.InfoFormat("[ASSET CACHE]: Moving {0} from RequestedAssets to AssetRequests", asset.FullID); + m_log.DebugFormat("[ASSET CACHE]: Moving {0} from RequestedAssets to AssetRequests", asset.FullID); AssetRequest req = RequestedAssets[assetInf.FullID]; req.AssetInf = assetInf; @@ -447,6 +467,7 @@ namespace OpenSim.Framework.Communications.Cache } } + // Notify requesters for this asset if (RequestLists.ContainsKey(asset.FullID)) { lock (RequestLists) @@ -503,6 +524,11 @@ namespace OpenSim.Framework.Communications.Cache } } + /// + /// Calculate the number of packets required to send the asset to the client. + /// + /// + /// private int CalculateNumPackets(byte[] data) { const uint m_maxPacketSize = 600; @@ -519,10 +545,8 @@ namespace OpenSim.Framework.Communications.Cache return numPackets; } - #region Assets - /// - /// + /// Make an asset request the result of which will be packeted up and sent directly back to the client. /// /// /// @@ -577,7 +601,7 @@ namespace OpenSim.Framework.Communications.Cache } /// - /// + /// Process the asset queue which sends packets directly back to the client. /// private void ProcessAssetQueue() { @@ -672,8 +696,6 @@ namespace OpenSim.Framework.Communications.Cache } } - #endregion - public class AssetRequest { public IClientAPI RequestUser; @@ -730,7 +752,6 @@ namespace OpenSim.Framework.Communications.Cache } } - public class AssetRequestsList { public LLUUID AssetID; diff --git a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs index 8e670b5..b6ec898 100644 --- a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs +++ b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs @@ -120,6 +120,10 @@ namespace OpenSim.Framework.Communications.Cache } } + /// + /// The receiver will be called back with asset data once it comes in. + /// + /// public void SetReceiver(IAssetReceiver receiver) { m_receiver = receiver; -- cgit v1.1