aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/AvatarAppearance.cs
diff options
context:
space:
mode:
authorMelanie2010-12-06 17:40:07 +0100
committerMelanie2010-12-06 17:40:07 +0100
commitb1a5c0398551e4051f84d8bf3acf46b18fbe739d (patch)
tree35e62fc8376f7162194d616b6c83ffbf95692469 /OpenSim/Framework/AvatarAppearance.cs
parentAdd some safeguards: DOn't send someone else's HUDs, don't send deleted prims (diff)
downloadopensim-SC-b1a5c0398551e4051f84d8bf3acf46b18fbe739d.zip
opensim-SC-b1a5c0398551e4051f84d8bf3acf46b18fbe739d.tar.gz
opensim-SC-b1a5c0398551e4051f84d8bf3acf46b18fbe739d.tar.bz2
opensim-SC-b1a5c0398551e4051f84d8bf3acf46b18fbe739d.tar.xz
Lock the attachments dict so it doesn't get out of sync when iterating
Diffstat (limited to 'OpenSim/Framework/AvatarAppearance.cs')
-rw-r--r--OpenSim/Framework/AvatarAppearance.cs94
1 files changed, 59 insertions, 35 deletions
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs
index d0c8b73..be15e1b 100644
--- a/OpenSim/Framework/AvatarAppearance.cs
+++ b/OpenSim/Framework/AvatarAppearance.cs
@@ -414,27 +414,36 @@ namespace OpenSim.Framework
414 /// </summary> 414 /// </summary>
415 public List<AvatarAttachment> GetAttachments() 415 public List<AvatarAttachment> GetAttachments()
416 { 416 {
417 List<AvatarAttachment> alist = new List<AvatarAttachment>(); 417 lock (m_attachments)
418 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments)
419 { 418 {
420 foreach (AvatarAttachment attach in kvp.Value) 419 List<AvatarAttachment> alist = new List<AvatarAttachment>();
421 alist.Add(new AvatarAttachment(attach)); 420 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments)
422 } 421 {
422 foreach (AvatarAttachment attach in kvp.Value)
423 alist.Add(new AvatarAttachment(attach));
424 }
423 425
424 return alist; 426 return alist;
427 }
425 } 428 }
426 429
427 internal void AppendAttachment(AvatarAttachment attach) 430 internal void AppendAttachment(AvatarAttachment attach)
428 { 431 {
429 if (! m_attachments.ContainsKey(attach.AttachPoint)) 432 lock (m_attachments)
430 m_attachments[attach.AttachPoint] = new List<AvatarAttachment>(); 433 {
431 m_attachments[attach.AttachPoint].Add(attach); 434 if (!m_attachments.ContainsKey(attach.AttachPoint))
435 m_attachments[attach.AttachPoint] = new List<AvatarAttachment>();
436 m_attachments[attach.AttachPoint].Add(attach);
437 }
432 } 438 }
433 439
434 internal void ReplaceAttachment(AvatarAttachment attach) 440 internal void ReplaceAttachment(AvatarAttachment attach)
435 { 441 {
436 m_attachments[attach.AttachPoint] = new List<AvatarAttachment>(); 442 lock (m_attachments)
437 m_attachments[attach.AttachPoint].Add(attach); 443 {
444 m_attachments[attach.AttachPoint] = new List<AvatarAttachment>();
445 m_attachments[attach.AttachPoint].Add(attach);
446 }
438 } 447 }
439 448
440 /// <summary> 449 /// <summary>
@@ -450,9 +459,12 @@ namespace OpenSim.Framework
450 459
451 if (item == UUID.Zero) 460 if (item == UUID.Zero)
452 { 461 {
453 if (m_attachments.ContainsKey(attachpoint)) 462 lock (m_attachments)
454 m_attachments.Remove(attachpoint); 463 {
455 return; 464 if (m_attachments.ContainsKey(attachpoint))
465 m_attachments.Remove(attachpoint);
466 return;
467 }
456 } 468 }
457 469
458 // check if this is an append or a replace, 0x80 marks it as an append 470 // check if this is an append or a replace, 0x80 marks it as an append
@@ -470,37 +482,46 @@ namespace OpenSim.Framework
470 482
471 public int GetAttachpoint(UUID itemID) 483 public int GetAttachpoint(UUID itemID)
472 { 484 {
473 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) 485 lock (m_attachments)
474 { 486 {
475 int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; }); 487 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments)
476 if (index >= 0) 488 {
477 return kvp.Key; 489 int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; });
478 } 490 if (index >= 0)
491 return kvp.Key;
492 }
479 493
480 return 0; 494 return 0;
495 }
481 } 496 }
482 497
483 public void DetachAttachment(UUID itemID) 498 public void DetachAttachment(UUID itemID)
484 { 499 {
485 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) 500 lock (m_attachments)
486 { 501 {
487 int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; }); 502 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments)
488 if (index >= 0)
489 { 503 {
490 // Remove it from the list of attachments at that attach point 504 int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; });
491 m_attachments[kvp.Key].RemoveAt(index); 505 if (index >= 0)
506 {
507 // Remove it from the list of attachments at that attach point
508 m_attachments[kvp.Key].RemoveAt(index);
492 509
493 // And remove the list if there are no more attachments here 510 // And remove the list if there are no more attachments here
494 if (m_attachments[kvp.Key].Count == 0) 511 if (m_attachments[kvp.Key].Count == 0)
495 m_attachments.Remove(kvp.Key); 512 m_attachments.Remove(kvp.Key);
496 return; 513 return;
514 }
497 } 515 }
498 } 516 }
499 } 517 }
500 518
501 public void ClearAttachments() 519 public void ClearAttachments()
502 { 520 {
503 m_attachments.Clear(); 521 lock (m_attachments)
522 {
523 m_attachments.Clear();
524 }
504 } 525 }
505 526
506 #region Packing Functions 527 #region Packing Functions
@@ -537,11 +558,14 @@ namespace OpenSim.Framework
537 OSDBinary visualparams = new OSDBinary(m_visualparams); 558 OSDBinary visualparams = new OSDBinary(m_visualparams);
538 data["visualparams"] = visualparams; 559 data["visualparams"] = visualparams;
539 560
540 // Attachments 561 lock (m_attachments)
541 OSDArray attachs = new OSDArray(m_attachments.Count); 562 {
542 foreach (AvatarAttachment attach in GetAttachments()) 563 // Attachments
543 attachs.Add(attach.Pack()); 564 OSDArray attachs = new OSDArray(m_attachments.Count);
544 data["attachments"] = attachs; 565 foreach (AvatarAttachment attach in GetAttachments())
566 attachs.Add(attach.Pack());
567 data["attachments"] = attachs;
568 }
545 569
546 return data; 570 return data;
547 } 571 }