Skip to content

Commit 4db0349

Browse files
authored
Merge pull request #280 from MidLevel/no-bitstream-alloc
fix: Removed alloc HandleIncomingData
2 parents 38fcf44 + 97b4acd commit 4db0349

File tree

2 files changed

+120
-113
lines changed

2 files changed

+120
-113
lines changed

MLAPI/Core/NetworkingManager.cs

Lines changed: 107 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -876,127 +876,127 @@ private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, stri
876876
}
877877
}
878878

879+
private readonly BitStream inputStreamWrapper = new BitStream(new byte[0]);
880+
879881
private void HandleIncomingData(ulong clientId, string channelName, ArraySegment<byte> data, float receiveTime)
880882
{
881883
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Unwrapping Data Header");
882884

883-
using (BitStream inputStream = new BitStream(data.Array))
884-
{
885-
inputStream.SetLength(data.Count + data.Offset);
886-
inputStream.Position = data.Offset;
885+
inputStreamWrapper.SetTarget(data.Array);
886+
inputStreamWrapper.SetLength(data.Count + data.Offset);
887+
inputStreamWrapper.Position = data.Offset;
887888

888-
using (BitStream messageStream = MessagePacker.UnwrapMessage(inputStream, clientId, out byte messageType, out SecuritySendFlags security))
889+
using (BitStream messageStream = MessagePacker.UnwrapMessage(inputStreamWrapper, clientId, out byte messageType, out SecuritySendFlags security))
890+
{
891+
if (messageStream == null)
889892
{
890-
if (messageStream == null)
891-
{
892-
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Message unwrap could not be completed. Was the header corrupt? Crypto error?");
893-
return;
894-
}
895-
else if (messageType == MLAPIConstants.INVALID)
896-
{
897-
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Message unwrap read an invalid messageType");
898-
return;
899-
}
893+
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Message unwrap could not be completed. Was the header corrupt? Crypto error?");
894+
return;
895+
}
896+
else if (messageType == MLAPIConstants.INVALID)
897+
{
898+
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Message unwrap read an invalid messageType");
899+
return;
900+
}
900901

901-
uint headerByteSize = (uint)Arithmetic.VarIntSize(messageType);
902-
NetworkProfiler.StartEvent(TickType.Receive, (uint)(data.Count - headerByteSize), channelName, messageType);
902+
uint headerByteSize = (uint)Arithmetic.VarIntSize(messageType);
903+
NetworkProfiler.StartEvent(TickType.Receive, (uint)(data.Count - headerByteSize), channelName, messageType);
903904

904-
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Data Header: messageType=" + messageType);
905+
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Data Header: messageType=" + messageType);
905906

906-
// Client tried to send a network message that was not the connection request before he was accepted.
907-
if (IsServer && (NetworkConfig.EnableEncryption && PendingClients.ContainsKey(clientId) && PendingClients[clientId].ConnectionState == PendingClient.State.PendingHail && messageType != MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE) ||
908-
(PendingClients.ContainsKey(clientId) && PendingClients[clientId].ConnectionState == PendingClient.State.PendingConnection && messageType != MLAPIConstants.MLAPI_CONNECTION_REQUEST))
909-
{
910-
if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Message recieved from clientId " + clientId + " before it has been accepted");
911-
return;
912-
}
907+
// Client tried to send a network message that was not the connection request before he was accepted.
908+
if (IsServer && (NetworkConfig.EnableEncryption && PendingClients.ContainsKey(clientId) && PendingClients[clientId].ConnectionState == PendingClient.State.PendingHail && messageType != MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE) ||
909+
(PendingClients.ContainsKey(clientId) && PendingClients[clientId].ConnectionState == PendingClient.State.PendingConnection && messageType != MLAPIConstants.MLAPI_CONNECTION_REQUEST))
910+
{
911+
if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Message recieved from clientId " + clientId + " before it has been accepted");
912+
return;
913+
}
913914

914-
#region INTERNAL MESSAGE
915+
#region INTERNAL MESSAGE
915916

916-
switch (messageType)
917-
{
918-
case MLAPIConstants.MLAPI_CONNECTION_REQUEST:
919-
if (IsServer)
920-
InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
921-
break;
922-
case MLAPIConstants.MLAPI_CONNECTION_APPROVED:
923-
if (IsClient)
924-
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
925-
break;
926-
case MLAPIConstants.MLAPI_ADD_OBJECT:
927-
if (IsClient) InternalMessageHandler.HandleAddObject(clientId, messageStream);
928-
break;
929-
case MLAPIConstants.MLAPI_DESTROY_OBJECT:
930-
if (IsClient) InternalMessageHandler.HandleDestroyObject(clientId, messageStream);
931-
break;
932-
case MLAPIConstants.MLAPI_SWITCH_SCENE:
933-
if (IsClient) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
934-
break;
935-
case MLAPIConstants.MLAPI_CHANGE_OWNER:
936-
if (IsClient) InternalMessageHandler.HandleChangeOwner(clientId, messageStream);
937-
break;
938-
case MLAPIConstants.MLAPI_ADD_OBJECTS:
939-
if (IsClient) InternalMessageHandler.HandleAddObjects(clientId, messageStream);
940-
break;
941-
case MLAPIConstants.MLAPI_DESTROY_OBJECTS:
942-
if (IsClient) InternalMessageHandler.HandleDestroyObjects(clientId, messageStream);
943-
break;
944-
case MLAPIConstants.MLAPI_TIME_SYNC:
945-
if (IsClient) InternalMessageHandler.HandleTimeSync(clientId, messageStream, receiveTime);
946-
break;
947-
case MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA:
948-
InternalMessageHandler.HandleNetworkedVarDelta(clientId, messageStream);
949-
break;
950-
case MLAPIConstants.MLAPI_NETWORKED_VAR_UPDATE:
951-
InternalMessageHandler.HandleNetworkedVarUpdate(clientId, messageStream);
952-
break;
953-
case MLAPIConstants.MLAPI_SERVER_RPC:
954-
if (IsServer) InternalMessageHandler.HandleServerRPC(clientId, messageStream);
955-
break;
956-
case MLAPIConstants.MLAPI_SERVER_RPC_REQUEST:
957-
if (IsServer) InternalMessageHandler.HandleServerRPCRequest(clientId, messageStream, channelName, security);
958-
break;
959-
case MLAPIConstants.MLAPI_SERVER_RPC_RESPONSE:
960-
if (IsClient) InternalMessageHandler.HandleServerRPCResponse(clientId, messageStream);
961-
break;
962-
case MLAPIConstants.MLAPI_CLIENT_RPC:
963-
if (IsClient) InternalMessageHandler.HandleClientRPC(clientId, messageStream);
964-
break;
965-
case MLAPIConstants.MLAPI_CLIENT_RPC_REQUEST:
966-
if (IsClient) InternalMessageHandler.HandleClientRPCRequest(clientId, messageStream, channelName, security);
967-
break;
968-
case MLAPIConstants.MLAPI_CLIENT_RPC_RESPONSE:
969-
if (IsServer) InternalMessageHandler.HandleClientRPCResponse(clientId, messageStream);
970-
break;
971-
case MLAPIConstants.MLAPI_UNNAMED_MESSAGE:
972-
InternalMessageHandler.HandleUnnamedMessage(clientId, messageStream);
973-
break;
974-
case MLAPIConstants.MLAPI_NAMED_MESSAGE:
975-
InternalMessageHandler.HandleNamedMessage(clientId, messageStream);
976-
break;
917+
switch (messageType)
918+
{
919+
case MLAPIConstants.MLAPI_CONNECTION_REQUEST:
920+
if (IsServer)
921+
InternalMessageHandler.HandleConnectionRequest(clientId, messageStream);
922+
break;
923+
case MLAPIConstants.MLAPI_CONNECTION_APPROVED:
924+
if (IsClient)
925+
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
926+
break;
927+
case MLAPIConstants.MLAPI_ADD_OBJECT:
928+
if (IsClient) InternalMessageHandler.HandleAddObject(clientId, messageStream);
929+
break;
930+
case MLAPIConstants.MLAPI_DESTROY_OBJECT:
931+
if (IsClient) InternalMessageHandler.HandleDestroyObject(clientId, messageStream);
932+
break;
933+
case MLAPIConstants.MLAPI_SWITCH_SCENE:
934+
if (IsClient) InternalMessageHandler.HandleSwitchScene(clientId, messageStream);
935+
break;
936+
case MLAPIConstants.MLAPI_CHANGE_OWNER:
937+
if (IsClient) InternalMessageHandler.HandleChangeOwner(clientId, messageStream);
938+
break;
939+
case MLAPIConstants.MLAPI_ADD_OBJECTS:
940+
if (IsClient) InternalMessageHandler.HandleAddObjects(clientId, messageStream);
941+
break;
942+
case MLAPIConstants.MLAPI_DESTROY_OBJECTS:
943+
if (IsClient) InternalMessageHandler.HandleDestroyObjects(clientId, messageStream);
944+
break;
945+
case MLAPIConstants.MLAPI_TIME_SYNC:
946+
if (IsClient) InternalMessageHandler.HandleTimeSync(clientId, messageStream, receiveTime);
947+
break;
948+
case MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA:
949+
InternalMessageHandler.HandleNetworkedVarDelta(clientId, messageStream);
950+
break;
951+
case MLAPIConstants.MLAPI_NETWORKED_VAR_UPDATE:
952+
InternalMessageHandler.HandleNetworkedVarUpdate(clientId, messageStream);
953+
break;
954+
case MLAPIConstants.MLAPI_SERVER_RPC:
955+
if (IsServer) InternalMessageHandler.HandleServerRPC(clientId, messageStream);
956+
break;
957+
case MLAPIConstants.MLAPI_SERVER_RPC_REQUEST:
958+
if (IsServer) InternalMessageHandler.HandleServerRPCRequest(clientId, messageStream, channelName, security);
959+
break;
960+
case MLAPIConstants.MLAPI_SERVER_RPC_RESPONSE:
961+
if (IsClient) InternalMessageHandler.HandleServerRPCResponse(clientId, messageStream);
962+
break;
963+
case MLAPIConstants.MLAPI_CLIENT_RPC:
964+
if (IsClient) InternalMessageHandler.HandleClientRPC(clientId, messageStream);
965+
break;
966+
case MLAPIConstants.MLAPI_CLIENT_RPC_REQUEST:
967+
if (IsClient) InternalMessageHandler.HandleClientRPCRequest(clientId, messageStream, channelName, security);
968+
break;
969+
case MLAPIConstants.MLAPI_CLIENT_RPC_RESPONSE:
970+
if (IsServer) InternalMessageHandler.HandleClientRPCResponse(clientId, messageStream);
971+
break;
972+
case MLAPIConstants.MLAPI_UNNAMED_MESSAGE:
973+
InternalMessageHandler.HandleUnnamedMessage(clientId, messageStream);
974+
break;
975+
case MLAPIConstants.MLAPI_NAMED_MESSAGE:
976+
InternalMessageHandler.HandleNamedMessage(clientId, messageStream);
977+
break;
977978
#if !DISABLE_CRYPTOGRAPHY
978-
case MLAPIConstants.MLAPI_CERTIFICATE_HAIL:
979-
if (IsClient) InternalMessageHandler.HandleHailRequest(clientId, messageStream);
980-
break;
981-
case MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE:
982-
if (IsServer) InternalMessageHandler.HandleHailResponse(clientId, messageStream);
983-
break;
984-
case MLAPIConstants.MLAPI_GREETINGS:
985-
if (IsClient) InternalMessageHandler.HandleGreetings(clientId, messageStream);
986-
break;
987-
#endif
988-
case MLAPIConstants.MLAPI_CLIENT_SWITCH_SCENE_COMPLETED:
989-
if (IsServer) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
990-
break;
991-
default:
992-
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Read unrecognized messageType " + messageType);
993-
break;
994-
}
979+
case MLAPIConstants.MLAPI_CERTIFICATE_HAIL:
980+
if (IsClient) InternalMessageHandler.HandleHailRequest(clientId, messageStream);
981+
break;
982+
case MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE:
983+
if (IsServer) InternalMessageHandler.HandleHailResponse(clientId, messageStream);
984+
break;
985+
case MLAPIConstants.MLAPI_GREETINGS:
986+
if (IsClient) InternalMessageHandler.HandleGreetings(clientId, messageStream);
987+
break;
988+
#endif
989+
case MLAPIConstants.MLAPI_CLIENT_SWITCH_SCENE_COMPLETED:
990+
if (IsServer) InternalMessageHandler.HandleClientSwitchSceneCompleted(clientId, messageStream);
991+
break;
992+
default:
993+
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Read unrecognized messageType " + messageType);
994+
break;
995+
}
995996

996-
#endregion
997+
#endregion
997998

998-
NetworkProfiler.EndEvent();
999-
}
999+
NetworkProfiler.EndEvent();
10001000
}
10011001
}
10021002

MLAPI/Serialization/BitStream.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.IO;
33
using static MLAPI.Serialization.Arithmetic;
44

@@ -9,7 +9,7 @@ namespace MLAPI.Serialization
99
/// A stream that can be used at the bit level
1010
/// </summary>
1111
public class BitStream : Stream
12-
{
12+
{
1313
const int initialCapacity = 16;
1414
const float initialGrowthFactor = 2.0f;
1515
private byte[] target;
@@ -54,6 +54,13 @@ public BitStream(byte[] target)
5454
BitLength = (ulong)(target.Length << 3);
5555
}
5656

57+
internal void SetTarget(byte[] target)
58+
{
59+
this.target = target;
60+
BitLength = (ulong)(target.Length << 3);
61+
Position = 0;
62+
}
63+
5764
/// <summary>
5865
/// Whether or not the stream will grow the buffer to accomodate more data.
5966
/// </summary>
@@ -299,12 +306,12 @@ public override void Write(byte[] buffer, int offset, int count)
299306
public override void WriteByte(byte value)
300307
{
301308
// Check bit alignment. If misaligned, each byte written has to be misaligned
302-
if (BitAligned)
309+
if (BitAligned)
303310
{
304311
if (Position + 1 >= target.Length) Grow(1);
305312
target[Position] = value;
306313
Position += 1;
307-
}
314+
}
308315
else
309316
{
310317
if (Position + 1 + 1 >= target.Length) Grow(1);
@@ -386,7 +393,7 @@ public void CopyFrom(Stream s, int count = -1)
386393
{
387394
long currentPosition = s.Position;
388395
s.Position = 0;
389-
396+
390397
int read;
391398
bool readToEnd = count < 0;
392399
while ((readToEnd || count-- > 0) && (read = s.ReadByte()) != -1)
@@ -485,7 +492,7 @@ public void PadStream()
485492
WriteBit(false);
486493
}
487494
}
488-
495+
489496
/// <summary>
490497
/// Reads zeros until the the stream is byte aligned
491498
/// </summary>

0 commit comments

Comments
 (0)