This is an automated email from the ASF dual-hosted git repository. nightowl888 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/lucenenet.git
commit 5a235309358bcd04e1095c14969100229f195c03 Author: Shad Storhaug <[email protected]> AuthorDate: Tue Jan 25 21:38:49 2022 +0700 PERFORMANCE: Lucene.Net.Support.IO.StreamExtensions::Read(Stream, ByteBuffer, long): Use a lock per stream so instances of NIOFSDirectory can run independently on separate threads without competing for a lock. --- src/Lucene.Net/Support/IO/StreamExtensions.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Lucene.Net/Support/IO/StreamExtensions.cs b/src/Lucene.Net/Support/IO/StreamExtensions.cs index e74c3d7..abb8c86 100644 --- a/src/Lucene.Net/Support/IO/StreamExtensions.cs +++ b/src/Lucene.Net/Support/IO/StreamExtensions.cs @@ -2,6 +2,7 @@ using Lucene.Net.Support.Threading; using System; using System.IO; +using System.Runtime.CompilerServices; namespace Lucene.Net.Support.IO { @@ -35,8 +36,7 @@ namespace Lucene.Net.Support.IO /// </summary> internal static class StreamExtensions { - private static readonly object readLock = new object(); - + private static readonly ConditionalWeakTable<Stream, object> lockCache = new ConditionalWeakTable<Stream, object>(); /// <summary> /// Reads a sequence of bytes from a <see cref="Stream"/> to the given <see cref="ByteBuffer"/>, starting at the given position. @@ -82,6 +82,7 @@ namespace Lucene.Net.Support.IO return 0; int read = 0; + object readLock = lockCache.GetOrCreateValue(stream); UninterruptableMonitor.Enter(readLock); try {
