Skip to content

Commit df9b1f6

Browse files
committed
[core] Revert PR #2834.
Overlapped send with 100 ms timeout on Windows added a data race.
1 parent 3b84386 commit df9b1f6

File tree

2 files changed

+10
-40
lines changed

2 files changed

+10
-40
lines changed

srtcore/channel.cpp

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,6 @@ srt::CChannel::CChannel()
142142
, m_bBindMasked(true)
143143
#endif
144144
{
145-
#ifdef _WIN32
146-
SecureZeroMemory((PVOID)&m_SendOverlapped, sizeof(WSAOVERLAPPED));
147-
m_SendOverlapped.hEvent = WSACreateEvent();
148-
if (m_SendOverlapped.hEvent == NULL) {
149-
LOGC(kmlog.Error, log << CONID() << "IPE: WSACreateEvent failed with error: " << NET_ERROR);
150-
throw CUDTException(MJ_SETUP, MN_NORES, NET_ERROR);
151-
}
152-
#endif
153145
#ifdef SRT_ENABLE_PKTINFO
154146
// Do the check for ancillary data buffer size, kinda assertion
155147
static const size_t CMSG_MAX_SPACE = sizeof (CMSGNodeIPv4) + sizeof (CMSGNodeIPv6);
@@ -165,12 +157,7 @@ srt::CChannel::CChannel()
165157
#endif
166158
}
167159

168-
srt::CChannel::~CChannel()
169-
{
170-
#ifdef _WIN32
171-
WSACloseEvent(m_SendOverlapped.hEvent);
172-
#endif
173-
}
160+
srt::CChannel::~CChannel() {}
174161

175162
void srt::CChannel::createSocket(int family)
176163
{
@@ -789,32 +776,18 @@ int srt::CChannel::sendto(const sockaddr_any& addr, CPacket& packet, const socka
789776
#else
790777
DWORD size = (DWORD)(CPacket::HDR_SIZE + packet.getLength());
791778
int addrsize = addr.size();
779+
WSAOVERLAPPED overlapped;
780+
SecureZeroMemory((PVOID)&overlapped, sizeof(WSAOVERLAPPED));
781+
int res = ::WSASendTo(m_iSocket, (LPWSABUF)packet.m_PacketVector, 2, &size, 0, addr.get(), addrsize, &overlapped, NULL);
792782

793-
int res = ::WSASendTo(m_iSocket, (LPWSABUF)packet.m_PacketVector, 2, &size, 0, addr.get(), addrsize, &m_SendOverlapped, NULL);
794-
795-
if (res == SOCKET_ERROR)
783+
if (res == SOCKET_ERROR && NET_ERROR == WSA_IO_PENDING)
796784
{
797-
if (NET_ERROR == WSA_IO_PENDING)
798-
{
799-
DWORD res_wait = WSAWaitForMultipleEvents(1, &m_SendOverlapped.hEvent, TRUE, 100 /*ms*/, FALSE);
800-
if (res_wait == WAIT_FAILED)
801-
{
802-
LOGC(kslog.Warn, log << "CChannel::WSAWaitForMultipleEvents: failed with " << NET_ERROR);
803-
res = -1;
804-
}
805-
else
806-
{
807-
DWORD dwFlags = 0;
808-
const bool bCompleted = WSAGetOverlappedResult(m_iSocket, &m_SendOverlapped, &size, false, &dwFlags);
809-
res = bCompleted ? 0 : -1;
810-
}
811-
}
812-
else
813-
{
814-
LOGC(kmlog.Error, log << CONID() << "WSASendTo failed with error: " << NET_ERROR);
815-
}
785+
DWORD dwFlags = 0;
786+
const bool bCompleted = WSAGetOverlappedResult(m_iSocket, &overlapped, &size, true, &dwFlags);
787+
WSACloseEvent(overlapped.hEvent);
788+
res = bCompleted ? 0 : -1;
816789
}
817-
WSAResetEvent(m_SendOverlapped.hEvent);
790+
818791
res = (0 == res) ? size : -1;
819792
#endif
820793

srtcore/channel.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,6 @@ class CChannel
169169

170170
private:
171171
UDPSOCKET m_iSocket; // socket descriptor
172-
#ifdef _WIN32
173-
mutable WSAOVERLAPPED m_SendOverlapped;
174-
#endif
175172

176173
// Mutable because when querying original settings
177174
// this comprises the cache for extracted values,

0 commit comments

Comments
 (0)