Skip to content

Commit d70f1bf

Browse files
committed
Removed unnecessary cache locking
1 parent 7238b4a commit d70f1bf

File tree

1 file changed

+44
-46
lines changed

1 file changed

+44
-46
lines changed

MailKit/Net/Imap/ImapTokenCache.cs

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -59,62 +59,60 @@ public ImapTokenCache ()
5959

6060
public ImapToken AddOrGet (ImapTokenType type, ByteArrayBuilder builder)
6161
{
62-
lock (cache) {
63-
// lookupKey is a pre-allocated key used for lookups
64-
lookupKey.Init (decoders, chars, type, builder.GetBuffer (), builder.Length, out var decoder, out int charsNeeded);
62+
// lookupKey is a pre-allocated key used for lookups
63+
lookupKey.Init (decoders, chars, type, builder.GetBuffer (), builder.Length, out var decoder, out int charsNeeded);
6564

66-
if (cache.TryGetValue (lookupKey, out var node)) {
67-
// move the node to the head of the list
68-
list.Remove (node);
69-
list.AddFirst (node);
70-
node.Value.Count++;
65+
if (cache.TryGetValue (lookupKey, out var node)) {
66+
// move the node to the head of the list
67+
list.Remove (node);
68+
list.AddFirst (node);
69+
node.Value.Count++;
7170

72-
return node.Value.Token;
73-
}
71+
return node.Value.Token;
72+
}
7473

75-
string value;
76-
77-
if (charsNeeded <= chars.Length) {
78-
// If the number of needed chars is <= the length of our temp buffer, then it should all be contained.
79-
value = new string (chars, 0, charsNeeded);
80-
} else {
81-
var buffer = ArrayPool<char>.Shared.Rent (charsNeeded);
82-
try {
83-
// Note: This conversion should go flawlessly, so we'll just Debug.Assert() our expectations.
84-
decoder.Convert (builder.GetBuffer (), 0, builder.Length, buffer, 0, buffer.Length, true, out var bytesUsed, out var charsUsed, out var completed);
85-
Debug.Assert (bytesUsed == builder.Length);
86-
Debug.Assert (charsUsed == charsNeeded);
87-
Debug.Assert (completed);
88-
value = new string (buffer, 0, charsUsed);
89-
} finally {
90-
ArrayPool<char>.Shared.Return (buffer);
91-
decoder.Reset ();
92-
}
74+
string value;
75+
76+
if (charsNeeded <= chars.Length) {
77+
// If the number of needed chars is <= the length of our temp buffer, then it should all be contained.
78+
value = new string (chars, 0, charsNeeded);
79+
} else {
80+
var buffer = ArrayPool<char>.Shared.Rent (charsNeeded);
81+
try {
82+
// Note: This conversion should go flawlessly, so we'll just Debug.Assert() our expectations.
83+
decoder.Convert (builder.GetBuffer (), 0, builder.Length, buffer, 0, buffer.Length, true, out var bytesUsed, out var charsUsed, out var completed);
84+
Debug.Assert (bytesUsed == builder.Length);
85+
Debug.Assert (charsUsed == charsNeeded);
86+
Debug.Assert (completed);
87+
value = new string (buffer, 0, charsUsed);
88+
} finally {
89+
ArrayPool<char>.Shared.Return (buffer);
90+
decoder.Reset ();
9391
}
92+
}
9493

95-
var token = new ImapToken (type, value);
94+
var token = new ImapToken (type, value);
9695

97-
if (cache.Count >= capacity) {
98-
// remove the least recently used token
99-
node = list.Last;
100-
list.RemoveLast ();
101-
cache.Remove (node.Value.Key);
96+
if (cache.Count >= capacity) {
97+
// remove the least recently used token
98+
node = list.Last;
99+
list.RemoveLast ();
100+
cache.Remove (node.Value.Key);
102101

103-
// re-use the node, item and key to avoid allocations
104-
node.Value.Key.Init (type, (string) token.Value);
105-
node.Value.Token = token;
106-
} else {
107-
var key = new ImapTokenKey (type, (string) token.Value);
108-
var item = new ImapTokenItem (key, token);
102+
// re-use the node, item and key to avoid allocations
103+
node.Value.Key.Init (type, (string) token.Value);
104+
node.Value.Token = token;
105+
} else {
106+
var key = new ImapTokenKey (type, (string) token.Value);
107+
var item = new ImapTokenItem (key, token);
109108

110-
node = new LinkedListNode<ImapTokenItem> (item);
111-
}
109+
node = new LinkedListNode<ImapTokenItem> (item);
110+
}
112111

113-
cache.Add (node.Value.Key, node);
114-
list.AddFirst (node);
112+
cache.Add (node.Value.Key, node);
113+
list.AddFirst (node);
115114

116-
return token;
117-
}
115+
return token;
118116
}
119117

120118
class ImapTokenKey

0 commit comments

Comments
 (0)