@@ -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