diff --git a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs
index 343667af52..24cb598dba 100644
--- a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs
@@ -138,14 +138,29 @@ namespace OpenSim.Framework.Communications.Cache
/// asset cannot be found.
///
protected abstract AssetBase GetAsset(AssetRequest req);
-
+
+ ///
+ /// Does the asset server have any waiting requests?
+ ///
+ ///
+ /// This does include any request that is currently being handled. This information is not reliable where
+ /// another thread may be processing requests.
+ ///
+ ///
+ /// True if there are waiting requests. False if there are no waiting requests.
+ ///
+ public virtual bool HasWaitingRequests()
+ {
+ return m_assetRequests.Count() != 0;
+ }
+
///
/// Process an asset request. This method will call GetAsset(AssetRequest req)
/// on the subclass.
///
- ///
- protected virtual void ProcessRequest(AssetRequest req)
+ public virtual void ProcessNextRequest()
{
+ AssetRequest req = m_assetRequests.Dequeue();
AssetBase asset;
try
@@ -160,7 +175,7 @@ namespace OpenSim.Framework.Communications.Cache
StatsManager.SimExtraStats.AddAssetServiceRequestFailure();
m_receiver.AssetNotFound(req.AssetID, req.IsTexture);
-
+
return;
}
@@ -190,10 +205,8 @@ namespace OpenSim.Framework.Communications.Cache
while (true) // Since it's a 'blocking queue'
{
try
- {
- AssetRequest req = m_assetRequests.Dequeue();
-
- ProcessRequest(req);
+ {
+ ProcessNextRequest();
}
catch (Exception e)
{
diff --git a/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs b/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs
index 264bfe14bc..5d6bc8daab 100644
--- a/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs
+++ b/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs
@@ -62,15 +62,14 @@ namespace OpenSim.Framework.Communications.Tests
TestAssetDataPlugin assetPlugin = new TestAssetDataPlugin();
assetPlugin.CreateAsset(asset);
- IAssetServer assetServer = new SQLAssetServer(assetPlugin);
+ SQLAssetServer assetServer = new SQLAssetServer(assetPlugin);
IAssetCache assetCache = new AssetCache(assetServer);
- assetServer.Start();
-
- lock (this)
- {
- assetCache.GetAsset(assetId, AssetRequestCallback, false);
- Monitor.Wait(this, 60000);
- }
+
+ assetCache.GetAsset(assetId, AssetRequestCallback, false);
+
+ // Manually pump the asset server
+ while (assetServer.HasWaitingRequests())
+ assetServer.ProcessNextRequest();
Assert.That(
assetId, Is.EqualTo(m_assetIdReceived), "Asset id stored differs from asset id received");