Skip to content

Commit a15bc62

Browse files
committed
fixes Nintendo Switch support + unnecessary memory allocations. closes #40
1 parent b6c0c41 commit a15bc62

File tree

4 files changed

+535
-25
lines changed

4 files changed

+535
-25
lines changed

NativeWebSocket/Assets/Samples~/WebSocketExample/Connection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class Connection : MonoBehaviour
1313
async void Start()
1414
{
1515
// websocket = new WebSocket("ws://echo.websocket.org");
16-
websocket = new WebSocket("ws://localhost:8080");
16+
websocket = new WebSocket("ws://localhost:3000");
1717

1818
websocket.OnOpen += () =>
1919
{

NativeWebSocket/Assets/WebSocket/WebSocket.cs

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ public class WebSocket : IWebSocket
378378
private CancellationTokenSource m_TokenSource;
379379
private CancellationToken m_CancellationToken;
380380

381-
private readonly object Lock = new object();
381+
private readonly object OutgoingMessageLock = new object();
382+
private readonly object IncomingMessageLock = new object();
382383

383384
private bool isSending = false;
384385
private List<ArraySegment<byte>> sendBytesQueue = new List<ArraySegment<byte>>();
@@ -540,7 +541,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
540541
// The state of the connection is contained in the context Items dictionary.
541542
bool sending;
542543

543-
lock (Lock)
544+
lock (OutgoingMessageLock)
544545
{
545546
sending = isSending;
546547

@@ -573,7 +574,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
573574
}
574575

575576
// Note that we've finished sending.
576-
lock (Lock)
577+
lock (OutgoingMessageLock)
577578
{
578579
isSending = false;
579580
}
@@ -584,7 +585,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
584585
else
585586
{
586587
// Add the message to the queue.
587-
lock (Lock)
588+
lock (OutgoingMessageLock)
588589
{
589590
queue.Add(buffer);
590591
}
@@ -594,7 +595,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
594595
private async Task HandleQueue(List<ArraySegment<byte>> queue, WebSocketMessageType messageType)
595596
{
596597
var buffer = new ArraySegment<byte>();
597-
lock (Lock)
598+
lock (OutgoingMessageLock)
598599
{
599600
// Check for an item in the queue.
600601
if (queue.Count > 0)
@@ -612,23 +613,28 @@ private async Task HandleQueue(List<ArraySegment<byte>> queue, WebSocketMessageT
612613
}
613614
}
614615

615-
private Mutex m_MessageListMutex = new Mutex();
616616
private List<byte[]> m_MessageList = new List<byte[]>();
617617

618618
// simple dispatcher for queued messages.
619619
public void DispatchMessageQueue()
620620
{
621-
// lock mutex, copy queue content and clear the queue.
622-
m_MessageListMutex.WaitOne();
623-
List<byte[]> messageListCopy = new List<byte[]>();
624-
messageListCopy.AddRange(m_MessageList);
625-
m_MessageList.Clear();
626-
// release mutex to allow the websocket to add new messages
627-
m_MessageListMutex.ReleaseMutex();
628-
629-
foreach (byte[] bytes in messageListCopy)
621+
if (m_MessageList.Count == 0)
630622
{
631-
OnMessage?.Invoke(bytes);
623+
return;
624+
}
625+
626+
List<byte[]> messageListCopy;
627+
628+
lock (IncomingMessageLock)
629+
{
630+
messageListCopy = new List<byte[]>(m_MessageList);
631+
m_MessageList.Clear();
632+
}
633+
634+
var len = messageListCopy.Count;
635+
for (int i = 0; i < len; i++)
636+
{
637+
OnMessage?.Invoke(messageListCopy[i]);
632638
}
633639
}
634640

@@ -657,9 +663,10 @@ public async Task Receive()
657663

658664
if (result.MessageType == WebSocketMessageType.Text)
659665
{
660-
m_MessageListMutex.WaitOne();
661-
m_MessageList.Add(ms.ToArray());
662-
m_MessageListMutex.ReleaseMutex();
666+
lock (IncomingMessageLock)
667+
{
668+
m_MessageList.Add(ms.ToArray());
669+
}
663670

664671
//using (var reader = new StreamReader(ms, Encoding.UTF8))
665672
//{
@@ -669,9 +676,10 @@ public async Task Receive()
669676
}
670677
else if (result.MessageType == WebSocketMessageType.Binary)
671678
{
672-
m_MessageListMutex.WaitOne();
673-
m_MessageList.Add(ms.ToArray());
674-
m_MessageListMutex.ReleaseMutex();
679+
lock (IncomingMessageLock)
680+
{
681+
m_MessageList.Add(ms.ToArray());
682+
}
675683
}
676684
else if (result.MessageType == WebSocketMessageType.Close)
677685
{

NativeWebSocket/Assets/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "com.endel.nativewebsocket",
3-
"version": "1.1.0",
3+
"version": "1.1.2",
44
"description": "WebSocket client for Unity - with no external dependencies (WebGL, Native, Android, iOS, UWP).",
55
"license": "Apache 2.0",
66
"repository": {

0 commit comments

Comments
 (0)