Skip to content

Commit

Permalink
Switch LibraryProvider from a Monitor to a ReaderWriterLockSlim
Browse files Browse the repository at this point in the history
  • Loading branch information
electroly committed Nov 1, 2024
1 parent 70b612c commit 05934a2
Showing 1 changed file with 39 additions and 33 deletions.
72 changes: 39 additions & 33 deletions src/J.Core/LibraryProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@ public sealed partial class LibraryProvider : IDisposable
private readonly AsyncRetryPolicy _policy = Policy
.Handle<Exception>(x => x is not AmazonS3Exception s3ex || (int)s3ex.StatusCode >= 500)
.RetryAsync(5);
private readonly object _lock = new();
private readonly ReaderWriterLockSlim _rwlock = new();
private SqliteConnection? _connection;
private bool _inTransaction;

public LibraryProvider(AccountSettingsProvider accountSettingsProvider, ProcessTempDir processTempDir)
{
Expand All @@ -37,9 +36,35 @@ public static void Create(string filePath)
connection.Open();
}

private void WithWriteLock(Action action)
{
_rwlock.EnterWriteLock();
try
{
action();
}
finally
{
_rwlock.ExitWriteLock();
}
}

private T WithReadLock<T>(Func<T> func)
{
_rwlock.EnterReadLock();
try
{
return func();
}
finally
{
_rwlock.ExitReadLock();
}
}

public void Connect()
{
lock (_lock)
WithWriteLock(() =>
{
_connection?.Dispose();
_connection = null;
Expand All @@ -53,16 +78,16 @@ public void Connect()
Execute("PRAGMA foreign_keys = ON;");

Upgrade();
}
});
}

public void Disconnect()
{
lock (_lock)
WithWriteLock(() =>
{
_connection?.Dispose();
_connection = null;
}
});
}

public void Dispose()
Expand Down Expand Up @@ -137,7 +162,7 @@ private List<T> Query<T>(
Func<SqliteDataReader, T> generator
)
{
lock (_lock)
return WithReadLock(() =>
{
using var command = _connection!.CreateCommand();
command.CommandText = sql;
Expand All @@ -147,7 +172,7 @@ Func<SqliteDataReader, T> generator
while (reader.Read())
rows.Add(generator(reader));
return rows;
}
});
}

private T QuerySingle<T>(
Expand All @@ -161,13 +186,13 @@ Func<SqliteDataReader, T> generator

private void Execute(string sql, Action<SqliteParameterCollection>? configureParameters = null)
{
lock (_lock)
WithWriteLock(() =>
{
using var command = _connection!.CreateCommand();
command.CommandText = sql;
configureParameters?.Invoke(command.Parameters);
command.ExecuteNonQuery();
}
});
}

public void NewTagType(TagType tagType) =>
Expand Down Expand Up @@ -578,33 +603,14 @@ FROM tags
);
}

public bool InTransaction
{
get
{
lock (_lock)
{
return _inTransaction;
}
}
}

public void WithTransaction(Action action)
{
lock (_lock)
WithWriteLock(() =>
{
using var transaction = _connection!.BeginTransaction();
_inTransaction = true;
try
{
action();
transaction.Commit();
}
finally
{
_inTransaction = false;
}
}
action();
transaction.Commit();
});
}

public async Task SyncUpAsync(CancellationToken cancel)
Expand Down

0 comments on commit 05934a2

Please sign in to comment.