@@ -49,6 +49,8 @@ class winrt_websocket_impl : public hc_websocket_impl
49
49
public:
50
50
winrt_websocket_impl () : m_connectAsyncOpResult(S_OK)
51
51
{
52
+ m_outgoingMessageSendInProgress = false ;
53
+ m_websocketHandle = nullptr ;
52
54
}
53
55
54
56
Windows::Networking::Sockets::MessageWebSocket^ m_messageWebSocket;
@@ -61,6 +63,7 @@ class winrt_websocket_impl : public hc_websocket_impl
61
63
std::mutex m_outgoingMessageQueueLock;
62
64
std::queue<std::shared_ptr<websocket_outgoing_message>> m_outgoingMessageQueue;
63
65
hc_websocket_handle_t m_websocketHandle;
66
+ std::atomic<bool > m_outgoingMessageSendInProgress;
64
67
};
65
68
66
69
void MessageWebSocketSendMessage (
@@ -307,6 +310,8 @@ HRESULT Internal_HCWebSocketSendMessageAsync(
307
310
if (nullptr == httpSingleton)
308
311
return E_HC_NOT_INITIALISED;
309
312
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;
310
315
311
316
std::shared_ptr<websocket_outgoing_message> msg = std::make_shared<websocket_outgoing_message>();
312
317
msg->m_message = message;
@@ -318,20 +323,15 @@ HRESULT Internal_HCWebSocketSendMessageAsync(
318
323
return E_INVALIDARG;
319
324
}
320
325
321
- bool sendInProgress = false ;
322
326
{
323
327
std::lock_guard<std::mutex> lock (websocketTask->m_outgoingMessageQueueLock );
324
- if (websocketTask->m_outgoingMessageQueue .size () > 0 )
325
- {
326
- sendInProgress = true ;
327
- }
328
328
HC_TRACE_INFORMATION (WEBSOCKET, " Websocket [ID %llu]: send msg queue size: %lld" , websocketTask->m_websocketHandle ->id , websocketTask->m_outgoingMessageQueue .size ());
329
-
330
329
websocketTask->m_outgoingMessageQueue .push (msg);
331
330
}
332
331
333
332
// 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 ))
335
335
{
336
336
MessageWebSocketSendMessage (websocketTask);
337
337
}
404
404
catch (Platform::Exception^ e)
405
405
{
406
406
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 );
407
409
return e->HResult ;
408
410
}
409
411
@@ -461,6 +463,8 @@ void MessageWebSocketSendMessage(
461
463
}
462
464
if (msg == nullptr )
463
465
{
466
+ bool expectedSendInProgress = true ;
467
+ websocketTask->m_outgoingMessageSendInProgress .compare_exchange_strong (expectedSendInProgress, false );
464
468
return ;
465
469
}
466
470
@@ -491,6 +495,12 @@ void MessageWebSocketSendMessage(
491
495
{
492
496
hr = ScheduleAsync (msg->m_asyncBlock , 0 );
493
497
}
498
+
499
+ if (FAILED (hr))
500
+ {
501
+ bool expectedSendInProgress = true ;
502
+ websocketTask->m_outgoingMessageSendInProgress .compare_exchange_strong (expectedSendInProgress, false );
503
+ }
494
504
}
495
505
496
506
0 commit comments