@@ -9,6 +9,7 @@ internal interface INodePolicy<K, V, N>
9
9
where N : LfuNode < K , V >
10
10
{
11
11
N Create ( K key , V value ) ;
12
+ N Clone ( N previous , V value ) ;
12
13
bool IsExpired ( N node ) ;
13
14
void AdvanceTime ( ) ;
14
15
void OnRead ( N node ) ;
@@ -26,6 +27,11 @@ public AccessOrderNode<K, V> Create(K key, V value)
26
27
return new AccessOrderNode < K , V > ( key , value ) ;
27
28
}
28
29
30
+ public AccessOrderNode < K , V > Clone ( AccessOrderNode < K , V > prev , V value )
31
+ {
32
+ return new AccessOrderNode < K , V > ( prev . Key , value ) ;
33
+ }
34
+
29
35
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
30
36
public bool IsExpired ( AccessOrderNode < K , V > node )
31
37
{
@@ -82,6 +88,14 @@ public TimeOrderNode<K, V> Create(K key, V value)
82
88
return new TimeOrderNode < K , V > ( key , value ) { TimeToExpire = Duration . SinceEpoch ( ) + expiry } ;
83
89
}
84
90
91
+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
92
+ public TimeOrderNode < K , V > Clone ( TimeOrderNode < K , V > prev , V value )
93
+ {
94
+ var node = new TimeOrderNode < K , V > ( prev . Key , value ) { TimeToExpire = prev . TimeToExpire } ;
95
+ node . SetNextInTimeOrder ( node ) ;
96
+ return node ;
97
+ }
98
+
85
99
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
86
100
public bool IsExpired ( TimeOrderNode < K , V > node )
87
101
{
@@ -118,9 +132,19 @@ public void OnWrite(TimeOrderNode<K, V> node)
118
132
{
119
133
var oldTte = node . TimeToExpire ;
120
134
node . TimeToExpire = current + expiryCalculator . GetExpireAfterUpdate ( node . Key , node . Value , node . TimeToExpire - current ) ;
121
- if ( oldTte . raw != node . TimeToExpire . raw )
122
- {
123
- wheel . Reschedule ( node ) ;
135
+
136
+ // non-atomic write value node was updated and replaced, schedule
137
+ // can JIT elide this branch for atomic writes?
138
+ if ( ! TypeProps < V > . IsWriteAtomic && node . GetNextInTimeOrder ( ) == node )
139
+ {
140
+ wheel . Schedule ( node ) ;
141
+ }
142
+ else
143
+ {
144
+ if ( oldTte . raw != node . TimeToExpire . raw )
145
+ {
146
+ wheel . Reschedule ( node ) ;
147
+ }
124
148
}
125
149
}
126
150
}
0 commit comments