OSDN Git Service

RAD-402: Don't report crash when marker file from another running instaance is found
authorLatif Khalifa <latifer@streamgrid.net>
Sat, 30 Mar 2013 14:03:18 +0000 (15:03 +0100)
committerLatif Khalifa <latifer@streamgrid.net>
Sat, 30 Mar 2013 14:03:18 +0000 (15:03 +0100)
Radegast/Core/RadegastInstance.cs
Radegast/Netcom/RadegastNetcom/NetCom.cs

index f04b18a..0a5ee61 100644 (file)
@@ -680,9 +680,36 @@ namespace Radegast
                 client);
         }
 
+        #region Crash reporting
+        FileStream MarkerLock = null;
+
+        public bool AnotherInstanceRunning()
+        {
+            // We have successfuly obtained lock
+            if (MarkerLock != null && MarkerLock.CanWrite)
+            {
+                Logger.Log("No other instances detected, marker file already locked", Helpers.LogLevel.Debug);
+                return false;
+            }
+
+            try
+            {
+                MarkerLock = new FileStream(CrashMarkerFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
+                Logger.Log(string.Format("Successfully created and locked marker file {0}", CrashMarkerFileName), Helpers.LogLevel.Debug);
+                return false;
+            }
+            catch (Exception ex)
+            {
+                MarkerLock = null;
+                Logger.Log(string.Format("Another instance detected, marker fils {0} locked", CrashMarkerFileName), Helpers.LogLevel.Debug);
+                return true;
+            }
+        }
+
         public LastExecStatus GetLastExecStatus()
         {
-            if (File.Exists(CrashMarkerFileName))
+            // Crash marker file found and is not locked by us
+            if (File.Exists(CrashMarkerFileName) && MarkerLock == null)
             {
                 Logger.Log(string.Format("Found crash marker file {0}", CrashMarkerFileName), Helpers.LogLevel.Debug);
                 return LastExecStatus.OtherCrash;
@@ -709,11 +736,20 @@ namespace Radegast
             Logger.Log(string.Format("Marking end of execution run, deleting file: {0}", CrashMarkerFileName), Helpers.LogLevel.Debug);
             try
             {
+                if (MarkerLock != null)
+                {
+                    MarkerLock.Close();
+                    MarkerLock.Dispose();
+                    MarkerLock = null;
+                }
+
                 File.Delete(CrashMarkerFileName);
             }
             catch { }
         }
 
+        #endregion Crash reporting
+
     }
 
     #region Event classes
index e6265d6..75988f0 100644 (file)
@@ -243,7 +243,7 @@ namespace Radegast.Netcom
 
             // Report crashes only once and not on relogs/reconnects
             LastExecStatus execStatus = instance.GetLastExecStatus();
-            if (execStatus != LastExecStatus.Normal && (!instance.ReportedCrash))
+            if (!instance.AnotherInstanceRunning() && execStatus != LastExecStatus.Normal && (!instance.ReportedCrash))
             {
                 instance.ReportedCrash = true;
                 loginOptions.LastExecEvent = execStatus;