Commit 9aede428 authored by Jon Maltiel Swenson's avatar Jon Maltiel Swenson Committed by Facebook Github Bot

Remove incorrect call to dcheckIsInEventBaseThread

Summary: The point of this diff is that `AsyncSocket::closeNow()` should be able to be called on a socket that is not attached to an event base. Removing an overly protective `dcheckIsInEventBaseThread()` enables this.

Reviewed By: yfeldblum

Differential Revision: D13219611

fbshipit-source-id: ca57995e1a96d2b937bccf311d3f6b903abc33b7
parent 8c7e748d
...@@ -2489,12 +2489,17 @@ bool AsyncSocket::updateEventRegistration() { ...@@ -2489,12 +2489,17 @@ bool AsyncSocket::updateEventRegistration() {
VLOG(5) << "AsyncSocket::updateEventRegistration(this=" << this VLOG(5) << "AsyncSocket::updateEventRegistration(this=" << this
<< ", fd=" << fd_ << ", evb=" << eventBase_ << ", state=" << state_ << ", fd=" << fd_ << ", evb=" << eventBase_ << ", state=" << state_
<< ", events=" << std::hex << eventFlags_; << ", events=" << std::hex << eventFlags_;
eventBase_->dcheckIsInEventBaseThread();
if (eventFlags_ == EventHandler::NONE) { if (eventFlags_ == EventHandler::NONE) {
if (ioHandler_.isHandlerRegistered()) {
DCHECK(eventBase_ != nullptr);
eventBase_->dcheckIsInEventBaseThread();
}
ioHandler_.unregisterHandler(); ioHandler_.unregisterHandler();
return true; return true;
} }
eventBase_->dcheckIsInEventBaseThread();
// Always register for persistent events, so we don't have to re-register // Always register for persistent events, so we don't have to re-register
// after being called back. // after being called back.
if (!ioHandler_.registerHandler( if (!ioHandler_.registerHandler(
......
...@@ -2949,6 +2949,38 @@ TEST(AsyncSocketTest, TestEvbDetachWtRegisteredIOHandlers) { ...@@ -2949,6 +2949,38 @@ TEST(AsyncSocketTest, TestEvbDetachWtRegisteredIOHandlers) {
socket->close(); socket->close();
} }
TEST(AsyncSocketTest, TestEvbDetachThenClose) {
// Start listening on a local port
TestServer server;
// Connect an AsyncSocket to the server
EventBase evb;
auto socket = AsyncSocket::newSocket(&evb);
ConnCallback cb;
socket->connect(&cb, server.getAddress(), 30);
evb.loop();
ASSERT_EQ(cb.state, STATE_SUCCEEDED);
EXPECT_LE(0, socket->getConnectTime().count());
EXPECT_EQ(socket->getConnectTimeout(), std::chrono::milliseconds(30));
// After the ioHandlers are registered, still should be able to detach/attach
ReadCallback rcb;
socket->setReadCB(&rcb);
auto cbEvbChg = std::make_unique<MockEvbChangeCallback>();
InSequence seq;
EXPECT_CALL(*cbEvbChg, evbDetached(socket.get())).Times(1);
socket->setEvbChangedCallback(std::move(cbEvbChg));
// Should be possible to destroy/call closeNow() without an attached EventBase
EXPECT_TRUE(socket->isDetachable());
socket->detachEventBase();
socket.reset();
}
#ifdef FOLLY_HAVE_MSG_ERRQUEUE #ifdef FOLLY_HAVE_MSG_ERRQUEUE
/* copied from include/uapi/linux/net_tstamp.h */ /* copied from include/uapi/linux/net_tstamp.h */
/* SO_TIMESTAMPING gets an integer bit field comprised of these values */ /* SO_TIMESTAMPING gets an integer bit field comprised of these values */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment