aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs68
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs10
2 files changed, 34 insertions, 44 deletions
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
index 08e7cb7..d510d82 100644
--- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
@@ -365,11 +365,36 @@ namespace OpenSim.Region.CoreModules.Asset
365 /// <param name="id"></param> 365 /// <param name="id"></param>
366 /// <returns>An asset retrieved from the file cache. null if there was a problem retrieving an asset.</returns> 366 /// <returns>An asset retrieved from the file cache. null if there was a problem retrieving an asset.</returns>
367 private AssetBase GetFromFileCache(string id) 367 private AssetBase GetFromFileCache(string id)
368 { 368 {
369 AssetBase asset = null;
370
371 string filename = GetFileName(id); 369 string filename = GetFileName(id);
372 while (File.Exists(filename)) 370
371#if WAIT_ON_INPROGRESS_REQUESTS
372 // Check if we're already downloading this asset. If so, try to wait for it to
373 // download.
374 if (m_WaitOnInprogressTimeout > 0)
375 {
376 m_RequestsForInprogress++;
377
378 ManualResetEvent waitEvent;
379 if (m_CurrentlyWriting.TryGetValue(filename, out waitEvent))
380 {
381 waitEvent.WaitOne(m_WaitOnInprogressTimeout);
382 return Get(id);
383 }
384 }
385#else
386 // Track how often we have the problem that an asset is requested while
387 // it is still being downloaded by a previous request.
388 if (m_CurrentlyWriting.Contains(filename))
389 {
390 m_RequestsForInprogress++;
391 return null;
392 }
393#endif
394
395 AssetBase asset = null;
396
397 if (File.Exists(filename))
373 { 398 {
374 FileStream stream = null; 399 FileStream stream = null;
375 try 400 try
@@ -380,8 +405,6 @@ namespace OpenSim.Region.CoreModules.Asset
380 asset = (AssetBase)bformatter.Deserialize(stream); 405 asset = (AssetBase)bformatter.Deserialize(stream);
381 406
382 m_DiskHits++; 407 m_DiskHits++;
383
384 break;
385 } 408 }
386 catch (System.Runtime.Serialization.SerializationException e) 409 catch (System.Runtime.Serialization.SerializationException e)
387 { 410 {
@@ -394,16 +417,6 @@ namespace OpenSim.Region.CoreModules.Asset
394 // {different version of AssetBase} -- we should attempt to 417 // {different version of AssetBase} -- we should attempt to
395 // delete it and re-cache 418 // delete it and re-cache
396 File.Delete(filename); 419 File.Delete(filename);
397
398 break;
399 }
400 catch (IOException e)
401 {
402 // This is a sharing violation: File exists but can't be opened because it's
403 // being written
404 Thread.Sleep(100);
405
406 continue;
407 } 420 }
408 catch (Exception e) 421 catch (Exception e)
409 { 422 {
@@ -411,7 +424,6 @@ namespace OpenSim.Region.CoreModules.Asset
411 "[FLOTSAM ASSET CACHE]: Failed to get file {0} for asset {1}. Exception {2} {3}", 424 "[FLOTSAM ASSET CACHE]: Failed to get file {0} for asset {1}. Exception {2} {3}",
412 filename, id, e.Message, e.StackTrace); 425 filename, id, e.Message, e.StackTrace);
413 426
414 break;
415 } 427 }
416 finally 428 finally
417 { 429 {
@@ -420,28 +432,6 @@ namespace OpenSim.Region.CoreModules.Asset
420 } 432 }
421 } 433 }
422 434
423#if WAIT_ON_INPROGRESS_REQUESTS
424 // Check if we're already downloading this asset. If so, try to wait for it to
425 // download.
426 if (m_WaitOnInprogressTimeout > 0)
427 {
428 m_RequestsForInprogress++;
429
430 ManualResetEvent waitEvent;
431 if (m_CurrentlyWriting.TryGetValue(filename, out waitEvent))
432 {
433 waitEvent.WaitOne(m_WaitOnInprogressTimeout);
434 return Get(id);
435 }
436 }
437#else
438 // Track how often we have the problem that an asset is requested while
439 // it is still being downloaded by a previous request.
440 if (m_CurrentlyWriting.Contains(filename))
441 {
442 m_RequestsForInprogress++;
443 }
444#endif
445 return asset; 435 return asset;
446 } 436 }
447 437
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 8082c1b..b70aeb7 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -1289,16 +1289,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1289 } 1289 }
1290 1290
1291 1291
1292 public delegate void InformClientToInitateTeleportToLocationDelegate(ScenePresence agent, uint regionX, uint regionY, 1292 public delegate void InformClientToInitiateTeleportToLocationDelegate(ScenePresence agent, uint regionX, uint regionY,
1293 Vector3 position, 1293 Vector3 position,
1294 Scene initiatingScene); 1294 Scene initiatingScene);
1295 1295
1296 private void InformClientToInitateTeleportToLocation(ScenePresence agent, uint regionX, uint regionY, Vector3 position, Scene initiatingScene) 1296 private void InformClientToInitiateTeleportToLocation(ScenePresence agent, uint regionX, uint regionY, Vector3 position, Scene initiatingScene)
1297 { 1297 {
1298 1298
1299 // This assumes that we know what our neighbours are. 1299 // This assumes that we know what our neighbours are.
1300 1300
1301 InformClientToInitateTeleportToLocationDelegate d = InformClientToInitiateTeleportToLocationAsync; 1301 InformClientToInitiateTeleportToLocationDelegate d = InformClientToInitiateTeleportToLocationAsync;
1302 d.BeginInvoke(agent, regionX, regionY, position, initiatingScene, 1302 d.BeginInvoke(agent, regionX, regionY, position, initiatingScene,
1303 InformClientToInitiateTeleportToLocationCompleted, 1303 InformClientToInitiateTeleportToLocationCompleted,
1304 d); 1304 d);
@@ -1360,8 +1360,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1360 1360
1361 private void InformClientToInitiateTeleportToLocationCompleted(IAsyncResult iar) 1361 private void InformClientToInitiateTeleportToLocationCompleted(IAsyncResult iar)
1362 { 1362 {
1363 InformClientToInitateTeleportToLocationDelegate icon = 1363 InformClientToInitiateTeleportToLocationDelegate icon =
1364 (InformClientToInitateTeleportToLocationDelegate)iar.AsyncState; 1364 (InformClientToInitiateTeleportToLocationDelegate)iar.AsyncState;
1365 icon.EndInvoke(iar); 1365 icon.EndInvoke(iar);
1366 } 1366 }
1367 1367