diff options
author | Melanie | 2010-12-06 17:40:07 +0100 |
---|---|---|
committer | Melanie | 2010-12-06 17:40:07 +0100 |
commit | b1a5c0398551e4051f84d8bf3acf46b18fbe739d (patch) | |
tree | 35e62fc8376f7162194d616b6c83ffbf95692469 /OpenSim/Framework/AvatarAppearance.cs | |
parent | Add some safeguards: DOn't send someone else's HUDs, don't send deleted prims (diff) | |
download | opensim-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.cs | 94 |
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 | } |