/// <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); } }
/// <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); } } } } }
///// <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; }