aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/Communications/Cache/AssetCache.cs120
-rw-r--r--OpenSim/Framework/IAssetServer.cs7
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs7
3 files changed, 69 insertions, 65 deletions
diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs
index 0669ce9..e1d5d32 100644
--- a/OpenSim/Framework/Communications/Cache/AssetCache.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs
@@ -371,85 +371,81 @@ namespace OpenSim.Framework.Communications.Cache
371 // See IAssetReceiver 371 // See IAssetReceiver
372 public void AssetReceived(AssetBase asset, bool IsTexture) 372 public void AssetReceived(AssetBase asset, bool IsTexture)
373 { 373 {
374 if (asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server 374 //check if it is a texture or not
375 //then add to the correct cache list
376 //then check for waiting requests for this asset/texture (in the Requested lists)
377 //and move those requests into the Requests list.
378 if (IsTexture)
375 { 379 {
376 //check if it is a texture or not 380 TextureImage image = new TextureImage(asset);
377 //then add to the correct cache list 381 if (!Textures.ContainsKey(image.FullID))
378 //then check for waiting requests for this asset/texture (in the Requested lists)
379 //and move those requests into the Requests list.
380
381 if (IsTexture)
382 { 382 {
383 TextureImage image = new TextureImage(asset); 383 Textures.Add(image.FullID, image);
384 if (!Textures.ContainsKey(image.FullID))
385 {
386 Textures.Add(image.FullID, image);
387 384
388 if (StatsManager.SimExtraStats != null) 385 if (StatsManager.SimExtraStats != null)
389 { 386 {
390 StatsManager.SimExtraStats.AddTexture(image); 387 StatsManager.SimExtraStats.AddTexture(image);
391 }
392 } 388 }
393 } 389 }
394 else 390 }
391 else
392 {
393 AssetInfo assetInf = new AssetInfo(asset);
394 if (!Assets.ContainsKey(assetInf.FullID))
395 { 395 {
396 AssetInfo assetInf = new AssetInfo(asset); 396 Assets.Add(assetInf.FullID, assetInf);
397 if (!Assets.ContainsKey(assetInf.FullID))
398 {
399 Assets.Add(assetInf.FullID, assetInf);
400 397
401 if (StatsManager.SimExtraStats != null) 398 if (StatsManager.SimExtraStats != null)
402 { 399 {
403 StatsManager.SimExtraStats.AddAsset(assetInf); 400 StatsManager.SimExtraStats.AddAsset(assetInf);
404 } 401 }
405 402
406 if (RequestedAssets.ContainsKey(assetInf.FullID)) 403 if (RequestedAssets.ContainsKey(assetInf.FullID))
407 { 404 {
408 AssetRequest req = RequestedAssets[assetInf.FullID]; 405 AssetRequest req = RequestedAssets[assetInf.FullID];
409 req.AssetInf = assetInf; 406 req.AssetInf = assetInf;
410 req.NumPackets = CalculateNumPackets(assetInf.Data); 407 req.NumPackets = CalculateNumPackets(assetInf.Data);
411 408
412 RequestedAssets.Remove(assetInf.FullID); 409 RequestedAssets.Remove(assetInf.FullID);
413 AssetRequests.Add(req); 410 AssetRequests.Add(req);
414 }
415 } 411 }
416 } 412 }
413 }
414
415 // Notify requesters for this asset
416 if (RequestLists.ContainsKey(asset.FullID))
417 {
418 AssetRequestsList reqList = null;
419 lock (RequestLists)
420 {
421 //m_log.Info("AssetCache: Lock taken on requestLists (AssetReceived #1)");
422 reqList = RequestLists[asset.FullID];
417 423
418 // Notify requesters for this asset 424 }
419 if (RequestLists.ContainsKey(asset.FullID)) 425 //m_log.Info("AssetCache: Lock released on requestLists (AssetReceived #1)");
426 if (reqList != null)
420 { 427 {
421 AssetRequestsList reqList = null; 428 //making a copy of the list is not ideal
429 //but the old method of locking around this whole block of code was causing a multi-thread lock
430 //between this and the TextureDownloadModule
431 //while the localAsset thread running this and trying to send a texture to the callback in the
432 //texturedownloadmodule , and hitting a lock in there. While the texturedownload thread (which was holding
433 // the lock in the texturedownload module) was trying to
434 //request a new asset and hitting a lock in here on the RequestLists.
435
436 List<NewAssetRequest> theseRequests = new List<NewAssetRequest>(reqList.Requests);
437 reqList.Requests.Clear();
438
422 lock (RequestLists) 439 lock (RequestLists)
423 { 440 {
424 //m_log.Info("AssetCache: Lock taken on requestLists (AssetReceived #1)"); 441 // m_log.Info("AssetCache: Lock taken on requestLists (AssetReceived #2)");
425 reqList = RequestLists[asset.FullID]; 442 RequestLists.Remove(asset.FullID);
426
427 } 443 }
428 //m_log.Info("AssetCache: Lock released on requestLists (AssetReceived #1)"); 444 //m_log.Info("AssetCache: Lock released on requestLists (AssetReceived #2)");
429 if (reqList != null)
430 {
431 //making a copy of the list is not ideal
432 //but the old method of locking around this whole block of code was causing a multi-thread lock
433 //between this and the TextureDownloadModule
434 //while the localAsset thread running this and trying to send a texture to the callback in the
435 //texturedownloadmodule , and hitting a lock in there. While the texturedownload thread (which was holding
436 // the lock in the texturedownload module) was trying to
437 //request a new asset and hitting a lock in here on the RequestLists.
438
439 List<NewAssetRequest> theseRequests = new List<NewAssetRequest>(reqList.Requests);
440 reqList.Requests.Clear();
441
442 lock (RequestLists)
443 {
444 // m_log.Info("AssetCache: Lock taken on requestLists (AssetReceived #2)");
445 RequestLists.Remove(asset.FullID);
446 }
447 //m_log.Info("AssetCache: Lock released on requestLists (AssetReceived #2)");
448 445
449 foreach (NewAssetRequest req in theseRequests) 446 foreach (NewAssetRequest req in theseRequests)
450 { 447 {
451 req.Callback(asset.FullID, asset); 448 req.Callback(asset.FullID, asset);
452 }
453 } 449 }
454 } 450 }
455 } 451 }
diff --git a/OpenSim/Framework/IAssetServer.cs b/OpenSim/Framework/IAssetServer.cs
index 06a7e32..70feb74 100644
--- a/OpenSim/Framework/IAssetServer.cs
+++ b/OpenSim/Framework/IAssetServer.cs
@@ -41,7 +41,10 @@ namespace OpenSim.Framework
41 void Close(); 41 void Close();
42 } 42 }
43 43
44 // could change to delegate? 44 /// <summary>
45 /// Implemented by classes which with to asynchronously receive asset data from the asset service
46 /// </summary>
47 /// <remarks>could change to delegate?</remarks>
45 public interface IAssetReceiver 48 public interface IAssetReceiver
46 { 49 {
47 /// <summary> 50 /// <summary>
@@ -62,4 +65,4 @@ namespace OpenSim.Framework
62 { 65 {
63 IAssetServer GetAssetServer(); 66 IAssetServer GetAssetServer();
64 } 67 }
65} \ No newline at end of file 68}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 44805cc..bdf1bba 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -1451,9 +1451,14 @@ namespace OpenSim.Region.Environment.Scenes
1451 /// 1451 ///
1452 /// </summary> 1452 /// </summary>
1453 public void SendInitialData() 1453 public void SendInitialData()
1454 { 1454 {
1455 // justincc - very temporary fix for the fact that m_apperance appears to be null at this point in grid mode
1456 if (null == m_appearance)
1457 m_appearance = new AvatarAppearance();
1458
1455 m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_uuid, LocalId, 1459 m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_uuid, LocalId,
1456 m_pos, m_appearance.Texture.ToBytes(), m_parentID); 1460 m_pos, m_appearance.Texture.ToBytes(), m_parentID);
1461
1457 if (!m_isChildAgent) 1462 if (!m_isChildAgent)
1458 { 1463 {
1459 m_scene.InformClientOfNeighbours(this); 1464 m_scene.InformClientOfNeighbours(this);