aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Providers/ProviderManager.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Providers/ProviderManager.cs42
1 files changed, 20 insertions, 22 deletions
diff --git a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
index 395a4298b..01c0659b6 100644
--- a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
+++ b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
@@ -83,40 +83,38 @@ namespace MediaBrowser.Server.Implementations.Providers
libraryManager.ItemUpdated += libraryManager_ItemUpdated;
}
+ private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
+
/// <summary>
/// Handles the ItemUpdated event of the libraryManager control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
- void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e)
+ async void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e)
{
var item = e.Item;
- if (ConfigurationManager.Configuration.SaveLocalMeta)
+ foreach (var saver in _savers.Where(i => i.Supports(item)))
{
- if (item.LocationType != LocationType.FileSystem)
- {
- return;
- }
+ var path = saver.GetSavePath(item);
- foreach (var saver in _savers.Where(i => i.Supports(item)))
- {
- var path = saver.GetSavePath(item);
+ var semaphore = _fileLocks.GetOrAdd(path, key => new SemaphoreSlim(1, 1));
- _directoryWatchers.TemporarilyIgnore(path);
+ await semaphore.WaitAsync().ConfigureAwait(false);
- try
- {
- saver.Save(item, CancellationToken.None);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error in metadata saver", ex);
- }
- finally
- {
- _directoryWatchers.RemoveTempIgnore(path);
- }
+ try
+ {
+ _directoryWatchers.TemporarilyIgnore(path);
+ saver.Save(item, CancellationToken.None);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in metadata saver", ex);
+ }
+ finally
+ {
+ _directoryWatchers.RemoveTempIgnore(path);
+ semaphore.Release();
}
}
}