11// Copyright (c) Microsoft Corporation.
22// Licensed under the MIT license.
33
4- using System . Collections . Concurrent ;
4+ using System . Runtime . InteropServices ;
55
66namespace Garnet . server
77{
88 /// <summary>
9- /// Base class for events handled by CollectionItemBroker's main loop
9+ /// Event types handled by CollectionItemBroker
1010 /// </summary>
11- internal abstract class BrokerEventBase
11+ internal enum CollectionItemBrokerEventType : byte
1212 {
13+ NotSet = 0 ,
14+ NewObserver = 1 ,
15+ CollectionUpdated = 2 ,
1316 }
1417
1518 /// <summary>
16- /// Event to notify CollectionItemBroker that a collection has been updated
19+ /// Struct that holds data for different event types handled by CollectionItemBroker
1720 /// </summary>
18- internal class CollectionUpdatedEvent : BrokerEventBase
21+ [ StructLayout ( LayoutKind . Explicit , Size = 17 ) ]
22+ internal struct CollectionItemBrokerEvent
1923 {
2024 /// <summary>
21- /// Key of updated collection
25+ /// Key of updated collection (for a CollectionUpdated event)
2226 /// </summary>
23- internal readonly byte [ ] Key ;
27+ [ FieldOffset ( 0 ) ]
28+ internal byte [ ] Key = null ;
2429
2530 /// <summary>
26- /// Observers
31+ /// The keys that the observer requests to subscribe on (for a NewObserver event)
2732 /// </summary>
28- internal readonly ConcurrentQueue < CollectionItemObserver > Observers ;
33+ [ FieldOffset ( 0 ) ]
34+ internal byte [ ] [ ] Keys = null ;
2935
30- public CollectionUpdatedEvent ( byte [ ] key , ConcurrentQueue < CollectionItemObserver > observers )
36+ /// <summary>
37+ /// The new observer instance (for a NewObserver event)
38+ /// </summary>
39+ [ FieldOffset ( 8 ) ]
40+ internal CollectionItemObserver Observer = null ;
41+
42+ /// <summary>
43+ /// The type of event represented
44+ /// </summary>
45+ [ FieldOffset ( 16 ) ]
46+ internal CollectionItemBrokerEventType EventType = CollectionItemBrokerEventType . NotSet ;
47+
48+ public CollectionItemBrokerEvent ( )
3149 {
32- Key = key ;
33- Observers = observers ;
50+
3451 }
35- }
3652
37- /// <summary>
38- /// Event to notify CollectionItemBroker that a new observer was created
39- /// </summary>
40- internal class NewObserverEvent : BrokerEventBase
41- {
4253 /// <summary>
43- /// The new observer instance
54+ /// Creates a CollectionUpdated event
4455 /// </summary>
45- internal CollectionItemObserver Observer { get ; }
56+ /// <param name="key">Key of updated collection</param>
57+ public static CollectionItemBrokerEvent CreateCollectionUpdatedEvent ( byte [ ] key )
58+ {
59+ return new CollectionItemBrokerEvent
60+ {
61+ EventType = CollectionItemBrokerEventType . CollectionUpdated ,
62+ Key = key
63+ } ;
64+ }
4665
4766 /// <summary>
48- /// The keys that the observer requests to subscribe on
67+ /// Creates a NewObserver event
4968 /// </summary>
50- internal byte [ ] [ ] Keys { get ; }
51-
52- internal NewObserverEvent ( CollectionItemObserver observer , byte [ ] [ ] keys )
69+ /// <param name="observer">The new observer instance</param>
70+ /// <param name="keys">The keys that the observer requests to subscribe on</param>
71+ public static CollectionItemBrokerEvent CreateNewObserverEvent ( CollectionItemObserver observer , byte [ ] [ ] keys )
5372 {
54- Observer = observer ;
55- Keys = keys ;
73+ return new CollectionItemBrokerEvent
74+ {
75+ EventType = CollectionItemBrokerEventType . NewObserver ,
76+ Observer = observer ,
77+ Keys = keys ,
78+ } ;
5679 }
80+
81+ public bool IsDefault ( ) => EventType == CollectionItemBrokerEventType . NotSet ;
5782 }
5883}
0 commit comments