123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- using MediaBrowser.Model.Logging;
- using System;
- using System.Data;
- using System.Threading;
- namespace MediaBrowser.Server.Implementations.Persistence
- {
- class SqliteShrinkMemoryTimer : IDisposable
- {
- private Timer _shrinkMemoryTimer;
- private readonly SemaphoreSlim _writeLock;
- private readonly ILogger _logger;
- private readonly IDbConnection _connection;
- public SqliteShrinkMemoryTimer(IDbConnection connection, SemaphoreSlim writeLock, ILogger logger)
- {
- _connection = connection;
- _writeLock = writeLock;
- _logger = logger;
- _shrinkMemoryTimer = new Timer(TimerCallback, null, TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(30));
- }
- private async void TimerCallback(object state)
- {
- await _writeLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
- IDbTransaction transaction = null;
- try
- {
- transaction = _connection.BeginTransaction();
- using (var cmd = _connection.CreateCommand())
- {
- cmd.Transaction = transaction;
- cmd.CommandText = "pragma shrink_memory";
- cmd.ExecuteNonQuery();
- }
- transaction.Commit();
- }
- catch (OperationCanceledException)
- {
- if (transaction != null)
- {
- transaction.Rollback();
- }
- throw;
- }
- catch (Exception e)
- {
- _logger.ErrorException("Failed to save items:", e);
- if (transaction != null)
- {
- transaction.Rollback();
- }
- throw;
- }
- finally
- {
- if (transaction != null)
- {
- transaction.Dispose();
- }
- _writeLock.Release();
- }
- }
- public void Dispose()
- {
- if (_shrinkMemoryTimer != null)
- {
- _shrinkMemoryTimer.Dispose();
- _shrinkMemoryTimer = null;
- }
- }
- }
- }
|