Move socket clean inside operation queue

Summary: Set delegate and close inside the operation's queue as to make it safer i.e. all socket related operations are done inside the queue.

Reviewed By: ivanmisuno

Differential Revision: D47124235

fbshipit-source-id: 48b53db1cd47d017a26186a156046ba68fe358b7
This commit is contained in:
Lorenzo Blasa
2023-06-29 12:40:09 -07:00
committed by Facebook GitHub Bot
parent 14068f1ea8
commit 4ac755370d
2 changed files with 14 additions and 13 deletions

View File

@@ -171,16 +171,21 @@ static constexpr int connectionKeepaliveSeconds = 10;
} }
_keepAlive = nil; _keepAlive = nil;
if (_socket) { __weak auto weakSelf = self;
// Clear the socket delegate before close. Ensures that we won't get NSBlockOperation* disconnectOperation =
// any messages after the disconnect takes place. [NSBlockOperation blockOperationWithBlock:^{
[_socket setDelegate:nil]; __strong auto strongSelf = weakSelf;
[_socket close]; // Clear the socket delegate before close. Ensures that we won't get
_socket = nil; // any messages after the disconnect takes place.
}; if (strongSelf->_socket) {
[strongSelf->_socket setDelegate:nil];
[strongSelf->_socket close];
[_dispatchQueue cancelAllOperations]; strongSelf->_socket = nil;
[_dispatchQueue waitUntilAllOperationsAreFinished]; }
}];
[_dispatchQueue addOperations:@[ disconnectOperation ] waitUntilFinished:YES];
} }
- (void)send:(NSString*)message - (void)send:(NSString*)message

View File

@@ -107,13 +107,11 @@ void FlipperConnectionManagerImpl::handleSocketEvent(SocketEvent event) {
} }
break; break;
case SocketEvent::SSL_ERROR: case SocketEvent::SSL_ERROR:
log("[conn] handleSocketEvent(SSL_ERROR)");
failedConnectionAttempts_++; failedConnectionAttempts_++;
reconnect(); reconnect();
break; break;
case SocketEvent::CLOSE: case SocketEvent::CLOSE:
case SocketEvent::ERROR: case SocketEvent::ERROR:
log("[conn] handleSocketEvent(CLOSE_ERROR)");
if (!isConnected_) { if (!isConnected_) {
reconnect(); reconnect();
return; return;
@@ -182,7 +180,6 @@ void FlipperConnectionManagerImpl::startSync() {
} }
void FlipperConnectionManagerImpl::connectAndExchangeCertificate() { void FlipperConnectionManagerImpl::connectAndExchangeCertificate() {
log("[conn] connectAndExchangeCertificate()");
auto port = insecurePort; auto port = insecurePort;
auto endpoint = FlipperConnectionEndpoint(deviceData_.host, port, false); auto endpoint = FlipperConnectionEndpoint(deviceData_.host, port, false);
@@ -265,7 +262,6 @@ void FlipperConnectionManagerImpl::reconnect() {
log("Not started"); log("Not started");
return; return;
} }
log("[conn] reconnect()");
scheduler_->scheduleAfter( scheduler_->scheduleAfter(
[this]() { startSync(); }, RECONNECT_INTERVAL_SECONDS * 1000.0f); [this]() { startSync(); }, RECONNECT_INTERVAL_SECONDS * 1000.0f);
} }