public int Send(NetworkConnection id, DataStreamWriter strm) { unsafe { return(Send(id, (IntPtr)strm.GetUnsafeReadOnlyPtr(), strm.Length)); } }
public unsafe int Send(NetworkConnection id, DataStreamWriter strm) { if (strm.IsCreated && strm.Length > 0) { return(Send(id, (IntPtr)strm.GetUnsafeReadOnlyPtr(), strm.Length)); } return(0); }
public DataStreamReader(DataStreamWriter strm, int offset, int length) { #if ENABLE_UNITY_COLLECTIONS_CHECKS if (offset + length > strm.Length) { throw new System.ArgumentOutOfRangeException(); } m_Safety = strm.m_Safety; AtomicSafetyHandle.UseSecondaryVersion(ref m_Safety); AtomicSafetyHandle.SetAllowSecondaryVersionWriting(m_Safety, false); #endif m_bufferPtr = strm.GetUnsafeReadOnlyPtr() + offset; m_Length = length; }
public DataStreamReader(DataStreamWriter writer, int offset, int length) { #if ENABLE_UNITY_COLLECTIONS_CHECKS if (offset + length > writer.Length) { throw new System.ArgumentOutOfRangeException(); } m_Safety = writer.m_Safety; AtomicSafetyHandle.UseSecondaryVersion(ref m_Safety); AtomicSafetyHandle.SetAllowSecondaryVersionWriting(m_Safety, false); #endif m_bufferPtr = writer.GetUnsafeReadOnlyPtr() + offset; m_Length = length; uint test = 1; unsafe { byte *test_b = (byte *)&test; IsLittleEndian = test_b[0] == 1; } }
internal unsafe void ProcessPipelineSend <T>(T driver, int startStage, NetworkPipeline pipeline, NetworkConnection connection, NativeSlice <byte> payloadBuffer, NativeList <UpdatePipeline> currentUpdates) where T : struct, INetworkPipelineSender { NetworkPipelineContext ctx = default(NetworkPipelineContext); ctx.timestamp = m_timestamp[0]; var p = m_Pipelines[pipeline.Id - 1]; var connectionId = connection.m_NetworkId; var resumeQ = new NativeList <int>(16, Allocator.Temp); int resumeQStart = 0; ctx.header = new DataStreamWriter(p.headerCapacity, Allocator.Temp); var inboundBuffer = default(InboundBufferVec); inboundBuffer.buffer1 = payloadBuffer; var prevHeader = new DataStreamWriter(p.headerCapacity, Allocator.Temp); while (true) { int internalBufferOffset = p.sendBufferOffset + sizePerConnection[SendSizeOffset] * connectionId; int internalSharedBufferOffset = p.sharedBufferOffset + sizePerConnection[SharedSizeOffset] * connectionId; bool needsUpdate = false; // If this is not the first stage we need to fast forward the buffer offset to the correct place if (startStage > 0) { for (int i = 0; i < startStage; ++i) { internalBufferOffset += m_StageCollection.GetSendCapacity(m_StageList[p.FirstStageIndex + i]); internalSharedBufferOffset += m_StageCollection.GetSharedStateCapacity(m_StageList[p.FirstStageIndex + i]); } } for (int i = startStage; i < p.NumStages; ++i) { var prevInbound = inboundBuffer; ProcessSendStage(i, internalBufferOffset, internalSharedBufferOffset, p, ref resumeQ, ref ctx, ref inboundBuffer, ref needsUpdate); if (inboundBuffer.buffer1 == prevInbound.buffer1 && inboundBuffer.buffer2 == prevInbound.buffer2) { if (ctx.header.Length > 0) { if (prevHeader.Length > 0) { ctx.header.WriteBytes(prevHeader.GetUnsafeReadOnlyPtr(), prevHeader.Length); } prevHeader.Clear(); var tempHeader = ctx.header; ctx.header = prevHeader; prevHeader = tempHeader; if (inboundBuffer.buffer2.Length == 0) { inboundBuffer.buffer2 = inboundBuffer.buffer1; } inboundBuffer.buffer1 = prevHeader.GetNativeSlice(0, prevHeader.Length); } } else { #if ENABLE_UNITY_COLLECTIONS_CHECKS if (inboundBuffer.buffer2.Length > 0) { throw new InvalidOperationException("Pipeline send stages must return either the unmodified inbound buffers or a consolidated version with a single buffer"); } #endif // Prev header is now part of payload prevHeader.Clear(); if (ctx.header.Length > 0) { var tempHeader = ctx.header; ctx.header = prevHeader; prevHeader = tempHeader; inboundBuffer.buffer2 = inboundBuffer.buffer1; inboundBuffer.buffer1 = prevHeader.GetNativeSlice(0, prevHeader.Length); } } if (needsUpdate) { AddSendUpdate(connection, i, pipeline, currentUpdates); } if (inboundBuffer.buffer1.Length == 0) { break; } needsUpdate = false; internalBufferOffset += ctx.internalProcessBuffer.Length; internalSharedBufferOffset += ctx.internalSharedProcessBuffer.Length; } if (inboundBuffer.buffer1.Length != 0) { var iov = stackalloc network_iovec[4]; var pipelineId = pipeline.Id; iov[0].buf = &pipelineId; iov[0].len = 1; iov[1].buf = ctx.header.GetUnsafePtr(); iov[1].len = ctx.header.Length; iov[2].buf = inboundBuffer.buffer1.GetUnsafeReadOnlyPtr(); iov[2].len = inboundBuffer.buffer1.Length; if (inboundBuffer.buffer2.Length > 0) { iov[3].buf = inboundBuffer.buffer2.GetUnsafeReadOnlyPtr(); iov[3].len = inboundBuffer.buffer2.Length; // FIXME: handle send errors driver.Send(connection, iov, 4); } else { driver.Send(connection, iov, 3); } } if (resumeQStart >= resumeQ.Length) { break; } startStage = resumeQ[resumeQStart++]; prevHeader.Clear(); inboundBuffer = default(InboundBufferVec); } }