@@ -10,63 +10,94 @@ internal sealed class EventIdPropertyCache
1010 {
1111 private readonly object _createLock = new ( ) ;
1212 private readonly int _maxCapacity ;
13- private readonly Dictionary < int , LogEventProperty > _propertyCache ;
13+ private readonly Dictionary < EventKey , LogEventProperty > _propertyCache ;
1414
1515 private int count ;
1616
1717 public EventIdPropertyCache ( int maxCapacity )
1818 {
19- this . _maxCapacity = maxCapacity ;
20- this . _propertyCache = new Dictionary < int , LogEventProperty > ( capacity : maxCapacity ) ;
19+ _maxCapacity = maxCapacity ;
20+ _propertyCache = new Dictionary < EventKey , LogEventProperty > ( capacity : maxCapacity ) ;
2121 }
2222
2323 public LogEventProperty GetOrCreateProperty ( in EventId eventId )
2424 {
25- if ( _propertyCache . TryGetValue ( eventId . Id , out var cachedProperty ) )
25+ var eventKey = new EventKey ( eventId ) ;
26+
27+ if ( _propertyCache . TryGetValue ( eventKey , out var cachedProperty ) )
2628 {
2729 return cachedProperty ;
2830 }
2931
3032 lock ( _createLock )
3133 {
32- return GetOrCreateSynchronized ( in eventId ) ;
34+ // Double check under lock
35+ if ( _propertyCache . TryGetValue ( eventKey , out cachedProperty ) )
36+ {
37+ return cachedProperty ;
38+ }
39+
40+ cachedProperty = CreateCore ( in eventKey ) ;
41+
42+ if ( count < _maxCapacity )
43+ {
44+ _propertyCache [ eventKey ] = cachedProperty ;
45+ count ++ ;
46+ }
47+
48+ return cachedProperty ;
3349 }
3450 }
3551
36- private static LogEventProperty CreateCore ( in EventId eventId )
52+ private static LogEventProperty CreateCore ( in EventKey eventKey )
3753 {
3854 var properties = new List < LogEventProperty > ( 2 ) ;
3955
40- if ( eventId . Id != 0 )
56+ if ( eventKey . Id != 0 )
4157 {
42- properties . Add ( new LogEventProperty ( "Id" , new ScalarValue ( eventId . Id ) ) ) ;
58+ properties . Add ( new LogEventProperty ( "Id" , new ScalarValue ( eventKey . Id ) ) ) ;
4359 }
4460
45- if ( eventId . Name != null )
61+ if ( eventKey . Name != null )
4662 {
47- properties . Add ( new LogEventProperty ( "Name" , new ScalarValue ( eventId . Name ) ) ) ;
63+ properties . Add ( new LogEventProperty ( "Name" , new ScalarValue ( eventKey . Name ) ) ) ;
4864 }
4965
5066 return new LogEventProperty ( "EventId" , new StructureValue ( properties ) ) ;
5167 }
5268
53- private LogEventProperty GetOrCreateSynchronized ( in EventId eventId )
69+ private readonly struct EventKey : IEquatable < EventKey >
5470 {
55- // Double check under lock
56- if ( _propertyCache . TryGetValue ( eventId . Id , out var cachedProperty ) )
71+
72+ public EventKey ( EventId eventId )
5773 {
58- return cachedProperty ;
74+ Id = eventId . Id ;
75+ Name = eventId . Name ;
5976 }
6077
61- cachedProperty = CreateCore ( in eventId ) ;
78+ public int Id { get ; }
6279
63- if ( count < _maxCapacity )
80+ public string ? Name { get ; }
81+
82+ /// <inheritdoc />
83+ public override int GetHashCode ( )
6484 {
65- _propertyCache [ eventId . Id ] = cachedProperty ;
66- count ++ ;
85+ unchecked
86+ {
87+ var hashCode = 17 ;
88+
89+ hashCode = ( hashCode * 397 ) ^ this . Id ;
90+ hashCode = ( hashCode * 397 ) ^ ( this . Name ? . GetHashCode ( ) ?? 0 ) ;
91+
92+ return hashCode ;
93+ }
6794 }
68-
69- return cachedProperty ;
95+
96+ /// <inheritdoc />
97+ public bool Equals ( EventKey other ) => this . Id == other . Id && this . Name == other . Name ;
98+
99+ /// <inheritdoc />
100+ public override bool Equals ( object ? obj ) => obj is EventKey other && Equals ( other ) ;
70101 }
71102 }
72103}
0 commit comments