From dc533278e9704a5c825b4b06d49a25a55ec9ea62 Mon Sep 17 00:00:00 2001 From: sta Date: Thu, 3 Dec 2015 16:56:43 +0900 Subject: [PATCH] [Modify] Replace it with new message process --- websocket-sharp/WebSocket.cs | 83 +++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/websocket-sharp/WebSocket.cs b/websocket-sharp/WebSocket.cs index 29661bec..ea309e10 100644 --- a/websocket-sharp/WebSocket.cs +++ b/websocket-sharp/WebSocket.cs @@ -91,7 +91,10 @@ namespace WebSocketSharp _handshakeRequestChecker; private bool _ignoreExtensions; private bool _inContinuation; + private volatile bool _inMessage; private volatile Logger _logger; + private Action + _message; private Queue _messageEventQueue; private uint _nonceCount; private string _origin; @@ -161,6 +164,7 @@ namespace WebSocketSharp _closeContext = context.Close; _logger = context.Log; + _message = messages; _secure = context.IsSecureConnection; _stream = context.Stream; _waitTime = TimeSpan.FromSeconds (1); @@ -176,6 +180,7 @@ namespace WebSocketSharp _closeContext = context.Close; _logger = context.Log; + _message = messages; _secure = context.IsSecureConnection; _stream = context.Stream; _waitTime = TimeSpan.FromSeconds (1); @@ -236,6 +241,7 @@ namespace WebSocketSharp _base64Key = CreateBase64Key (); _client = true; _logger = new Logger (); + _message = messagec; _secure = _uri.Scheme == "wss"; _waitTime = TimeSpan.FromSeconds (5); @@ -263,6 +269,13 @@ namespace WebSocketSharp } } + internal bool HasMessage { + get { + lock (_forMessageEventQueue) + return _messageEventQueue.Count > 0; + } + } + // As server internal bool IgnoreExtensions { get { @@ -965,6 +978,63 @@ namespace WebSocketSharp _readyState = WebSocketState.Connecting; } + private void message () + { + MessageEventArgs e = null; + lock (_forMessageEventQueue) { + if (_inMessage || _messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) + return; + + _inMessage = true; + e = _messageEventQueue.Dequeue (); + } + + _message (e); + } + + private void messagec (MessageEventArgs e) + { + do { + try { + OnMessage.Emit (this, e); + } + catch (Exception ex) { + processException (ex, "An exception has occurred during an OnMessage event."); + } + + lock (_forMessageEventQueue) { + if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { + _inMessage = false; + break; + } + + e = _messageEventQueue.Dequeue (); + } + } + while (true); + } + + private void messages (MessageEventArgs e) + { + try { + OnMessage.Emit (this, e); + } + catch (Exception ex) { + processException (ex, "An exception has occurred during an OnMessage event."); + } + + lock (_forMessageEventQueue) { + if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { + _inMessage = false; + return; + } + + e = _messageEventQueue.Dequeue (); + } + + ThreadPool.QueueUserWorkItem (state => messages (e)); + } + private void open () { try { @@ -1500,19 +1570,10 @@ namespace WebSocketSharp // Receive next asap because the Ping or Close needs a response to it. receive (); - if ((frame.IsControl && !(frame.IsPing && _emitOnPing)) || !frame.IsFinal) + if (_inMessage || !HasMessage || _readyState != WebSocketState.Open) return; - lock (_forEvent) { - try { - var e = dequeueFromMessageEventQueue (); - if (e != null && _readyState == WebSocketState.Open) - OnMessage.Emit (this, e); - } - catch (Exception ex) { - processException (ex, "An exception has occurred during an OnMessage event."); - } - } + message (); }, ex => processException (ex, "An exception has occurred while receiving a message."));