示例#1
0
        /// <summary>
        /// 写文件错误
        /// </summary>
        /// <param name="error">错误异常</param>
        private void error(Exception error)
        {
            if (isLog)
            {
                log.Default.Add(error, null, false);
            }
            LastException = error;
            Monitor.Enter(bufferLock);
            byte isDisposed = this.isDisposed;

            currentIndex     = startIndex;
            isWritting       = 0;
            fileBufferLength = fileLength = 0;
            this.isDisposed  = 1;
            Monitor.Exit(bufferLock);
            dispose();
            pub.Dispose(ref fileStream);
            list <memoryPool.pushSubArray> buffers = null;

            Interlocked.Exchange(ref buffers, this.buffers);
            try
            {
                if (buffers != null && buffers.length != 0)
                {
                    memoryPool.pushSubArray[] dataArray = buffers.array;
                    for (int index = buffers.length; index != 0; dataArray[--index].Push())
                    {
                        ;
                    }
                }
            }
            finally
            {
                currentBuffers = null;
                memoryPool.Push(ref buffer);
                if (isDisposed == 0)
                {
                    flushWait.Set();
                    flushWait.Close();
                }
            }
        }
 /// <summary>
 /// 获取压缩数据
 /// </summary>
 /// <param name="data">数据</param>
 /// <returns>压缩数据,失败返回null</returns>
 internal static subArray<byte> GetCompress(subArray<byte> data, memoryPool memoryPool = null, int seek = 0)
 {
     if (data.Count > GZipSize)
     {
         subArray<byte> compressData = stream.GZip.GetCompress(data.Array, data.StartIndex, data.Count, seek, memoryPool);
         if (compressData.Count != 0)
         {
             if (compressData.Count + GZipSize < data.Count) return compressData;
             if (memoryPool != null) memoryPool.Push(ref compressData.array);
         }
     }
     return default(subArray<byte>);
 }
        /// <summary>
        /// 写入日志
        /// </summary>
        /// <param name="data">日志数据</param>
        /// <returns>是否成功写入缓冲区</returns>
        public unsafe bool AppendLog(memoryPool.pushSubArray data)
        {
            if (currentStep == (int) physicalOld.step.Waitting)
            {
                byte isCopy = 0, isLog = 0;
                if (Interlocked.CompareExchange(ref logFileLock, 1, 0) != 0)
                {
                    do
                    {
                        Thread.Sleep(0);
                        if (Interlocked.CompareExchange(ref logFileLock, 1, 0) == 0) break;
                        if (isRefreshErrorLog) Thread.Sleep(1);
                        else Thread.Sleep(0);
                    } while (Interlocked.CompareExchange(ref logFileLock, 1, 0) != 0);
                }
                try
                {
                    if (logFileWriter.UnsafeWrite(data) >= 0) return true;
                    lastException = logFileWriter.LastException;

                    //subArray<byte> dataArray = data.Value;
                    //int length = logBufferIndex + dataArray.Length;
                    //if (length <= Buffers.Size)
                    //{
                    //    if (logBuffer == null) logBuffer = Buffers.Get();
                    //    fixed (byte* dataFixed = dataArray.Array, bufferFixed = logBuffer)
                    //    {
                    //        unsafer.memory.Copy(dataFixed + dataArray.StartIndex, bufferFixed + logBufferIndex, dataArray.Length);
                    //    }
                    //    logBufferIndex = length;
                    //    isCopy = isLog = 1;
                    //}
                    //else if (logBufferIndex == 0)
                    //{
                    //    if (logFileWriter.UnsafeWrite(data) >= 0) isLog = 1;
                    //    else lastException = logFileWriter.LastException;
                    //}
                    //else
                    //{
                    //    fixed (byte* dataFixed = dataArray.Array, bufferFixed = logBuffer)
                    //    {
                    //        unsafer.memory.Copy(dataFixed + dataArray.StartIndex, bufferFixed + logBufferIndex, length = Buffers.Size - logBufferIndex);
                    //        dataArray.UnsafeSet(dataArray.StartIndex + length, dataArray.Length - length);
                    //        if (logFileWriter.UnsafeWrite(new memoryPool.pushSubArray { Value = subArray<byte>.Unsafe(logBuffer, 0, Buffers.Size), PushPool = Buffers.PushHandle }) >= 0)
                    //        {
                    //            if (dataArray.Length <= Buffers.Size)
                    //            {
                    //                fixed (byte* newBufferFixed = logBuffer = Buffers.Get())
                    //                {
                    //                    unsafer.memory.Copy(dataFixed + dataArray.StartIndex, newBufferFixed, logBufferIndex = dataArray.Length);
                    //                }
                    //                isCopy = isLog = 1;
                    //            }
                    //            else if (logFileWriter.UnsafeWrite(data) >= 0)
                    //            {
                    //                logBufferIndex = 0;
                    //                logBuffer = null;
                    //                isLog = 1;
                    //            }
                    //            else lastException = logFileWriter.LastException;
                    //        }
                    //        else
                    //        {
                    //            isCopy = 1;
                    //            lastException = logFileWriter.LastException;
                    //        }
                    //    }
                    //}
                }
                catch (Exception error)
                {
                    lastException = error;
                }
                finally
                {
                    logFileLock = 0;
                }
                if (isCopy != 0) data.Push();
                if (isLog != 0) return true;
                Dispose();
            }
            return false;
        }
 /// <summary>
 /// 写入数据
 /// </summary>
 /// <param name="data">数据</param>
 /// <returns>写入位置,失败返回-1</returns>
 internal long UnsafeWrite(memoryPool.pushSubArray data)
 {
     flushWait.Reset();
     subArray<byte> dataArray = data.Value;
     interlocked.NoCheckCompareSetSleep0(ref bufferLock);
     if (isDisposed == 0)
     {
         long fileBufferLength = this.fileBufferLength;
         this.fileBufferLength += dataArray.Count;
         if (isWritting == 0)
         {
             int length = currentIndex + dataArray.Count;
             if (length < bufferLength && flushCount == 0)
             {
                 Buffer.BlockCopy(dataArray.array, dataArray.StartIndex, buffer, currentIndex, dataArray.Count);
                 checkFlushTime = date.NowSecond.AddTicks(checkFlushTicks);
                 currentIndex = length;
                 bufferIndex = this.fileBufferLength;
                 bufferLock = 0;
                 data.Push();
                 setCheckFlush();
             }
             else
             {
                 buffers.array[0] = data;
                 buffers.Unsafer.AddLength(1);
                 bufferSize += dataArray.Count;
                 isFlush = 0;
                 isWritting = 1;
                 isCopyBuffer = 0;
                 bufferLock = 0;
                 threadPool.TinyPool.FastStart(writeFileHandle, null, null);
             }
         }
         else
         {
             try
             {
                 buffers.Add(data);
                 bufferSize += dataArray.Count;
                 isCopyBuffer = 0;
             }
             finally { bufferLock = 0; }
         }
         return fileBufferLength;
     }
     bufferLock = 0;
     data.Push();
     return -1;
 }
示例#5
0
            /// <summary>
            /// 开始读取文件
            /// </summary>
            public unsafe void Read()
            {
                do
                {
                    int readSize = index.Size + sizeof(int);
                    try
                    {
                        if (FileStream.isDisposed == 0)
                        {
                            buffer = (memoryPool = memoryPool.GetOrCreate(readSize)).Get();
                            FileStream fileReader = FileStream.fileReader;
                            long       offset     = fileReader.Position - index.Index;
                            if (offset >= 0 || -offset < index.Index)
                            {
                                fileReader.Seek(offset, SeekOrigin.Current);
                            }
                            else
                            {
                                fileReader.Seek(index.Index, SeekOrigin.Begin);
                            }
                            if (fileReader.Read(buffer, 0, readSize) == readSize)
                            {
                                fixed(byte *bufferFixed = buffer)
                                {
                                    if (*(int *)bufferFixed == index.Size)
                                    {
                                        readSize = index.Size;
                                    }
                                    else
                                    {
                                        log.Default.Add(FileStream.FileName + " index[" + index.Index.toString() + "] size[" + (*(int *)bufferFixed).toString() + "]<>" + index.Size.toString(), new System.Diagnostics.StackFrame(), false);
                                    }
                                }
                            }
                            else
                            {
                                readSize = 0;
                            }
                        }
                    }
                    catch (Exception error)
                    {
                        log.Default.Add(error, null, false);
                    }
                    Func <fastCSharp.net.returnValue <fastCSharp.code.cSharp.tcpBase.subByteArrayEvent>, bool> onReaded = this.onReaded;
                    if (readSize == index.Size)
                    {
                        if (onReaded(new fastCSharp.code.cSharp.tcpBase.subByteArrayEvent {
                            Buffer = subArray <byte> .Unsafe(buffer, sizeof(int), index.Size), SerializeEvent = memoryPool
                        }))
                        {
                            buffer = null;
                        }
                        else
                        {
                            memoryPool.Push(ref buffer);
                        }
                    }
                    else
                    {
                        onReaded(default(fastCSharp.code.cSharp.tcpBase.subByteArrayEvent));
                        if (memoryPool != null)
                        {
                            memoryPool.Push(ref buffer);
                        }
                    }
                    reader next = FileStream.next(this);
                    if (next == null)
                    {
                        FileStream = null;
                        onReaded   = null;
                        memoryPool = null;
                        typePool <reader> .PushNotNull(this);

                        return;
                    }
                    onReaded      = next.onReaded;
                    index         = next.index;
                    next.onReaded = null;
                    typePool <reader> .PushNotNull(next);
                }while (true);
            }
 /// <summary>
 /// 获取解压数据
 /// </summary>
 /// <returns>解压数据</returns>
 public unsafe subArray<byte> Get(memoryPool memoryPool)
 {
     if (memoryPool == null)
     {
         pointer data = fastCSharp.unmanagedPool.StreamBuffers.Get();
         try
         {
             using (dataStream = new unmanagedStream(data.Byte, fastCSharp.unmanagedPool.StreamBuffers.Size))
             {
                 get();
                 return new subArray<byte>(dataStream.GetArray());
             }
         }
         finally { fastCSharp.unmanagedPool.StreamBuffers.Push(ref data); }
     }
     else
     {
         byte[] data = memoryPool.Get();
         try
         {
             fixed (byte* dataFixed = data)
             {
                 using (dataStream = new unmanagedStream(dataFixed, data.Length))
                 {
                     get();
                     if (dataStream.Data == dataFixed)
                     {
                         byte[] buffer = data;
                         data = null;
                         return subArray<byte>.Unsafe(buffer, 0, dataStream.Length);
                     }
                     return new subArray<byte>(dataStream.GetArray());
                 }
             }
         }
         finally { memoryPool.Push(ref data); }
     }
 }
 /// <summary>
 /// 压缩数据
 /// </summary>
 /// <param name="data">原始数据</param>
 /// <param name="startIndex">起始位置</param>
 /// <param name="count">压缩字节数</param>
 /// <param name="seek">起始位置</param>
 /// <returns>压缩后的数据,失败返回null</returns>
 internal subArray<byte> GetCompressUnsafe(byte[] data, int startIndex, int count, int seek = 0, memoryPool memoryPool = null)
 {
     int length = count + seek;
     if (memoryPool == null)
     {
         using (MemoryStream dataStream = new MemoryStream())
         {
             if (seek != 0) dataStream.Seek(seek, SeekOrigin.Begin);
             using (Stream compressStream = getStream(dataStream))
             {
                 compressStream.Write(data, startIndex, count);
             }
             if (dataStream.Position < length)
             {
                 return subArray<byte>.Unsafe(dataStream.GetBuffer(), seek, (int)dataStream.Position - seek);
             }
         }
     }
     else
     {
         byte[] buffer = memoryPool.Get();
         try
         {
             using (MemoryStream dataStream = memoryStream.Get(buffer))
             {
                 if (seek != 0) dataStream.Seek(seek, SeekOrigin.Begin);
                 using (Stream compressStream = getStream(dataStream))
                 {
                     compressStream.Write(data, startIndex, count);
                 }
                 if (dataStream.Position < length)
                 {
                     byte[] streamBuffer = dataStream.GetBuffer();
                     if (streamBuffer == buffer) buffer = null;
                     return subArray<byte>.Unsafe(streamBuffer, seek, (int)dataStream.Position - seek);
                 }
             }
         }
         catch (Exception error)
         {
             log.Error.Add(error, null, false);
         }
         finally
         {
             memoryPool.Push(ref buffer);
         }
     }
     return default(subArray<byte>);
 }