AutoCSer.Net.TcpServer.ReturnValue <ulong> append(AutoCSer.DiskBlock.AppendBuffer buffer) { AutoCSer.Net.TcpServer.AutoWaitReturnValue <TcpInternalServer._p2> _wait_ = AutoCSer.Net.TcpServer.AutoWaitReturnValue <TcpInternalServer._p2> .Pop(); try { AutoCSer.Net.TcpInternalServer.ClientSocketSender _socket_ = _TcpClient_.Sender; if (_socket_ != null) { TcpInternalServer._p1 _inputParameter_ = new TcpInternalServer._p1 { p0 = buffer, }; TcpInternalServer._p2 _outputParameter_ = new TcpInternalServer._p2 { }; AutoCSer.Net.TcpServer.ReturnType _returnType_ = _socket_.WaitGet <TcpInternalServer._p1, TcpInternalServer._p2>(_c0, ref _wait_, ref _inputParameter_, ref _outputParameter_); return(new AutoCSer.Net.TcpServer.ReturnValue <ulong> { Type = _returnType_, Value = _outputParameter_.Return }); } } finally { if (_wait_ != null) { AutoCSer.Net.TcpServer.AutoWaitReturnValue <TcpInternalServer._p2> .PushNotNull(_wait_); } } return(new AutoCSer.Net.TcpServer.ReturnValue <ulong> { Type = AutoCSer.Net.TcpServer.ReturnType.ClientException }); }
/// <summary> /// 添加数据 /// </summary> /// <param name="buffer">数据</param> /// <param name="onWrite">添加数据回调委托</param> internal WriteRequest(ref AppendBuffer buffer, Func <AutoCSer.Net.TcpServer.ReturnValue <ulong>, bool> onWrite) { this.OnWrite = onWrite; SubBuffer.Pool.GetBuffer(ref Buffer, (Size = buffer.Buffer.Length) + sizeof(int)); System.Buffer.BlockCopy(buffer.Buffer.Array, buffer.Buffer.Start, Buffer.Buffer, Buffer.StartIndex + sizeof(int), Size); fixed(byte *bufferFixed = Buffer.Buffer) * (int *)(bufferFixed + Buffer.StartIndex) = Size; }
private void append(AppendBuffer buffer, Func <AutoCSer.Net.TcpServer.ReturnValue <ulong>, bool> onWrite) { if (buffer.CheckBlockIndex(index)) { block.Append(ref buffer, onWrite); } else { onWrite(0); } }
private void append(AppendBuffer buffer, AutoCSer.Net.TcpServer.ServerCallback <ulong> onWrite) { if (buffer.CheckBlockIndex(index)) { block.Append(ref buffer, onWrite); } else { onWrite.Callback(0); } }
/// <summary> /// 添加数据 /// </summary> /// <param name="buffer">数据</param> /// <param name="onWrite">添加数据回调委托</param> void IBlock.Append(ref AppendBuffer buffer, AutoCSer.Net.TcpServer.ServerCallback <ulong> onWrite) { if (isDisposed == 0) { ulong index = buffer.Index & Server.MaxIndex; if (index == 0 || (long)index + (buffer.Buffer.Length + sizeof(int)) > fileLength) { if (writeRequests.IsPushHead(new WriteRequest(ref buffer, onWrite))) { writeWait.Set(); } if (isDisposed != 0) { for (WriteRequest head = writeRequests.GetClear(); head != null; head = head.Error()) { ; } } } else { ReadRequest readRequest = new ReadRequest { Index = (long)index, Size = buffer.Buffer.Length }; readRequest.WriteRequest = new FileWriteRequest(ref buffer, onWrite, this); if (readRequests.IsPushHead(readRequest)) { readWait.Set(); } if (isDisposed != 0) { for (ReadRequest head = readRequests.GetClear(); head != null; head = head.Error()) { ; } for (WriteRequest head = writeRequests.GetClear(); head != null; head = head.Error()) { ; } } } } else { onWrite.Callback(0); } }
/// <summary> /// 设置远程对象 /// </summary> /// <param name="value"></param> /// <param name="blockIndex">磁盘块编号</param> /// <param name="bufferSize">序列化缓冲区大小</param> /// <returns></returns> public async Task <bool> SetAsync(valueType value, int blockIndex, SubBuffer.Size bufferSize = SubBuffer.Size.Kilobyte4) { if (value == null) { SetNull(); return(true); } Server.TcpInternalClient client = ClientPool.Get(blockIndex); if (client != null) { BinarySerialize.Serializer serializer = BinarySerialize.Serializer.YieldPool.Default.Pop() ?? new BinarySerialize.Serializer(); SubBuffer.PoolBufferFull buffer = default(SubBuffer.PoolBufferFull); SubBuffer.Pool.GetPool(bufferSize).Get(ref buffer); try { int size; AppendBuffer appendBuffer = getAppendBuffer(ref value, serializer, ref buffer, out size); appendBuffer.BlockIndex = (ushort)blockIndex; AutoCSer.Net.TcpServer.ReturnValue <ulong> index = await client.appendAwaiter(appendBuffer); if (index.Type == Net.TcpServer.ReturnType.Success && index.Value != 0) { Index = index.Value; Size = size; value = Value; state = MemberState.Remote; return(true); } } finally { buffer.Free(); serializer.Free(); } } return(false); }
AutoCSer.Net.TcpServer.AwaiterBox <ulong> appendAwaiter(AutoCSer.DiskBlock.AppendBuffer buffer) { AutoCSer.Net.TcpServer.AwaiterBox <ulong> _awaiter_ = new AutoCSer.Net.TcpServer.AwaiterBox <ulong>(); AutoCSer.Net.TcpInternalServer.ClientSocketSender _socket_ = _TcpClient_.Sender; if (_socket_ != null) { TcpInternalServer._p1 _inputParameter_ = new TcpInternalServer._p1 { p0 = buffer, }; AutoCSer.Net.TcpServer.ReturnType _returnType_; AutoCSer.Net.TcpServer.AwaiterReturnValueBox <ulong> _outputParameter_ = default(AutoCSer.Net.TcpServer.AwaiterReturnValueBox <ulong>); _returnType_ = _socket_.GetAwaiter <TcpInternalServer._p1, AutoCSer.Net.TcpServer.AwaiterReturnValueBox <ulong> >(_a0, _awaiter_, ref _inputParameter_, ref _outputParameter_); if (_returnType_ != AutoCSer.Net.TcpServer.ReturnType.Success) { _awaiter_.Call(_returnType_); } } else { _awaiter_.Call(AutoCSer.Net.TcpServer.ReturnType.ClientException); } return(_awaiter_); }
/// <summary> /// 添加数据 /// </summary> /// <param name="buffer">数据</param> /// <param name="onWrite">添加数据回调委托</param> /// <param name="file">文件块</param> internal FileWriteRequest(ref AppendBuffer buffer, Func <AutoCSer.Net.TcpServer.ReturnValue <ulong>, bool> onWrite, File file) : base(ref buffer, onWrite) { this.file = file; Index = buffer.Index; }
/// <summary> /// 添加数据 /// </summary> /// <param name="buffer">数据</param> /// <param name="onWrite">添加数据回调委托</param> /// <param name="file">文件块</param> internal FileWriteRequest(ref AppendBuffer buffer, AutoCSer.Net.TcpServer.ServerCallback <ulong> onWrite, File file) : base(ref buffer, onWrite) { this.file = file; Index = buffer.Index; }