com.wallstop-studios.dxmessaging 2.0.0-rc07 → 2.0.0-rc09
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Runtime/Core/MessageBus/MessageBus.cs +782 -334
- package/Runtime/Core/MessageHandler.cs +38 -49
- package/Tests/Runtime/Benchmarks/PerformanceTests.cs +139 -25
- package/Tests/Runtime/Core/BroadcastTests.cs +71 -4
- package/Tests/Runtime/Core/TargetedTests.cs +74 -8
- package/Tests/Runtime/Core/UntargetedTests.cs +61 -4
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +2 -1
- package/package.json +2 -2
- package/Tests/Editor.meta +0 -8
|
@@ -81,8 +81,8 @@
|
|
|
81
81
|
private readonly Stack<
|
|
82
82
|
List<KeyValuePair<int, Dictionary<MessageHandler, int>>>
|
|
83
83
|
> _sortedHandlers = new();
|
|
84
|
-
private readonly Stack<List<object
|
|
85
|
-
private readonly Stack<List<
|
|
84
|
+
private readonly Stack<List<List<object>>> _interceptors = new();
|
|
85
|
+
private readonly Stack<List<object>> _innerInterceptorsStack = new();
|
|
86
86
|
|
|
87
87
|
public Action RegisterUntargeted<T>(MessageHandler messageHandler, int priority = 0)
|
|
88
88
|
where T : IUntargetedMessage
|
|
@@ -394,12 +394,12 @@
|
|
|
394
394
|
bool complete = false;
|
|
395
395
|
if (removed)
|
|
396
396
|
{
|
|
397
|
-
if (
|
|
397
|
+
if (
|
|
398
|
+
_interceptsByType.TryGetValue(type, out prioritizedInterceptors)
|
|
399
|
+
&& prioritizedInterceptors.TryGetValue(priority, out interceptors)
|
|
400
|
+
)
|
|
398
401
|
{
|
|
399
|
-
|
|
400
|
-
{
|
|
401
|
-
complete = interceptors.Remove(interceptor);
|
|
402
|
-
}
|
|
402
|
+
complete = interceptors.Remove(interceptor);
|
|
403
403
|
}
|
|
404
404
|
|
|
405
405
|
if (!complete)
|
|
@@ -467,38 +467,29 @@
|
|
|
467
467
|
)
|
|
468
468
|
{
|
|
469
469
|
foundAnyHandlers = true;
|
|
470
|
-
|
|
471
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
472
|
-
try
|
|
470
|
+
if (sortedHandlers.Count == 1)
|
|
473
471
|
{
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
)
|
|
472
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
473
|
+
sortedHandlers.First();
|
|
474
|
+
RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
|
|
475
|
+
}
|
|
476
|
+
else
|
|
477
|
+
{
|
|
478
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
479
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
480
|
+
try
|
|
477
481
|
{
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
);
|
|
482
|
-
try
|
|
483
|
-
{
|
|
484
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
485
|
-
{
|
|
486
|
-
handler.HandleUntargetedPostProcessing(
|
|
487
|
-
ref typedMessage,
|
|
488
|
-
this,
|
|
489
|
-
priority
|
|
490
|
-
);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
finally
|
|
482
|
+
foreach (
|
|
483
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
484
|
+
)
|
|
494
485
|
{
|
|
495
|
-
|
|
486
|
+
RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
|
|
496
487
|
}
|
|
497
488
|
}
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
489
|
+
finally
|
|
490
|
+
{
|
|
491
|
+
_sortedHandlers.Push(handlerList);
|
|
492
|
+
}
|
|
502
493
|
}
|
|
503
494
|
}
|
|
504
495
|
|
|
@@ -512,6 +503,51 @@
|
|
|
512
503
|
}
|
|
513
504
|
}
|
|
514
505
|
|
|
506
|
+
private void RunUntargetedPostProcessing<TMessage>(
|
|
507
|
+
ref TMessage typedMessage,
|
|
508
|
+
int priority,
|
|
509
|
+
Dictionary<MessageHandler, int> handlers
|
|
510
|
+
)
|
|
511
|
+
where TMessage : IUntargetedMessage
|
|
512
|
+
{
|
|
513
|
+
switch (handlers.Count)
|
|
514
|
+
{
|
|
515
|
+
case <= 0:
|
|
516
|
+
{
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
case 1:
|
|
520
|
+
{
|
|
521
|
+
MessageHandler handler = handlers.Keys.First();
|
|
522
|
+
handler.HandleUntargetedPostProcessing(ref typedMessage, this, priority);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
default:
|
|
526
|
+
{
|
|
527
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
528
|
+
handlers.Keys
|
|
529
|
+
);
|
|
530
|
+
try
|
|
531
|
+
{
|
|
532
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
533
|
+
{
|
|
534
|
+
handler.HandleUntargetedPostProcessing(
|
|
535
|
+
ref typedMessage,
|
|
536
|
+
this,
|
|
537
|
+
priority
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
finally
|
|
542
|
+
{
|
|
543
|
+
_messageHandlers.Push(messageHandlers);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
515
551
|
public void UntypedTargetedBroadcast(InstanceId target, ITargetedMessage typedMessage)
|
|
516
552
|
{
|
|
517
553
|
Type messageType = typedMessage.MessageType;
|
|
@@ -572,39 +608,34 @@
|
|
|
572
608
|
)
|
|
573
609
|
{
|
|
574
610
|
foundAnyHandlers = true;
|
|
575
|
-
|
|
576
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
577
|
-
try
|
|
611
|
+
if (sortedHandlers.Count == 1)
|
|
578
612
|
{
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
)
|
|
613
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
614
|
+
sortedHandlers.First();
|
|
615
|
+
RunTargetedBroadcast(ref target, ref typedMessage, entry.Key, entry.Value);
|
|
616
|
+
}
|
|
617
|
+
else
|
|
618
|
+
{
|
|
619
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
620
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
621
|
+
try
|
|
582
622
|
{
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
);
|
|
587
|
-
try
|
|
588
|
-
{
|
|
589
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
590
|
-
{
|
|
591
|
-
handler.HandleTargeted(
|
|
592
|
-
ref target,
|
|
593
|
-
ref typedMessage,
|
|
594
|
-
this,
|
|
595
|
-
priority
|
|
596
|
-
);
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
finally
|
|
623
|
+
foreach (
|
|
624
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
625
|
+
)
|
|
600
626
|
{
|
|
601
|
-
|
|
627
|
+
RunTargetedBroadcast(
|
|
628
|
+
ref target,
|
|
629
|
+
ref typedMessage,
|
|
630
|
+
entry.Key,
|
|
631
|
+
entry.Value
|
|
632
|
+
);
|
|
602
633
|
}
|
|
603
634
|
}
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
635
|
+
finally
|
|
636
|
+
{
|
|
637
|
+
_sortedHandlers.Push(handlerList);
|
|
638
|
+
}
|
|
608
639
|
}
|
|
609
640
|
}
|
|
610
641
|
|
|
@@ -617,39 +648,34 @@
|
|
|
617
648
|
)
|
|
618
649
|
{
|
|
619
650
|
foundAnyHandlers = true;
|
|
620
|
-
|
|
621
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
622
|
-
try
|
|
651
|
+
if (sortedHandlers.Count == 1)
|
|
623
652
|
{
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
)
|
|
653
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
654
|
+
sortedHandlers.First();
|
|
655
|
+
RunTargetedPostProcessing(ref target, ref typedMessage, entry.Key, entry.Value);
|
|
656
|
+
}
|
|
657
|
+
else
|
|
658
|
+
{
|
|
659
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
660
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
661
|
+
try
|
|
627
662
|
{
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
);
|
|
632
|
-
try
|
|
633
|
-
{
|
|
634
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
635
|
-
{
|
|
636
|
-
handler.HandleTargetedPostProcessing(
|
|
637
|
-
ref target,
|
|
638
|
-
ref typedMessage,
|
|
639
|
-
this,
|
|
640
|
-
priority
|
|
641
|
-
);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
finally
|
|
663
|
+
foreach (
|
|
664
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
665
|
+
)
|
|
645
666
|
{
|
|
646
|
-
|
|
667
|
+
RunTargetedPostProcessing(
|
|
668
|
+
ref target,
|
|
669
|
+
ref typedMessage,
|
|
670
|
+
entry.Key,
|
|
671
|
+
entry.Value
|
|
672
|
+
);
|
|
647
673
|
}
|
|
648
674
|
}
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
675
|
+
finally
|
|
676
|
+
{
|
|
677
|
+
_sortedHandlers.Push(handlerList);
|
|
678
|
+
}
|
|
653
679
|
}
|
|
654
680
|
}
|
|
655
681
|
|
|
@@ -658,39 +684,39 @@
|
|
|
658
684
|
&& 0 < sortedHandlers.Count
|
|
659
685
|
)
|
|
660
686
|
{
|
|
661
|
-
|
|
662
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
663
|
-
try
|
|
687
|
+
if (sortedHandlers.Count == 1)
|
|
664
688
|
{
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
689
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
690
|
+
sortedHandlers.First();
|
|
691
|
+
RunTargetedWithoutTargetingPostProcessing(
|
|
692
|
+
ref target,
|
|
693
|
+
ref typedMessage,
|
|
694
|
+
entry.Key,
|
|
695
|
+
entry.Value
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
else
|
|
699
|
+
{
|
|
700
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
701
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
702
|
+
try
|
|
668
703
|
{
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
);
|
|
673
|
-
try
|
|
674
|
-
{
|
|
675
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
676
|
-
{
|
|
677
|
-
handler.HandleTargetedWithoutTargetingPostProcessing(
|
|
678
|
-
ref target,
|
|
679
|
-
ref typedMessage,
|
|
680
|
-
this,
|
|
681
|
-
priority
|
|
682
|
-
);
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
finally
|
|
704
|
+
foreach (
|
|
705
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
706
|
+
)
|
|
686
707
|
{
|
|
687
|
-
|
|
708
|
+
RunTargetedWithoutTargetingPostProcessing(
|
|
709
|
+
ref target,
|
|
710
|
+
ref typedMessage,
|
|
711
|
+
entry.Key,
|
|
712
|
+
entry.Value
|
|
713
|
+
);
|
|
688
714
|
}
|
|
689
715
|
}
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
716
|
+
finally
|
|
717
|
+
{
|
|
718
|
+
_sortedHandlers.Push(handlerList);
|
|
719
|
+
}
|
|
694
720
|
}
|
|
695
721
|
}
|
|
696
722
|
|
|
@@ -705,6 +731,152 @@
|
|
|
705
731
|
}
|
|
706
732
|
}
|
|
707
733
|
|
|
734
|
+
private void RunTargetedWithoutTargetingPostProcessing<TMessage>(
|
|
735
|
+
ref InstanceId target,
|
|
736
|
+
ref TMessage typedMessage,
|
|
737
|
+
int priority,
|
|
738
|
+
Dictionary<MessageHandler, int> handlers
|
|
739
|
+
)
|
|
740
|
+
where TMessage : ITargetedMessage
|
|
741
|
+
{
|
|
742
|
+
switch (handlers.Count)
|
|
743
|
+
{
|
|
744
|
+
case <= 0:
|
|
745
|
+
{
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
case 1:
|
|
749
|
+
{
|
|
750
|
+
MessageHandler handler = handlers.Keys.First();
|
|
751
|
+
handler.HandleTargetedWithoutTargetingPostProcessing(
|
|
752
|
+
ref target,
|
|
753
|
+
ref typedMessage,
|
|
754
|
+
this,
|
|
755
|
+
priority
|
|
756
|
+
);
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
default:
|
|
760
|
+
{
|
|
761
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
762
|
+
handlers.Keys
|
|
763
|
+
);
|
|
764
|
+
try
|
|
765
|
+
{
|
|
766
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
767
|
+
{
|
|
768
|
+
handler.HandleTargetedWithoutTargetingPostProcessing(
|
|
769
|
+
ref target,
|
|
770
|
+
ref typedMessage,
|
|
771
|
+
this,
|
|
772
|
+
priority
|
|
773
|
+
);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
finally
|
|
777
|
+
{
|
|
778
|
+
_messageHandlers.Push(messageHandlers);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
break;
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
private void RunTargetedPostProcessing<TMessage>(
|
|
787
|
+
ref InstanceId target,
|
|
788
|
+
ref TMessage typedMessage,
|
|
789
|
+
int priority,
|
|
790
|
+
Dictionary<MessageHandler, int> handlers
|
|
791
|
+
)
|
|
792
|
+
where TMessage : ITargetedMessage
|
|
793
|
+
{
|
|
794
|
+
switch (handlers.Count)
|
|
795
|
+
{
|
|
796
|
+
case <= 0:
|
|
797
|
+
{
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
case 1:
|
|
801
|
+
{
|
|
802
|
+
MessageHandler handler = handlers.Keys.First();
|
|
803
|
+
handler.HandleTargetedPostProcessing(
|
|
804
|
+
ref target,
|
|
805
|
+
ref typedMessage,
|
|
806
|
+
this,
|
|
807
|
+
priority
|
|
808
|
+
);
|
|
809
|
+
return;
|
|
810
|
+
}
|
|
811
|
+
default:
|
|
812
|
+
{
|
|
813
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
814
|
+
handlers.Keys
|
|
815
|
+
);
|
|
816
|
+
try
|
|
817
|
+
{
|
|
818
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
819
|
+
{
|
|
820
|
+
handler.HandleTargetedPostProcessing(
|
|
821
|
+
ref target,
|
|
822
|
+
ref typedMessage,
|
|
823
|
+
this,
|
|
824
|
+
priority
|
|
825
|
+
);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
finally
|
|
829
|
+
{
|
|
830
|
+
_messageHandlers.Push(messageHandlers);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
break;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
private void RunTargetedBroadcast<TMessage>(
|
|
839
|
+
ref InstanceId target,
|
|
840
|
+
ref TMessage typedMessage,
|
|
841
|
+
int priority,
|
|
842
|
+
Dictionary<MessageHandler, int> handlers
|
|
843
|
+
)
|
|
844
|
+
where TMessage : ITargetedMessage
|
|
845
|
+
{
|
|
846
|
+
switch (handlers.Count)
|
|
847
|
+
{
|
|
848
|
+
case <= 0:
|
|
849
|
+
{
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
case 1:
|
|
853
|
+
{
|
|
854
|
+
MessageHandler handler = handlers.Keys.First();
|
|
855
|
+
handler.HandleTargeted(ref target, ref typedMessage, this, priority);
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
858
|
+
default:
|
|
859
|
+
{
|
|
860
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
861
|
+
handlers.Keys
|
|
862
|
+
);
|
|
863
|
+
try
|
|
864
|
+
{
|
|
865
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
866
|
+
{
|
|
867
|
+
handler.HandleTargeted(ref target, ref typedMessage, this, priority);
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
finally
|
|
871
|
+
{
|
|
872
|
+
_messageHandlers.Push(messageHandlers);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
break;
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
708
880
|
public void UntypedSourcedBroadcast(InstanceId source, IBroadcastMessage typedMessage)
|
|
709
881
|
{
|
|
710
882
|
Type messageType = typedMessage.MessageType;
|
|
@@ -768,39 +940,29 @@
|
|
|
768
940
|
)
|
|
769
941
|
{
|
|
770
942
|
foundAnyHandlers = true;
|
|
771
|
-
|
|
772
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
773
|
-
try
|
|
943
|
+
if (sortedHandlers.Count == 1)
|
|
774
944
|
{
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
)
|
|
945
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
946
|
+
sortedHandlers.First();
|
|
947
|
+
RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
|
|
948
|
+
}
|
|
949
|
+
else
|
|
950
|
+
{
|
|
951
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
952
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
953
|
+
try
|
|
778
954
|
{
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
);
|
|
783
|
-
try
|
|
784
|
-
{
|
|
785
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
786
|
-
{
|
|
787
|
-
handler.HandleSourcedBroadcast(
|
|
788
|
-
ref source,
|
|
789
|
-
ref typedMessage,
|
|
790
|
-
this,
|
|
791
|
-
priority
|
|
792
|
-
);
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
finally
|
|
955
|
+
foreach (
|
|
956
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
957
|
+
)
|
|
796
958
|
{
|
|
797
|
-
|
|
959
|
+
RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
|
|
798
960
|
}
|
|
799
961
|
}
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
962
|
+
finally
|
|
963
|
+
{
|
|
964
|
+
_sortedHandlers.Push(handlerList);
|
|
965
|
+
}
|
|
804
966
|
}
|
|
805
967
|
}
|
|
806
968
|
|
|
@@ -813,39 +975,39 @@
|
|
|
813
975
|
)
|
|
814
976
|
{
|
|
815
977
|
foundAnyHandlers = true;
|
|
816
|
-
|
|
817
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
818
|
-
try
|
|
978
|
+
if (sortedHandlers.Count == 1)
|
|
819
979
|
{
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
980
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
981
|
+
sortedHandlers.First();
|
|
982
|
+
RunBroadcastPostProcessing(
|
|
983
|
+
ref source,
|
|
984
|
+
ref typedMessage,
|
|
985
|
+
entry.Key,
|
|
986
|
+
entry.Value
|
|
987
|
+
);
|
|
988
|
+
}
|
|
989
|
+
else
|
|
990
|
+
{
|
|
991
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
992
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
993
|
+
try
|
|
823
994
|
{
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
);
|
|
828
|
-
try
|
|
829
|
-
{
|
|
830
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
831
|
-
{
|
|
832
|
-
handler.HandleSourcedBroadcastPostProcessing(
|
|
833
|
-
ref source,
|
|
834
|
-
ref typedMessage,
|
|
835
|
-
this,
|
|
836
|
-
priority
|
|
837
|
-
);
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
finally
|
|
995
|
+
foreach (
|
|
996
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
997
|
+
)
|
|
841
998
|
{
|
|
842
|
-
|
|
999
|
+
RunBroadcastPostProcessing(
|
|
1000
|
+
ref source,
|
|
1001
|
+
ref typedMessage,
|
|
1002
|
+
entry.Key,
|
|
1003
|
+
entry.Value
|
|
1004
|
+
);
|
|
843
1005
|
}
|
|
844
1006
|
}
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
1007
|
+
finally
|
|
1008
|
+
{
|
|
1009
|
+
_sortedHandlers.Push(handlerList);
|
|
1010
|
+
}
|
|
849
1011
|
}
|
|
850
1012
|
}
|
|
851
1013
|
|
|
@@ -854,39 +1016,39 @@
|
|
|
854
1016
|
&& 0 < sortedHandlers.Count
|
|
855
1017
|
)
|
|
856
1018
|
{
|
|
857
|
-
|
|
858
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
859
|
-
try
|
|
1019
|
+
if (sortedHandlers.Count == 1)
|
|
860
1020
|
{
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
1021
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
1022
|
+
sortedHandlers.First();
|
|
1023
|
+
RunBroadcastWithoutSourcePostProcessing(
|
|
1024
|
+
ref source,
|
|
1025
|
+
ref typedMessage,
|
|
1026
|
+
entry.Key,
|
|
1027
|
+
entry.Value
|
|
1028
|
+
);
|
|
1029
|
+
}
|
|
1030
|
+
else
|
|
1031
|
+
{
|
|
1032
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1033
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1034
|
+
try
|
|
864
1035
|
{
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
);
|
|
869
|
-
try
|
|
870
|
-
{
|
|
871
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
872
|
-
{
|
|
873
|
-
handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
|
|
874
|
-
ref source,
|
|
875
|
-
ref typedMessage,
|
|
876
|
-
this,
|
|
877
|
-
priority
|
|
878
|
-
);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
finally
|
|
1036
|
+
foreach (
|
|
1037
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
1038
|
+
)
|
|
882
1039
|
{
|
|
883
|
-
|
|
1040
|
+
RunBroadcastWithoutSourcePostProcessing(
|
|
1041
|
+
ref source,
|
|
1042
|
+
ref typedMessage,
|
|
1043
|
+
entry.Key,
|
|
1044
|
+
entry.Value
|
|
1045
|
+
);
|
|
884
1046
|
}
|
|
885
1047
|
}
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
1048
|
+
finally
|
|
1049
|
+
{
|
|
1050
|
+
_sortedHandlers.Push(handlerList);
|
|
1051
|
+
}
|
|
890
1052
|
}
|
|
891
1053
|
}
|
|
892
1054
|
|
|
@@ -901,94 +1063,304 @@
|
|
|
901
1063
|
}
|
|
902
1064
|
}
|
|
903
1065
|
|
|
904
|
-
private void
|
|
1066
|
+
private void RunBroadcastWithoutSourcePostProcessing<TMessage>(
|
|
1067
|
+
ref InstanceId source,
|
|
1068
|
+
ref TMessage typedMessage,
|
|
1069
|
+
int priority,
|
|
1070
|
+
Dictionary<MessageHandler, int> handlers
|
|
1071
|
+
)
|
|
1072
|
+
where TMessage : IBroadcastMessage
|
|
905
1073
|
{
|
|
906
|
-
|
|
907
|
-
{
|
|
908
|
-
return;
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
|
|
912
|
-
try
|
|
1074
|
+
switch (handlers.Count)
|
|
913
1075
|
{
|
|
914
|
-
|
|
1076
|
+
case <= 0:
|
|
915
1077
|
{
|
|
916
|
-
|
|
1078
|
+
return;
|
|
917
1079
|
}
|
|
918
|
-
|
|
919
|
-
finally
|
|
920
|
-
{
|
|
921
|
-
_messageHandlers.Push(messageHandlers);
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
|
|
925
|
-
private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
|
|
926
|
-
{
|
|
927
|
-
if (_globalSinks.Count <= 0)
|
|
928
|
-
{
|
|
929
|
-
return;
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
|
|
933
|
-
try
|
|
934
|
-
{
|
|
935
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
1080
|
+
case 1:
|
|
936
1081
|
{
|
|
937
|
-
handler.
|
|
1082
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1083
|
+
handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
|
|
1084
|
+
ref source,
|
|
1085
|
+
ref typedMessage,
|
|
1086
|
+
this,
|
|
1087
|
+
priority
|
|
1088
|
+
);
|
|
1089
|
+
return;
|
|
1090
|
+
}
|
|
1091
|
+
default:
|
|
1092
|
+
{
|
|
1093
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1094
|
+
handlers.Keys
|
|
1095
|
+
);
|
|
1096
|
+
try
|
|
1097
|
+
{
|
|
1098
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1099
|
+
{
|
|
1100
|
+
handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
|
|
1101
|
+
ref source,
|
|
1102
|
+
ref typedMessage,
|
|
1103
|
+
this,
|
|
1104
|
+
priority
|
|
1105
|
+
);
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
finally
|
|
1109
|
+
{
|
|
1110
|
+
_messageHandlers.Push(messageHandlers);
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
break;
|
|
938
1114
|
}
|
|
939
1115
|
}
|
|
940
|
-
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
private void RunBroadcastPostProcessing<TMessage>(
|
|
1119
|
+
ref InstanceId source,
|
|
1120
|
+
ref TMessage typedMessage,
|
|
1121
|
+
int priority,
|
|
1122
|
+
Dictionary<MessageHandler, int> handlers
|
|
1123
|
+
)
|
|
1124
|
+
where TMessage : IBroadcastMessage
|
|
1125
|
+
{
|
|
1126
|
+
switch (handlers.Count)
|
|
941
1127
|
{
|
|
942
|
-
|
|
1128
|
+
case <= 0:
|
|
1129
|
+
{
|
|
1130
|
+
return;
|
|
1131
|
+
}
|
|
1132
|
+
case 1:
|
|
1133
|
+
{
|
|
1134
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1135
|
+
handler.HandleSourcedBroadcastPostProcessing(
|
|
1136
|
+
ref source,
|
|
1137
|
+
ref typedMessage,
|
|
1138
|
+
this,
|
|
1139
|
+
priority
|
|
1140
|
+
);
|
|
1141
|
+
return;
|
|
1142
|
+
}
|
|
1143
|
+
default:
|
|
1144
|
+
{
|
|
1145
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1146
|
+
handlers.Keys
|
|
1147
|
+
);
|
|
1148
|
+
try
|
|
1149
|
+
{
|
|
1150
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1151
|
+
{
|
|
1152
|
+
handler.HandleSourcedBroadcastPostProcessing(
|
|
1153
|
+
ref source,
|
|
1154
|
+
ref typedMessage,
|
|
1155
|
+
this,
|
|
1156
|
+
priority
|
|
1157
|
+
);
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
finally
|
|
1161
|
+
{
|
|
1162
|
+
_messageHandlers.Push(messageHandlers);
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
break;
|
|
1166
|
+
}
|
|
943
1167
|
}
|
|
944
1168
|
}
|
|
945
1169
|
|
|
946
|
-
private void
|
|
1170
|
+
private void RunBroadcast<TMessage>(
|
|
947
1171
|
ref InstanceId source,
|
|
948
|
-
ref
|
|
1172
|
+
ref TMessage typedMessage,
|
|
1173
|
+
int priority,
|
|
1174
|
+
Dictionary<MessageHandler, int> handlers
|
|
949
1175
|
)
|
|
1176
|
+
where TMessage : IBroadcastMessage
|
|
950
1177
|
{
|
|
951
|
-
|
|
1178
|
+
switch (handlers.Count)
|
|
952
1179
|
{
|
|
953
|
-
|
|
1180
|
+
case <= 0:
|
|
1181
|
+
{
|
|
1182
|
+
return;
|
|
1183
|
+
}
|
|
1184
|
+
case 1:
|
|
1185
|
+
{
|
|
1186
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1187
|
+
handler.HandleSourcedBroadcast(ref source, ref typedMessage, this, priority);
|
|
1188
|
+
return;
|
|
1189
|
+
}
|
|
1190
|
+
default:
|
|
1191
|
+
{
|
|
1192
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1193
|
+
handlers.Keys
|
|
1194
|
+
);
|
|
1195
|
+
try
|
|
1196
|
+
{
|
|
1197
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1198
|
+
{
|
|
1199
|
+
handler.HandleSourcedBroadcast(
|
|
1200
|
+
ref source,
|
|
1201
|
+
ref typedMessage,
|
|
1202
|
+
this,
|
|
1203
|
+
priority
|
|
1204
|
+
);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
finally
|
|
1208
|
+
{
|
|
1209
|
+
_messageHandlers.Push(messageHandlers);
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
break;
|
|
1213
|
+
}
|
|
954
1214
|
}
|
|
1215
|
+
}
|
|
955
1216
|
|
|
956
|
-
|
|
957
|
-
|
|
1217
|
+
private void BroadcastGlobalUntargeted(ref IUntargetedMessage message)
|
|
1218
|
+
{
|
|
1219
|
+
switch (_globalSinks.Count)
|
|
958
1220
|
{
|
|
959
|
-
|
|
1221
|
+
case <= 0:
|
|
960
1222
|
{
|
|
961
|
-
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
case 1:
|
|
1226
|
+
{
|
|
1227
|
+
MessageHandler handler = _globalSinks.Keys.First();
|
|
1228
|
+
handler.HandleGlobalUntargetedMessage(ref message, this);
|
|
1229
|
+
return;
|
|
1230
|
+
}
|
|
1231
|
+
default:
|
|
1232
|
+
{
|
|
1233
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1234
|
+
_globalSinks.Keys
|
|
1235
|
+
);
|
|
1236
|
+
try
|
|
1237
|
+
{
|
|
1238
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1239
|
+
{
|
|
1240
|
+
handler.HandleGlobalUntargetedMessage(ref message, this);
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
finally
|
|
1244
|
+
{
|
|
1245
|
+
_messageHandlers.Push(messageHandlers);
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
break;
|
|
962
1249
|
}
|
|
963
1250
|
}
|
|
964
|
-
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
|
|
1254
|
+
{
|
|
1255
|
+
switch (_globalSinks.Count)
|
|
965
1256
|
{
|
|
966
|
-
|
|
1257
|
+
case <= 0:
|
|
1258
|
+
{
|
|
1259
|
+
return;
|
|
1260
|
+
}
|
|
1261
|
+
case 1:
|
|
1262
|
+
{
|
|
1263
|
+
MessageHandler handler = _globalSinks.Keys.First();
|
|
1264
|
+
handler.HandleGlobalTargetedMessage(ref target, ref message, this);
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
default:
|
|
1268
|
+
{
|
|
1269
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1270
|
+
_globalSinks.Keys
|
|
1271
|
+
);
|
|
1272
|
+
try
|
|
1273
|
+
{
|
|
1274
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1275
|
+
{
|
|
1276
|
+
handler.HandleGlobalTargetedMessage(ref target, ref message, this);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
finally
|
|
1280
|
+
{
|
|
1281
|
+
_messageHandlers.Push(messageHandlers);
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
break;
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
private void BroadcastGlobalSourcedBroadcast(
|
|
1290
|
+
ref InstanceId source,
|
|
1291
|
+
ref IBroadcastMessage message
|
|
1292
|
+
)
|
|
1293
|
+
{
|
|
1294
|
+
switch (_globalSinks.Count)
|
|
1295
|
+
{
|
|
1296
|
+
case <= 0:
|
|
1297
|
+
{
|
|
1298
|
+
return;
|
|
1299
|
+
}
|
|
1300
|
+
case 1:
|
|
1301
|
+
{
|
|
1302
|
+
MessageHandler handler = _globalSinks.Keys.First();
|
|
1303
|
+
handler.HandleGlobalSourcedBroadcastMessage(ref source, ref message, this);
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
default:
|
|
1307
|
+
{
|
|
1308
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1309
|
+
_globalSinks.Keys
|
|
1310
|
+
);
|
|
1311
|
+
try
|
|
1312
|
+
{
|
|
1313
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1314
|
+
{
|
|
1315
|
+
handler.HandleGlobalSourcedBroadcastMessage(
|
|
1316
|
+
ref source,
|
|
1317
|
+
ref message,
|
|
1318
|
+
this
|
|
1319
|
+
);
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
finally
|
|
1323
|
+
{
|
|
1324
|
+
_messageHandlers.Push(messageHandlers);
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
break;
|
|
1328
|
+
}
|
|
967
1329
|
}
|
|
968
1330
|
}
|
|
969
1331
|
|
|
970
1332
|
private bool TryGetInterceptorCaches(
|
|
971
1333
|
Type type,
|
|
972
|
-
out
|
|
973
|
-
out List<
|
|
974
|
-
out List<object> interceptorStack
|
|
1334
|
+
out List<List<object>> interceptorStack,
|
|
1335
|
+
out List<object> interceptorObjects
|
|
975
1336
|
)
|
|
976
1337
|
{
|
|
977
|
-
if (
|
|
1338
|
+
if (
|
|
1339
|
+
!_interceptsByType.TryGetValue(
|
|
1340
|
+
type,
|
|
1341
|
+
out SortedDictionary<int, List<object>> interceptors
|
|
1342
|
+
)
|
|
1343
|
+
|| interceptors.Count <= 0
|
|
1344
|
+
)
|
|
978
1345
|
{
|
|
979
|
-
interceptorKeys = default;
|
|
980
1346
|
interceptorStack = default;
|
|
1347
|
+
interceptorObjects = default;
|
|
981
1348
|
return false;
|
|
982
1349
|
}
|
|
983
1350
|
|
|
984
1351
|
if (!_interceptors.TryPop(out interceptorStack))
|
|
985
1352
|
{
|
|
986
|
-
interceptorStack = new List<object
|
|
1353
|
+
interceptorStack = new List<List<object>>(interceptors.Values);
|
|
1354
|
+
}
|
|
1355
|
+
else
|
|
1356
|
+
{
|
|
1357
|
+
interceptorStack.Clear();
|
|
1358
|
+
interceptorStack.AddRange(interceptors.Values);
|
|
987
1359
|
}
|
|
988
1360
|
|
|
989
|
-
if (!
|
|
1361
|
+
if (!_innerInterceptorsStack.TryPop(out interceptorObjects))
|
|
990
1362
|
{
|
|
991
|
-
|
|
1363
|
+
interceptorObjects = new List<object>();
|
|
992
1364
|
}
|
|
993
1365
|
|
|
994
1366
|
return true;
|
|
@@ -1000,9 +1372,8 @@
|
|
|
1000
1372
|
if (
|
|
1001
1373
|
!TryGetInterceptorCaches(
|
|
1002
1374
|
type,
|
|
1003
|
-
out
|
|
1004
|
-
out List<
|
|
1005
|
-
out List<object> interceptorStack
|
|
1375
|
+
out List<List<object>> interceptorStack,
|
|
1376
|
+
out List<object> interceptorObjects
|
|
1006
1377
|
)
|
|
1007
1378
|
)
|
|
1008
1379
|
{
|
|
@@ -1011,22 +1382,12 @@
|
|
|
1011
1382
|
|
|
1012
1383
|
try
|
|
1013
1384
|
{
|
|
1014
|
-
|
|
1015
|
-
interceptorKeys.AddRange(interceptors.Keys);
|
|
1016
|
-
foreach (int priority in interceptorKeys)
|
|
1385
|
+
foreach (List<object> stack in interceptorStack)
|
|
1017
1386
|
{
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|| untypedInterceptors.Count <= 0
|
|
1021
|
-
)
|
|
1022
|
-
{
|
|
1023
|
-
continue;
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1026
|
-
interceptorStack.Clear();
|
|
1027
|
-
interceptorStack.AddRange(untypedInterceptors);
|
|
1387
|
+
interceptorObjects.Clear();
|
|
1388
|
+
interceptorObjects.AddRange(stack);
|
|
1028
1389
|
|
|
1029
|
-
foreach (object transformer in
|
|
1390
|
+
foreach (object transformer in interceptorObjects)
|
|
1030
1391
|
{
|
|
1031
1392
|
if (transformer is not UntargetedInterceptor<T> typedTransformer)
|
|
1032
1393
|
{
|
|
@@ -1043,7 +1404,7 @@
|
|
|
1043
1404
|
finally
|
|
1044
1405
|
{
|
|
1045
1406
|
_interceptors.Push(interceptorStack);
|
|
1046
|
-
|
|
1407
|
+
_innerInterceptorsStack.Push(interceptorObjects);
|
|
1047
1408
|
}
|
|
1048
1409
|
|
|
1049
1410
|
return true;
|
|
@@ -1055,9 +1416,8 @@
|
|
|
1055
1416
|
if (
|
|
1056
1417
|
!TryGetInterceptorCaches(
|
|
1057
1418
|
type,
|
|
1058
|
-
out
|
|
1059
|
-
out List<
|
|
1060
|
-
out List<object> interceptorStack
|
|
1419
|
+
out List<List<object>> interceptorStack,
|
|
1420
|
+
out List<object> interceptorObjects
|
|
1061
1421
|
)
|
|
1062
1422
|
)
|
|
1063
1423
|
{
|
|
@@ -1066,22 +1426,12 @@
|
|
|
1066
1426
|
|
|
1067
1427
|
try
|
|
1068
1428
|
{
|
|
1069
|
-
|
|
1070
|
-
interceptorKeys.AddRange(interceptors.Keys);
|
|
1071
|
-
foreach (int priority in interceptorKeys)
|
|
1429
|
+
foreach (List<object> stack in interceptorStack)
|
|
1072
1430
|
{
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|| untypedInterceptors.Count <= 0
|
|
1076
|
-
)
|
|
1077
|
-
{
|
|
1078
|
-
continue;
|
|
1079
|
-
}
|
|
1431
|
+
interceptorObjects.Clear();
|
|
1432
|
+
interceptorObjects.AddRange(stack);
|
|
1080
1433
|
|
|
1081
|
-
|
|
1082
|
-
interceptorStack.AddRange(untypedInterceptors);
|
|
1083
|
-
|
|
1084
|
-
foreach (object transformer in interceptorStack)
|
|
1434
|
+
foreach (object transformer in interceptorObjects)
|
|
1085
1435
|
{
|
|
1086
1436
|
if (transformer is not TargetedInterceptor<T> typedTransformer)
|
|
1087
1437
|
{
|
|
@@ -1098,7 +1448,7 @@
|
|
|
1098
1448
|
finally
|
|
1099
1449
|
{
|
|
1100
1450
|
_interceptors.Push(interceptorStack);
|
|
1101
|
-
|
|
1451
|
+
_innerInterceptorsStack.Push(interceptorObjects);
|
|
1102
1452
|
}
|
|
1103
1453
|
|
|
1104
1454
|
return true;
|
|
@@ -1110,9 +1460,8 @@
|
|
|
1110
1460
|
if (
|
|
1111
1461
|
!TryGetInterceptorCaches(
|
|
1112
1462
|
type,
|
|
1113
|
-
out
|
|
1114
|
-
out List<
|
|
1115
|
-
out List<object> interceptorStack
|
|
1463
|
+
out List<List<object>> interceptorStack,
|
|
1464
|
+
out List<object> interceptorObjects
|
|
1116
1465
|
)
|
|
1117
1466
|
)
|
|
1118
1467
|
{
|
|
@@ -1121,22 +1470,12 @@
|
|
|
1121
1470
|
|
|
1122
1471
|
try
|
|
1123
1472
|
{
|
|
1124
|
-
|
|
1125
|
-
interceptorKeys.AddRange(interceptors.Keys);
|
|
1126
|
-
foreach (int priority in interceptorKeys)
|
|
1473
|
+
foreach (List<object> stack in interceptorStack)
|
|
1127
1474
|
{
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|| untypedInterceptors.Count <= 0
|
|
1131
|
-
)
|
|
1132
|
-
{
|
|
1133
|
-
continue;
|
|
1134
|
-
}
|
|
1475
|
+
interceptorObjects.Clear();
|
|
1476
|
+
interceptorObjects.AddRange(stack);
|
|
1135
1477
|
|
|
1136
|
-
|
|
1137
|
-
interceptorStack.AddRange(untypedInterceptors);
|
|
1138
|
-
|
|
1139
|
-
foreach (object transformer in interceptorStack)
|
|
1478
|
+
foreach (object transformer in interceptorObjects)
|
|
1140
1479
|
{
|
|
1141
1480
|
if (transformer is not BroadcastInterceptor<T> typedTransformer)
|
|
1142
1481
|
{
|
|
@@ -1153,7 +1492,7 @@
|
|
|
1153
1492
|
finally
|
|
1154
1493
|
{
|
|
1155
1494
|
_interceptors.Push(interceptorStack);
|
|
1156
|
-
|
|
1495
|
+
_innerInterceptorsStack.Push(interceptorObjects);
|
|
1157
1496
|
}
|
|
1158
1497
|
|
|
1159
1498
|
return true;
|
|
@@ -1173,15 +1512,53 @@
|
|
|
1173
1512
|
return false;
|
|
1174
1513
|
}
|
|
1175
1514
|
|
|
1515
|
+
if (sortedHandlers.Count == 1)
|
|
1516
|
+
{
|
|
1517
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
|
|
1518
|
+
RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
|
|
1519
|
+
return true;
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1176
1522
|
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1177
1523
|
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1178
1524
|
try
|
|
1179
1525
|
{
|
|
1180
|
-
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>>
|
|
1526
|
+
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
|
|
1527
|
+
{
|
|
1528
|
+
RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
finally
|
|
1532
|
+
{
|
|
1533
|
+
_sortedHandlers.Push(handlerList);
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
return true;
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
private void RunUntargetedBroadcast<TMessage>(
|
|
1540
|
+
ref TMessage message,
|
|
1541
|
+
int priority,
|
|
1542
|
+
Dictionary<MessageHandler, int> handlers
|
|
1543
|
+
)
|
|
1544
|
+
where TMessage : IMessage
|
|
1545
|
+
{
|
|
1546
|
+
switch (handlers.Count)
|
|
1547
|
+
{
|
|
1548
|
+
case <= 0:
|
|
1549
|
+
{
|
|
1550
|
+
return;
|
|
1551
|
+
}
|
|
1552
|
+
case 1:
|
|
1553
|
+
{
|
|
1554
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1555
|
+
handler.HandleUntargetedMessage(ref message, this, priority);
|
|
1556
|
+
return;
|
|
1557
|
+
}
|
|
1558
|
+
default:
|
|
1181
1559
|
{
|
|
1182
|
-
int priority = handlers.Key;
|
|
1183
1560
|
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1184
|
-
handlers.
|
|
1561
|
+
handlers.Keys
|
|
1185
1562
|
);
|
|
1186
1563
|
try
|
|
1187
1564
|
{
|
|
@@ -1194,14 +1571,10 @@
|
|
|
1194
1571
|
{
|
|
1195
1572
|
_messageHandlers.Push(messageHandlers);
|
|
1196
1573
|
}
|
|
1574
|
+
|
|
1575
|
+
break;
|
|
1197
1576
|
}
|
|
1198
1577
|
}
|
|
1199
|
-
finally
|
|
1200
|
-
{
|
|
1201
|
-
_sortedHandlers.Push(handlerList);
|
|
1202
|
-
}
|
|
1203
|
-
|
|
1204
|
-
return true;
|
|
1205
1578
|
}
|
|
1206
1579
|
|
|
1207
1580
|
private bool InternalTargetedWithoutTargetingBroadcast<TMessage>(
|
|
@@ -1222,15 +1595,54 @@
|
|
|
1222
1595
|
return false;
|
|
1223
1596
|
}
|
|
1224
1597
|
|
|
1598
|
+
if (sortedHandlers.Count == 1)
|
|
1599
|
+
{
|
|
1600
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
|
|
1601
|
+
RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
|
|
1602
|
+
return true;
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1225
1605
|
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1226
1606
|
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1227
1607
|
try
|
|
1228
1608
|
{
|
|
1229
|
-
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>>
|
|
1609
|
+
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
|
|
1610
|
+
{
|
|
1611
|
+
RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1614
|
+
finally
|
|
1615
|
+
{
|
|
1616
|
+
_sortedHandlers.Push(handlerList);
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
return true;
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
private void RunTargetedWithoutTargeting<TMessage>(
|
|
1623
|
+
ref InstanceId target,
|
|
1624
|
+
ref TMessage message,
|
|
1625
|
+
int priority,
|
|
1626
|
+
Dictionary<MessageHandler, int> handlers
|
|
1627
|
+
)
|
|
1628
|
+
where TMessage : ITargetedMessage
|
|
1629
|
+
{
|
|
1630
|
+
switch (handlers.Count)
|
|
1631
|
+
{
|
|
1632
|
+
case <= 0:
|
|
1633
|
+
{
|
|
1634
|
+
return;
|
|
1635
|
+
}
|
|
1636
|
+
case 1:
|
|
1637
|
+
{
|
|
1638
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1639
|
+
handler.HandleTargetedWithoutTargeting(ref target, ref message, this, priority);
|
|
1640
|
+
return;
|
|
1641
|
+
}
|
|
1642
|
+
default:
|
|
1230
1643
|
{
|
|
1231
|
-
int priority = handlers.Key;
|
|
1232
1644
|
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1233
|
-
handlers.
|
|
1645
|
+
handlers.Keys
|
|
1234
1646
|
);
|
|
1235
1647
|
try
|
|
1236
1648
|
{
|
|
@@ -1248,18 +1660,14 @@
|
|
|
1248
1660
|
{
|
|
1249
1661
|
_messageHandlers.Push(messageHandlers);
|
|
1250
1662
|
}
|
|
1663
|
+
|
|
1664
|
+
break;
|
|
1251
1665
|
}
|
|
1252
1666
|
}
|
|
1253
|
-
finally
|
|
1254
|
-
{
|
|
1255
|
-
_sortedHandlers.Push(handlerList);
|
|
1256
|
-
}
|
|
1257
|
-
|
|
1258
|
-
return true;
|
|
1259
1667
|
}
|
|
1260
1668
|
|
|
1261
1669
|
private bool InternalBroadcastWithoutSource<TMessage>(
|
|
1262
|
-
ref InstanceId
|
|
1670
|
+
ref InstanceId source,
|
|
1263
1671
|
ref TMessage message,
|
|
1264
1672
|
Type type
|
|
1265
1673
|
)
|
|
@@ -1276,22 +1684,66 @@
|
|
|
1276
1684
|
return false;
|
|
1277
1685
|
}
|
|
1278
1686
|
|
|
1687
|
+
if (sortedHandlers.Count == 1)
|
|
1688
|
+
{
|
|
1689
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
|
|
1690
|
+
RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
|
|
1691
|
+
return true;
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1279
1694
|
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1280
1695
|
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1281
1696
|
try
|
|
1282
1697
|
{
|
|
1283
|
-
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>>
|
|
1698
|
+
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
|
|
1699
|
+
{
|
|
1700
|
+
RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
|
|
1701
|
+
}
|
|
1702
|
+
}
|
|
1703
|
+
finally
|
|
1704
|
+
{
|
|
1705
|
+
_sortedHandlers.Push(handlerList);
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1708
|
+
return true;
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
private void RunBroadcastWithoutSource<TMessage>(
|
|
1712
|
+
ref InstanceId source,
|
|
1713
|
+
ref TMessage message,
|
|
1714
|
+
int priority,
|
|
1715
|
+
Dictionary<MessageHandler, int> handlers
|
|
1716
|
+
)
|
|
1717
|
+
where TMessage : IBroadcastMessage
|
|
1718
|
+
{
|
|
1719
|
+
switch (handlers.Count)
|
|
1720
|
+
{
|
|
1721
|
+
case <= 0:
|
|
1722
|
+
{
|
|
1723
|
+
return;
|
|
1724
|
+
}
|
|
1725
|
+
case 1:
|
|
1726
|
+
{
|
|
1727
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1728
|
+
handler.HandleSourcedBroadcastWithoutSource(
|
|
1729
|
+
ref source,
|
|
1730
|
+
ref message,
|
|
1731
|
+
this,
|
|
1732
|
+
priority
|
|
1733
|
+
);
|
|
1734
|
+
return;
|
|
1735
|
+
}
|
|
1736
|
+
default:
|
|
1284
1737
|
{
|
|
1285
|
-
int priority = handlers.Key;
|
|
1286
1738
|
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1287
|
-
handlers.
|
|
1739
|
+
handlers.Keys
|
|
1288
1740
|
);
|
|
1289
1741
|
try
|
|
1290
1742
|
{
|
|
1291
1743
|
foreach (MessageHandler handler in messageHandlers)
|
|
1292
1744
|
{
|
|
1293
1745
|
handler.HandleSourcedBroadcastWithoutSource(
|
|
1294
|
-
ref
|
|
1746
|
+
ref source,
|
|
1295
1747
|
ref message,
|
|
1296
1748
|
this,
|
|
1297
1749
|
priority
|
|
@@ -1302,14 +1754,10 @@
|
|
|
1302
1754
|
{
|
|
1303
1755
|
_messageHandlers.Push(messageHandlers);
|
|
1304
1756
|
}
|
|
1757
|
+
|
|
1758
|
+
break;
|
|
1305
1759
|
}
|
|
1306
1760
|
}
|
|
1307
|
-
finally
|
|
1308
|
-
{
|
|
1309
|
-
_sortedHandlers.Push(handlerList);
|
|
1310
|
-
}
|
|
1311
|
-
|
|
1312
|
-
return true;
|
|
1313
1761
|
}
|
|
1314
1762
|
|
|
1315
1763
|
private Action InternalRegisterUntargeted<T>(
|