浏览代码

remove mutex from mono startup

Luke Pulverenti 11 年之前
父节点
当前提交
9663252d10

+ 4 - 4
MediaBrowser.Mono.userprefs

@@ -1,13 +1,13 @@
 <Properties>
   <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|x86" />
-  <MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.ServerApplication\ApplicationHost.cs">
+  <MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.Server.Mono\Program.cs">
     <Files>
       <File FileName="MediaBrowser.Server.Implementations\HttpServer\HttpServer.cs" Line="1" Column="1" />
       <File FileName="MediaBrowser.Server.Mono\FFMpeg\FFMpegDownloader.cs" Line="1" Column="1" />
-      <File FileName="MediaBrowser.Server.Mono\Networking\NetworkManager.cs" Line="28" Column="9" />
+      <File FileName="MediaBrowser.Server.Mono\Networking\NetworkManager.cs" Line="1" Column="1" />
       <File FileName="MediaBrowser.ServerApplication\ApplicationHost.cs" Line="525" Column="50" />
-      <File FileName="MediaBrowser.Server.Mono\Native\NativeApp.cs" Line="24" Column="4" />
-      <File FileName="MediaBrowser.Server.Mono\Program.cs" Line="105" Column="17" />
+      <File FileName="MediaBrowser.Server.Mono\Native\NativeApp.cs" Line="1" Column="1" />
+      <File FileName="MediaBrowser.Server.Mono\Program.cs" Line="250" Column="64" />
     </Files>
   </MonoDevelop.Ide.Workbench>
   <MonoDevelop.Ide.DebuggingService.Breakpoints>

+ 13 - 25
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -44,13 +44,11 @@ namespace MediaBrowser.Server.Implementations.Session
         /// <value>The configuration manager.</value>
         private readonly IServerConfigurationManager _configurationManager;
 
-        private object _sessionLock = new object();
-
         /// <summary>
         /// The _active connections
         /// </summary>
-        private readonly Dictionary<string, SessionInfo> _activeConnections =
-            new Dictionary<string, SessionInfo>(StringComparer.OrdinalIgnoreCase);
+        private readonly ConcurrentDictionary<string, SessionInfo> _activeConnections =
+            new ConcurrentDictionary<string, SessionInfo>(StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
         /// Occurs when [playback start].
@@ -86,7 +84,7 @@ namespace MediaBrowser.Server.Implementations.Session
         /// <value>All connections.</value>
         public IEnumerable<SessionInfo> Sessions
         {
-            get { return _activeConnections.Values.ToList().OrderByDescending(c => c.LastActivityDate); }
+            get { return _activeConnections.Values.OrderByDescending(c => c.LastActivityDate).ToList(); }
         }
 
         /// <summary>
@@ -195,28 +193,18 @@ namespace MediaBrowser.Server.Implementations.Session
         {
             var key = clientType + deviceId + appVersion;
 
-            lock (_sessionLock)
+            var connection = _activeConnections.GetOrAdd(key, keyName => new SessionInfo
             {
-                SessionInfo connection;
+                Client = clientType,
+                DeviceId = deviceId,
+                ApplicationVersion = appVersion,
+                Id = Guid.NewGuid()
+            });
 
-                if (!_activeConnections.TryGetValue(key, out connection))
-                {
-                    connection = new SessionInfo
-                        {
-                            Client = clientType,
-                            DeviceId = deviceId,
-                            ApplicationVersion = appVersion,
-                            Id = Guid.NewGuid()
-                        };
-
-                    _activeConnections[key] = connection;
-                }
+            connection.DeviceName = deviceName;
+            connection.User = user;
 
-                connection.DeviceName = deviceName;
-                connection.User = user;
-
-                return connection;
-            }
+            return connection;
         }
 
         /// <summary>
@@ -589,4 +577,4 @@ namespace MediaBrowser.Server.Implementations.Session
             return Task.WhenAll(tasks);
         }
     }
-}
+}

+ 3 - 50
MediaBrowser.Server.Mono/Program.cs

@@ -21,8 +21,6 @@ namespace MediaBrowser.Server.Mono
 	{
 		private static ApplicationHost _appHost;
 
-		private static Mutex _singleInstanceMutex;
-
 		private static ILogger _logger;
 
 		private static MainWindow _mainWindow;
@@ -45,18 +43,6 @@ namespace MediaBrowser.Server.Mono
 
 			AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
 
-			bool createdNew;
-
-			//_singleInstanceMutex = new Mutex(true, @"Local\" + runningPath, out createdNew);
-			createdNew = true;
-
-			if (!createdNew)
-			{
-				_singleInstanceMutex = null;
-				logger.Info("Shutting down because another instance of Media Browser Server is already running.");
-				return;
-			}
-
 			if (PerformUpdateIfNeeded(appPaths, logger))
 			{
 				logger.Info("Exiting to perform application update.");
@@ -71,8 +57,6 @@ namespace MediaBrowser.Server.Mono
 			{
 				logger.Info("Shutting down");
 
-				ReleaseMutex(logger);
-
 				_appHost.Dispose();
 			}
 		}
@@ -230,24 +214,6 @@ namespace MediaBrowser.Server.Mono
 			}
 		}
 
-		/// <summary>
-		/// Releases the mutex.
-		/// </summary>
-		internal static void ReleaseMutex(ILogger logger)
-		{
-			if (_singleInstanceMutex == null)
-			{
-				return;
-			}
-
-			logger.Debug("Releasing mutex");
-
-			_singleInstanceMutex.ReleaseMutex();
-			_singleInstanceMutex.Close();
-			_singleInstanceMutex.Dispose();
-			_singleInstanceMutex = null;
-		}
-
 		/// <summary>
 		/// Performs the update if needed.
 		/// </summary>
@@ -278,24 +244,11 @@ namespace MediaBrowser.Server.Mono
 
 		public static void Restart()
 		{
-			// Second instance will start first, so release the mutex and dispose the http server ahead of time
-			ReleaseMutex (_logger);
-
+			// Second instance will start first, so dispose so that the http ports will be available to the new instance
 			_appHost.Dispose();
 
-			if (trayIcon != null) {
-				trayIcon.Visible = false;
-				trayIcon.Dispose ();
-				trayIcon = null;
-			}
-
-			if (_mainWindow != null) {
-				_mainWindow.HideAll ();
-				_mainWindow.Dispose ();
-				_mainWindow = null;
-			}
-
-			Application.Quit ();
+			// Right now this method will just shutdown, but not restart
+			Shutdown ();
 		}
 	}
 }