コード例 #1
0
 /// <summary>
 /// 释放资源
 /// </summary>
 public void Dispose()
 {
     if (Interlocked.Increment(ref isDisposed) == 1)
     {
         Interlocked.Exchange(ref currentStep, (int) physicalOld.step.Closing);
         if (isRefreshErrorLog) interlocked.CompareSetSleep1(ref logFileLock);
         else interlocked.CompareSetSleep0(ref logFileLock);
         try
         {
             //if (lastException == null) flushLog();
             if (dataRefresh != null)
             {
                 isRefreshErrorLog = true;
                 dataRefresh.CancelTimeOut();
                 dataRefresh = null;
                 isRefreshErrorLog = false;
             }
             try
             {
                 logFileWriter.Flush(true);
                 logFileWriter.Dispose();
             }
             catch (Exception error)
             {
                 lastException = error;
             }
             //logBufferIndex = 0;
             //Buffers.Push(ref logBuffer);
         }
         finally
         {
             logFileLock = 0;
         }
         Interlocked.Exchange(ref currentStep, (int) physicalOld.step.Closed);
         if (lastException != null) log.Error.Add(lastException, fileName, false);
     }
 }
コード例 #2
0
 /// <summary>
 /// 数据文件刷新结束
 /// </summary>
 /// <param name="dataRefresh">数据文件刷新结束</param>
 public void RefreshEnd(dataFileRefresh dataRefresh)
 {
     if (dataRefresh.Equals(this.dataRefresh))
     {
         bool isDeleteBakFile = false;
         Monitor.Enter(refreshLock);
         try
         {
             if (dataRefresh.Equals(this.dataRefresh))
             {
                 this.dataRefresh = null;
                 if (dataRefresh.LastException == null) isDeleteBakFile = true;
                 else
                 {
                     lastException = dataRefresh.LastException;
                     if (File.Exists(dataRefresh.BakFileName) && File.Exists(dataRefresh.BakLogFileName))
                     {
                         try
                         {
                             string fileName = path + this.fileName, errorFileName = fileName + ".error";
                             if (File.Exists(fileName))
                             {
                                 file.MoveBak(errorFileName);
                                 File.Move(fileName, errorFileName);
                             }
                             File.Move(dataRefresh.BakFileName, fileName);
                             isRefreshErrorLog = true;
                             interlocked.CompareSetSleep0(ref logFileLock);
                             try
                             {
                                 //flushLog();
                                 logFileWriter.Flush(true);
                                 logFileWriter.Dispose();
                                 if (logFileWriter.LastException == null)
                                 {
                                     string logFileName = path + this.logFileName,
                                         bakLogFileName = file.MoveBak(logFileName);
                                     File.Move(dataRefresh.BakLogFileName, logFileName);
                                     logFileWriter = new fileStreamWriter(logFileName, FileMode.Open,
                                         FileShare.Read, FileOptions.None, null);
                                     logFileWriter.WriteFile(bakLogFileName, dataRefresh.LogHeaderDataLength);
                                 }
                                 if (logFileWriter.LastException == null)
                                 {
                                     log.Default.Add(lastException, "数据文件已恢复 " + fileName, false);
                                     lastException = null;
                                 }
                                 else log.Error.Add(logFileWriter.LastException, null, false);
                             }
                             finally
                             {
                                 logFileLock = 0;
                                 isRefreshErrorLog = false;
                             }
                         }
                         catch (Exception error)
                         {
                             log.Error.Add(error, null, false);
                         }
                     }
                 }
             }
         }
         finally
         {
             Monitor.Exit(refreshLock);
             if (lastException != null) Dispose();
             if (isDeleteBakFile)
             {
                 try
                 {
                     if (File.Exists(dataRefresh.BakFileName)) File.Delete(dataRefresh.BakFileName);
                     if (File.Exists(dataRefresh.BakLogFileName)) File.Delete(dataRefresh.BakLogFileName);
                 }
                 catch (Exception error)
                 {
                     log.Error.Add(error, null, false);
                 }
             }
         }
     }
 }
コード例 #3
0
 ///// <summary>
 ///// 写入缓存
 ///// </summary>
 //private void flushLog()
 //{
 //    if (logBufferIndex != 0)
 //    {
 //        try
 //        {
 //            if (logFileWriter.UnsafeWrite(new memoryPool.pushSubArray { Value = subArray<byte>.Unsafe(logBuffer, 0, logBufferIndex), PushPool = Buffers.PushHandle }) >= 0)
 //            {
 //                logBuffer = null;
 //                logBufferIndex = 0;
 //                return;
 //            }
 //            lastException = logFileWriter.LastException;
 //        }
 //        catch (Exception error)
 //        {
 //            lastException = error;
 //        }
 //    }
 //}
 /// <summary>
 /// 获取数据文件刷新
 /// </summary>
 /// <param name="logHeaderData">日志文件标识</param>
 /// <returns>数据文件刷新,失败返回null</returns>
 public dataFileRefresh CreateRefresh(byte[] logHeaderData)
 {
     if (currentStep == (int) physicalOld.step.Waitting && this.dataRefresh == null)
     {
         string logFileName = path + this.logFileName;
         dataFileRefresh dataRefresh = new dataFileRefresh(this, logHeaderData.Length);
         Monitor.Enter(refreshLock);
         try
         {
             if (this.dataRefresh == null)
             {
                 interlocked.CompareSetSleep0(ref logFileLock);
                 try
                 {
                     //flushLog();
                     logFileWriter.Flush(true);
                     logFileWriter.Dispose();
                     logFileWriter = null;
                     dataRefresh.BakLogFileName = fastCSharp.io.file.MoveBak(logFileName);
                     logFileWriter = new fileStreamWriter(logFileName, FileMode.CreateNew, FileShare.Read,
                         FileOptions.None, null);
                     logFileWriter.UnsafeWrite(logHeaderData, 0, logHeaderData.Length);
                 }
                 finally
                 {
                     logFileLock = 0;
                 }
                 this.dataRefresh = dataRefresh;
             }
         }
         catch (Exception error)
         {
             lastException = error;
             Dispose();
         }
         finally
         {
             Monitor.Exit(refreshLock);
         }
         if (dataRefresh.Equals(this.dataRefresh)) return dataRefresh;
         dataRefresh.Dispose();
     }
     return null;
 }