@@ -17,6 +17,7 @@ import (
17
17
"log"
18
18
"reflect"
19
19
"strings"
20
+ "sync"
20
21
"sync/atomic"
21
22
"time"
22
23
)
@@ -697,6 +698,7 @@ type mapEventManager[K comparable, V any] struct {
697
698
lifecycleListeners []* MapLifecycleListener [K , V ]
698
699
pendingRegistrations map [string ]* pendingListenerOp [K , V ]
699
700
eventStream * eventStream
701
+ mutex sync.RWMutex
700
702
}
701
703
702
704
// pendingListenerOp is a simple holder for the listener
@@ -731,6 +733,9 @@ func newMapEventManager[K comparable, V any](namedMap *NamedMap[K, V], bc baseCl
731
733
732
734
// close closes the event stream.
733
735
func (m * mapEventManager [K , V ]) close () {
736
+ m .mutex .Lock ()
737
+ defer m .mutex .Unlock ()
738
+
734
739
if m .eventStream != nil {
735
740
m .eventStream .cancel ()
736
741
}
@@ -746,6 +751,9 @@ func (m *mapEventManager[K, V]) close() {
746
751
747
752
// addLifecycleListener adds the specified [MapLifecycleListener].
748
753
func (m * mapEventManager [K , V ]) addLifecycleListener (listener MapLifecycleListener [K , V ]) {
754
+ m .mutex .Lock ()
755
+ defer m .mutex .Unlock ()
756
+
749
757
for _ , e := range m .lifecycleListeners {
750
758
if * e == listener {
751
759
return
@@ -756,6 +764,9 @@ func (m *mapEventManager[K, V]) addLifecycleListener(listener MapLifecycleListen
756
764
757
765
// removeLifecycleListener removes the specified [MapLifecycleListener].
758
766
func (m * mapEventManager [K , V ]) removeLifecycleListener (listener MapLifecycleListener [K , V ]) {
767
+ m .mutex .Lock ()
768
+ defer m .mutex .Unlock ()
769
+
759
770
idx := - 1
760
771
listeners := m .lifecycleListeners
761
772
for i , c := range listeners {
@@ -774,6 +785,9 @@ func (m *mapEventManager[K, V]) removeLifecycleListener(listener MapLifecycleLis
774
785
// to the Coherence cluster that an event may omit the old and new
775
786
// values when emitting a MapEvent.
776
787
func (m * mapEventManager [K , V ]) addKeyListener (ctx context.Context , listener MapListener [K , V ], key K , lite bool ) error {
788
+ m .mutex .Lock ()
789
+ defer m .mutex .Unlock ()
790
+
777
791
group , lPresent := m .keyListeners [key ]
778
792
if ! lPresent {
779
793
groupInner , err := makeKeyListenerGroup (m , key )
@@ -789,6 +803,9 @@ func (m *mapEventManager[K, V]) addKeyListener(ctx context.Context, listener Map
789
803
790
804
// removeKeyListener removes the specified key-based listener.
791
805
func (m * mapEventManager [K , V ]) removeKeyListener (ctx context.Context , listener MapListener [K , V ], key K ) error {
806
+ m .mutex .Lock ()
807
+ defer m .mutex .Unlock ()
808
+
792
809
group , lPresent := m .keyListeners [key ]
793
810
if lPresent {
794
811
return group .removeListener (ctx , listener )
@@ -800,6 +817,9 @@ func (m *mapEventManager[K, V]) removeKeyListener(ctx context.Context, listener
800
817
// to the Coherence cluster that an event may omit the old and new
801
818
// values when emitting a MapEvent.
802
819
func (m * mapEventManager [K , V ]) addFilterListener (ctx context.Context , listener MapListener [K , V ], filter filters.Filter , lite bool ) error {
820
+ m .mutex .Lock ()
821
+ defer m .mutex .Unlock ()
822
+
803
823
filterLocal := filter
804
824
if filterLocal == nil {
805
825
filterLocal = defaultFilter
@@ -820,6 +840,9 @@ func (m *mapEventManager[K, V]) addFilterListener(ctx context.Context, listener
820
840
821
841
// removeFilterListener removes the specified filter-based listener.
822
842
func (m * mapEventManager [K , V ]) removeFilterListener (ctx context.Context , listener MapListener [K , V ], filter filters.Filter ) error {
843
+ m .mutex .Lock ()
844
+ defer m .mutex .Unlock ()
845
+
823
846
filterLocal := filter
824
847
if filterLocal == nil {
825
848
filterLocal = defaultFilter
@@ -836,6 +859,9 @@ func (m *mapEventManager[K, V]) removeFilterListener(ctx context.Context, listen
836
859
// managing MapEvents raised by Coherence.
837
860
func (m * mapEventManager [K , V ]) ensureStream () (* eventStream , error ) {
838
861
if m .eventStream == nil {
862
+ m .mutex .Lock ()
863
+ defer m .mutex .Unlock ()
864
+
839
865
// because the event stream is for the lifetime of the cache,
840
866
// we use context.Background() and ignore any user provided
841
867
// timeouts
@@ -959,8 +985,7 @@ func (m *mapEventManager[K, V]) newSubscribeRequest(requestType string) proto.Ma
959
985
}
960
986
}
961
987
962
- func (m * mapEventManager [K , V ]) dispatch (eventType MapLifecycleEventType ,
963
- creator func () MapLifecycleEvent [K , V ]) {
988
+ func (m * mapEventManager [K , V ]) dispatch (eventType MapLifecycleEventType , creator func () MapLifecycleEvent [K , V ]) {
964
989
if len (m .lifecycleListeners ) > 0 {
965
990
event := creator ()
966
991
for _ , l := range m .lifecycleListeners {
0 commit comments