diff --git a/Emby.Naming/Emby.Naming.csproj b/Emby.Naming/Emby.Naming.csproj
index fca0aa1b3..a23fa3df7 100644
--- a/Emby.Naming/Emby.Naming.csproj
+++ b/Emby.Naming/Emby.Naming.csproj
@@ -24,8 +24,9 @@
-
+
+
diff --git a/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs b/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
index 4832c19c4..7ec5252d0 100644
--- a/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
+++ b/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
@@ -35,7 +35,7 @@ namespace Emby.Server.Implementations.AppBase
///
/// The _configuration sync lock.
///
- private object _configurationSyncLock = new object();
+ private readonly object _configurationSyncLock = new object();
///
/// The _configuration.
@@ -98,16 +98,31 @@ namespace Emby.Server.Implementations.AppBase
public IApplicationPaths CommonApplicationPaths { get; private set; }
///
- /// Gets the system configuration
+ /// Gets the system configuration.
///
/// The configuration.
public BaseApplicationConfiguration CommonConfiguration
{
get
{
- // Lazy load
- LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationLoaded, ref _configurationSyncLock, () => (BaseApplicationConfiguration)ConfigurationHelper.GetXmlConfiguration(ConfigurationType, CommonApplicationPaths.SystemConfigurationFilePath, XmlSerializer));
- return _configuration;
+ if (_configurationLoaded)
+ {
+ return _configuration;
+ }
+
+ lock (_configurationSyncLock)
+ {
+ if (_configurationLoaded)
+ {
+ return _configuration;
+ }
+
+ _configuration = (BaseApplicationConfiguration)ConfigurationHelper.GetXmlConfiguration(ConfigurationType, CommonApplicationPaths.SystemConfigurationFilePath, XmlSerializer);
+
+ _configurationLoaded = true;
+
+ return _configuration;
+ }
}
protected set
{
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
index ea4444268..d6ca19e3f 100644
--- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj
+++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
@@ -1,4 +1,4 @@
-
+
@@ -29,9 +29,9 @@
-
-
-
+
+
+
@@ -47,16 +47,12 @@
true
-
-
- latest
-
-
-
+
+
diff --git a/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs b/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
index f26a70586..d55dc2f18 100644
--- a/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
+++ b/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
@@ -27,6 +27,11 @@ namespace Emby.Server.Implementations.EntryPoints
private NatManager _natManager;
+ private readonly object _createdRulesLock = new object();
+ private List _createdRules = new List();
+ private readonly object _usnsHandledLock = new object();
+ private List _usnsHandled = new List();
+
public ExternalPortForwarding(ILoggerFactory loggerFactory, IServerApplicationHost appHost, IServerConfigurationManager config, IDeviceDiscovery deviceDiscovery, IHttpClient httpClient)
{
_logger = loggerFactory.CreateLogger("PortMapper");
@@ -127,12 +132,13 @@ namespace Emby.Server.Implementations.EntryPoints
return;
}
- lock (_usnsHandled)
+ lock (_usnsHandledLock)
{
if (_usnsHandled.Contains(identifier))
{
return;
}
+
_usnsHandled.Add(identifier);
}
@@ -186,11 +192,12 @@ namespace Emby.Server.Implementations.EntryPoints
private void ClearCreatedRules(object state)
{
- lock (_createdRules)
+ lock (_createdRulesLock)
{
_createdRules.Clear();
}
- lock (_usnsHandled)
+
+ lock (_usnsHandledLock)
{
_usnsHandled.Clear();
}
@@ -216,8 +223,6 @@ namespace Emby.Server.Implementations.EntryPoints
}
}
- private List _createdRules = new List();
- private List _usnsHandled = new List();
private async void CreateRules(INatDevice device)
{
if (_disposed)
@@ -231,7 +236,7 @@ namespace Emby.Server.Implementations.EntryPoints
var addressString = address.ToString();
- lock (_createdRules)
+ lock (_createdRulesLock)
{
if (!_createdRules.Contains(addressString))
{
diff --git a/Emby.Server.Implementations/Networking/NetworkManager.cs b/Emby.Server.Implementations/Networking/NetworkManager.cs
index 7d85a0666..d948dad68 100644
--- a/Emby.Server.Implementations/Networking/NetworkManager.cs
+++ b/Emby.Server.Implementations/Networking/NetworkManager.cs
@@ -20,6 +20,9 @@ namespace Emby.Server.Implementations.Networking
private IPAddress[] _localIpAddresses;
private readonly object _localIpAddressSyncLock = new object();
+ private readonly object _subnetLookupLock = new object();
+ private Dictionary> _subnetLookup = new Dictionary>(StringComparer.Ordinal);
+
public NetworkManager(ILogger logger)
{
_logger = logger;
@@ -28,10 +31,10 @@ namespace Emby.Server.Implementations.Networking
NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged;
}
- public Func LocalSubnetsFn { get; set; }
-
public event EventHandler NetworkChanged;
+ public Func LocalSubnetsFn { get; set; }
+
private void OnNetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
{
_logger.LogDebug("NetworkAvailabilityChanged");
@@ -179,10 +182,9 @@ namespace Emby.Server.Implementations.Networking
return false;
}
- private Dictionary> _subnetLookup = new Dictionary>(StringComparer.Ordinal);
private List GetSubnets(string endpointFirstPart)
{
- lock (_subnetLookup)
+ lock (_subnetLookupLock)
{
if (_subnetLookup.TryGetValue(endpointFirstPart, out var subnets))
{
@@ -200,7 +202,11 @@ namespace Emby.Server.Implementations.Networking
int subnet_Test = 0;
foreach (string part in unicastIPAddressInformation.IPv4Mask.ToString().Split('.'))
{
- if (part.Equals("0")) break;
+ if (part.Equals("0", StringComparison.Ordinal))
+ {
+ break;
+ }
+
subnet_Test++;
}
diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs
index 0c0c77cda..a1e2f9079 100644
--- a/Emby.Server.Implementations/Updates/InstallationManager.cs
+++ b/Emby.Server.Implementations/Updates/InstallationManager.cs
@@ -28,43 +28,10 @@ namespace Emby.Server.Implementations.Updates
///
public class InstallationManager : IInstallationManager
{
- public event EventHandler PackageInstalling;
- public event EventHandler PackageInstallationCompleted;
- public event EventHandler PackageInstallationFailed;
- public event EventHandler PackageInstallationCancelled;
-
///
- /// The current installations
- ///
- private List<(InstallationInfo info, CancellationTokenSource token)> _currentInstallations { get; set; }
-
- ///
- /// The completed installations
- ///
- private ConcurrentBag _completedInstallationsInternal;
-
- public IEnumerable CompletedInstallations => _completedInstallationsInternal;
-
- ///
- /// Occurs when [plugin uninstalled].
- ///
- public event EventHandler> PluginUninstalled;
-
- ///
- /// Occurs when [plugin updated].
- ///
- public event EventHandler> PluginUpdated;
-
- ///
- /// Occurs when [plugin updated].
- ///
- public event EventHandler> PluginInstalled;
-
- ///
- /// The _logger
+ /// The _logger.
///
private readonly ILogger _logger;
-
private readonly IApplicationPaths _appPaths;
private readonly IHttpClient _httpClient;
private readonly IJsonSerializer _jsonSerializer;
@@ -79,6 +46,18 @@ namespace Emby.Server.Implementations.Updates
private readonly IZipClient _zipClient;
+ private readonly object _currentInstallationsLock = new object();
+
+ ///
+ /// The current installations.
+ ///
+ private List<(InstallationInfo info, CancellationTokenSource token)> _currentInstallations;
+
+ ///
+ /// The completed installations.
+ ///
+ private ConcurrentBag _completedInstallationsInternal;
+
public InstallationManager(
ILogger logger,
IApplicationHost appHost,
@@ -107,6 +86,31 @@ namespace Emby.Server.Implementations.Updates
_zipClient = zipClient;
}
+ public event EventHandler PackageInstalling;
+
+ public event EventHandler PackageInstallationCompleted;
+
+ public event EventHandler PackageInstallationFailed;
+
+ public event EventHandler PackageInstallationCancelled;
+
+ ///
+ /// Occurs when a plugin is uninstalled.
+ ///
+ public event EventHandler> PluginUninstalled;
+
+ ///
+ /// Occurs when a plugin plugin is updated.
+ ///
+ public event EventHandler> PluginUpdated;
+
+ ///
+ /// Occurs when a plugin plugin is installed.
+ ///
+ public event EventHandler> PluginInstalled;
+
+ public IEnumerable CompletedInstallations => _completedInstallationsInternal;
+
///
/// Gets all available packages.
///
@@ -330,7 +334,7 @@ namespace Emby.Server.Implementations.Updates
var tuple = (installationInfo, innerCancellationTokenSource);
// Add it to the in-progress list
- lock (_currentInstallations)
+ lock (_currentInstallationsLock)
{
_currentInstallations.Add(tuple);
}
@@ -349,7 +353,7 @@ namespace Emby.Server.Implementations.Updates
{
await InstallPackageInternal(package, linkedToken).ConfigureAwait(false);
- lock (_currentInstallations)
+ lock (_currentInstallationsLock)
{
_currentInstallations.Remove(tuple);
}
@@ -360,7 +364,7 @@ namespace Emby.Server.Implementations.Updates
}
catch (OperationCanceledException)
{
- lock (_currentInstallations)
+ lock (_currentInstallationsLock)
{
_currentInstallations.Remove(tuple);
}
@@ -375,7 +379,7 @@ namespace Emby.Server.Implementations.Updates
{
_logger.LogError(ex, "Package installation failed");
- lock (_currentInstallations)
+ lock (_currentInstallationsLock)
{
_currentInstallations.Remove(tuple);
}
@@ -535,7 +539,7 @@ namespace Emby.Server.Implementations.Updates
///
public bool CancelInstallation(Guid id)
{
- lock (_currentInstallations)
+ lock (_currentInstallationsLock)
{
var install = _currentInstallations.Find(x => x.Item1.Id == id);
if (install == default((InstallationInfo, CancellationTokenSource)))
@@ -563,7 +567,7 @@ namespace Emby.Server.Implementations.Updates
{
if (dispose)
{
- lock (_currentInstallations)
+ lock (_currentInstallationsLock)
{
foreach (var tuple in _currentInstallations)
{
diff --git a/Jellyfin.Server/Jellyfin.Server.csproj b/Jellyfin.Server/Jellyfin.Server.csproj
index efdb75f98..4238d7fe3 100644
--- a/Jellyfin.Server/Jellyfin.Server.csproj
+++ b/Jellyfin.Server/Jellyfin.Server.csproj
@@ -9,8 +9,6 @@
-
- latest
true
@@ -25,8 +23,9 @@
-
+
+
@@ -35,8 +34,8 @@
-
-
+
+
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index cf3f6c2a4..ec98400c8 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj b/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj
index 264f31f3c..ad07fdd8e 100644
--- a/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj
+++ b/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj
@@ -18,7 +18,7 @@
-
+
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 3ed319a0d..bd4eeea18 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
index c7ecc59c9..ec160a848 100644
--- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj
+++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
@@ -11,8 +11,8 @@
-
-
+
+
@@ -28,5 +28,5 @@
latest
-
+
diff --git a/jellyfin.ruleset b/jellyfin.ruleset
index e259131b0..16d68567c 100644
--- a/jellyfin.ruleset
+++ b/jellyfin.ruleset
@@ -10,6 +10,8 @@
+
+