/// <summary> /// 数据缓冲区 /// </summary> /// <param name="node"></param> /// <param name="onReturn"></param> /// <param name="message"></param> internal Buffer(Node node, AutoCSer.Net.TcpServer.ServerCallback <ReturnParameter> onReturn, ref DistributionMessageItem message) { Node = node; this.onReturn = onReturn; Data = message.Data; BufferCount = message.OnAppendFile(); }
internal int DeSerializeBuffer(byte *read, byte[] buffer, int startIndex) { int size = Data.DeSerializeBuffer(read, buffer, startIndex); BufferCount = Data.CopyToMessageQueueBufferCount(); return(size); }
internal void Set(Buffer buffer) { Data = buffer.Data; BufferCount = buffer.BufferCount; Data.ReturnType = ReturnType.Success; buffer.BufferCount = null; }
internal AutoCSer.CacheServer.BufferCount OnAppendFile() { AutoCSer.CacheServer.BufferCount bufferCount = BufferCount; State = DistributionMessageState.AppendFile; BufferCount = null; return(bufferCount); }
/// <summary> /// 数据缓冲区 /// </summary> /// <param name="node"></param> /// <param name="onReturn"></param> /// <param name="message"></param> internal Buffer(Node node, Func <AutoCSer.Net.TcpServer.ReturnValue <ReturnParameter>, bool> onReturn, ref DistributionMessageItem message) { Node = node; this.onReturn = onReturn; Data = message.Data; BufferCount = message.OnAppendFile(); }
internal void FreeBuffer() { if (BufferCount != null) { BufferCount.Free(); BufferCount = null; } }
/// <summary> /// 数据缓冲区 /// </summary> /// <param name="node"></param> /// <param name="parser"></param> internal Buffer(Node node, ref OperationParameter.NodeParser parser) { Data = parser.ValueData; onReturn = parser.OnReturn; Node = node; BufferCount = Data.CopyToMessageQueueBufferCount(); parser.OnReturn = null; }
/// <summary> /// 消息队列数据缓冲区计数 /// </summary> /// <param name="buffer">消息队列数据缓冲区</param> internal BufferCount(Buffer buffer) { data = buffer.Data; count = buffer.BufferCount; Identity = buffer.Identity; data.ReturnType = ReturnType.Success; isBufferCount = 0; buffer.BufferCount = null; }
/// <summary> /// 获取数据分配缓冲区 /// </summary> /// <param name="data"></param> /// <returns></returns> internal static AutoCSer.CacheServer.BufferCount GetBufferCount(ref SubArray <byte> data) { if (data.Length > (int)AutoCSer.CacheServer.BufferCount.BufferSize) { data.Set(new byte[data.Length], 0, data.Length); return(null); } AutoCSer.CacheServer.BufferCount buffer; while (System.Threading.Interlocked.CompareExchange(ref bufferCountLock, 1, 0) != 0) { AutoCSer.Threading.ThreadYield.Yield(AutoCSer.Threading.ThreadYield.Type.MessageQueueGetBuffer); } buffer = bufferCount.Get(ref data); bufferCountLock = 0; if (buffer == null) { Monitor.Enter(newBufferCountLock); AutoCSer.CacheServer.BufferCount oldBufferCount = bufferCount; try { while (System.Threading.Interlocked.CompareExchange(ref bufferCountLock, 1, 0) != 0) { AutoCSer.Threading.ThreadYield.Yield(AutoCSer.Threading.ThreadYield.Type.MessageQueueGetBuffer); } buffer = oldBufferCount.Get(ref data); bufferCountLock = 0; if (buffer == null) { AutoCSer.CacheServer.BufferCount newBufferCount = new AutoCSer.CacheServer.BufferCount(); buffer = newBufferCount.Get(ref data); if (newBufferCount.Size > oldBufferCount.Size) { bufferCount = newBufferCount; oldBufferCount.Free(); } else { newBufferCount.Free(); } } } finally { Monitor.Exit(newBufferCountLock); } } return(buffer); }
/// <summary> /// 获取数据分配缓冲区 /// </summary> /// <param name="data"></param> /// <returns></returns> internal static AutoCSer.CacheServer.BufferCount GetBufferCount(ref SubArray <byte> data) { if (data.Length > (int)AutoCSer.CacheServer.BufferCount.BufferSize) { data.Set(new byte[data.Length], 0, data.Length); return(null); } AutoCSer.CacheServer.BufferCount buffer; bufferCountLock.EnterYield(); buffer = bufferCount.Get(ref data); bufferCountLock.Exit(); if (buffer == null) { Monitor.Enter(newBufferCountLock); AutoCSer.CacheServer.BufferCount oldBufferCount = bufferCount; try { bufferCountLock.EnterYield(); buffer = oldBufferCount.Get(ref data); bufferCountLock.Exit(); if (buffer == null) { AutoCSer.CacheServer.BufferCount newBufferCount = new AutoCSer.CacheServer.BufferCount(); buffer = newBufferCount.Get(ref data); if (newBufferCount.Size > oldBufferCount.Size) { bufferCount = newBufferCount; oldBufferCount.Free(); } else { newBufferCount.Free(); } } } finally { Monitor.Exit(newBufferCountLock); } } return(buffer); }
internal void Set(ref BufferCount bufferCount) { BufferCount = bufferCount.Get(out Data); }