Skip to content

Commit f2b3312

Browse files
committed
net:tcp-server: another hopeful race condition fix
1 parent 70ef32d commit f2b3312

File tree

1 file changed

+28
-25
lines changed

1 file changed

+28
-25
lines changed

code/components/net-tcp-server/src/UvTcpServer.cpp

+28-25
Original file line numberDiff line numberDiff line change
@@ -204,39 +204,42 @@ void UvTcpServerStream::Write(const std::vector<uint8_t>& data)
204204
fwRefContainer<UvTcpServerStream> stream;
205205
};
206206

207-
// prepare a write request
208-
UvWriteReq* writeReq = new UvWriteReq;
209-
writeReq->sendData = data;
210-
writeReq->buffer.base = reinterpret_cast<char*>(&writeReq->sendData[0]);
211-
writeReq->buffer.len = writeReq->sendData.size();
212-
writeReq->stream = this;
213-
214-
writeReq->write.data = writeReq;
215-
216-
// submit the write request
217-
m_pendingRequests.push([=]()
207+
if (m_writeCallback)
218208
{
219-
if (!m_client)
220-
{
221-
return;
222-
}
209+
// prepare a write request
210+
UvWriteReq* writeReq = new UvWriteReq;
211+
writeReq->sendData = data;
212+
writeReq->buffer.base = reinterpret_cast<char*>(&writeReq->sendData[0]);
213+
writeReq->buffer.len = writeReq->sendData.size();
214+
writeReq->stream = this;
223215

224-
// send the write request
225-
uv_write(&writeReq->write, reinterpret_cast<uv_stream_t*>(m_client.get()), &writeReq->buffer, 1, [](uv_write_t* write, int status)
226-
{
227-
UvWriteReq* req = reinterpret_cast<UvWriteReq*>(write->data);
216+
writeReq->write.data = writeReq;
228217

229-
if (status < 0)
218+
// submit the write request
219+
m_pendingRequests.push([=]()
220+
{
221+
if (!m_client)
230222
{
231-
//trace("write to %s failed - %s\n", req->stream->GetPeerAddress().ToString().c_str(), uv_strerror(status));
223+
return;
232224
}
233225

234-
delete req;
226+
// send the write request
227+
uv_write(&writeReq->write, reinterpret_cast<uv_stream_t*>(m_client.get()), &writeReq->buffer, 1, [](uv_write_t * write, int status)
228+
{
229+
UvWriteReq* req = reinterpret_cast<UvWriteReq*>(write->data);
230+
231+
if (status < 0)
232+
{
233+
//trace("write to %s failed - %s\n", req->stream->GetPeerAddress().ToString().c_str(), uv_strerror(status));
234+
}
235+
236+
delete req;
237+
});
235238
});
236-
});
237239

238-
// wake the callback
239-
uv_async_send(m_writeCallback.get());
240+
// wake the callback
241+
uv_async_send(m_writeCallback.get());
242+
}
240243
}
241244

242245
void UvTcpServerStream::ScheduleCallback(const TScheduledCallback& callback)

0 commit comments

Comments
 (0)