Skip to content

Commit 692ba00

Browse files
authored
Fixing thread bug when sending websocket messages (microsoft#297)
1 parent 4b5107f commit 692ba00

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

Source/WebSocket/WinRT/winrt_websocket.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class winrt_websocket_impl : public hc_websocket_impl
4949
public:
5050
winrt_websocket_impl() : m_connectAsyncOpResult(S_OK)
5151
{
52+
m_outgoingMessageSendInProgress = false;
53+
m_websocketHandle = nullptr;
5254
}
5355

5456
Windows::Networking::Sockets::MessageWebSocket^ m_messageWebSocket;
@@ -61,6 +63,7 @@ class winrt_websocket_impl : public hc_websocket_impl
6163
std::mutex m_outgoingMessageQueueLock;
6264
std::queue<std::shared_ptr<websocket_outgoing_message>> m_outgoingMessageQueue;
6365
hc_websocket_handle_t m_websocketHandle;
66+
std::atomic<bool> m_outgoingMessageSendInProgress;
6467
};
6568

6669
void MessageWebSocketSendMessage(
@@ -307,6 +310,8 @@ HRESULT Internal_HCWebSocketSendMessageAsync(
307310
if (nullptr == httpSingleton)
308311
return E_HC_NOT_INITIALISED;
309312
std::shared_ptr<winrt_websocket_impl> websocketTask = std::dynamic_pointer_cast<winrt_websocket_impl>(websocket->impl);
313+
if(websocketTask == nullptr)
314+
return E_HC_NOT_INITIALISED;
310315

311316
std::shared_ptr<websocket_outgoing_message> msg = std::make_shared<websocket_outgoing_message>();
312317
msg->m_message = message;
@@ -318,20 +323,15 @@ HRESULT Internal_HCWebSocketSendMessageAsync(
318323
return E_INVALIDARG;
319324
}
320325

321-
bool sendInProgress = false;
322326
{
323327
std::lock_guard<std::mutex> lock(websocketTask->m_outgoingMessageQueueLock);
324-
if (websocketTask->m_outgoingMessageQueue.size() > 0)
325-
{
326-
sendInProgress = true;
327-
}
328328
HC_TRACE_INFORMATION(WEBSOCKET, "Websocket [ID %llu]: send msg queue size: %lld", websocketTask->m_websocketHandle->id, websocketTask->m_outgoingMessageQueue.size());
329-
330329
websocketTask->m_outgoingMessageQueue.push(msg);
331330
}
332331

333332
// No sends in progress, so start sending the message
334-
if (!sendInProgress)
333+
bool expectedSendInProgress = false;
334+
if (websocketTask->m_outgoingMessageSendInProgress.compare_exchange_strong(expectedSendInProgress, true))
335335
{
336336
MessageWebSocketSendMessage(websocketTask);
337337
}
@@ -404,6 +404,8 @@ try
404404
catch (Platform::Exception^ e)
405405
{
406406
HC_TRACE_ERROR(WEBSOCKET, "Websocket [ID %llu]: Send failed = 0x%0.8x", websocketTask->m_websocketHandle->id, e->HResult);
407+
bool expectedSendInProgress = true;
408+
websocketTask->m_outgoingMessageSendInProgress.compare_exchange_strong(expectedSendInProgress, false);
407409
return e->HResult;
408410
}
409411

@@ -461,6 +463,8 @@ void MessageWebSocketSendMessage(
461463
}
462464
if (msg == nullptr)
463465
{
466+
bool expectedSendInProgress = true;
467+
websocketTask->m_outgoingMessageSendInProgress.compare_exchange_strong(expectedSendInProgress, false);
464468
return;
465469
}
466470

@@ -491,6 +495,12 @@ void MessageWebSocketSendMessage(
491495
{
492496
hr = ScheduleAsync(msg->m_asyncBlock, 0);
493497
}
498+
499+
if (FAILED(hr))
500+
{
501+
bool expectedSendInProgress = true;
502+
websocketTask->m_outgoingMessageSendInProgress.compare_exchange_strong(expectedSendInProgress, false);
503+
}
494504
}
495505

496506

0 commit comments

Comments
 (0)