Redo how socket shutdown works:
authorRobert Sesek <rsesek@bluestatic.org>
Mon, 30 May 2011 02:05:38 +0000 (22:05 -0400)
committerRobert Sesek <rsesek@bluestatic.org>
Mon, 30 May 2011 02:05:38 +0000 (22:05 -0400)
* Keep hold of the socketHandle_ from the accept callback
* close() this socket (creating a CFSocket breaks CFStreams)
* Implement -[NetworkConnectionDelegate connectionDidClose:] to reconnect if attached
* When kCFStreamEventEndEncountered is received, just go through CloseConnection(), same with kCFStreamEventErrorOccurred

Source/DebuggerBackEnd.m
Source/NetworkCallbackController.mm
Source/NetworkConnection.mm

index d8500f2349ca44107d6e2d07a7ba4d352fc43ec2..62861d667b28df94459d67bdf7355420f75271fe 100644 (file)
   // TODO: update the status.
 }
 
+/**
+ * Called when the connection is finally closed. This will reopen the listening
+ * socket if the debugger remains attached.
+ */
+- (void)connectionDidClose:(NetworkConnection*)connection
+{
+  if ([delegate respondsToSelector:@selector(debuggerDisconnected)])
+    [delegate debuggerDisconnected];
+
+  if (self.attached)
+    [connection_ connect];
+}
+
 - (void)handleResponse:(NSXMLDocument*)response
 {
   NSInteger transactionID = [connection_ transactionIDFromResponse:response];
index 1635f7b9906ddac140ceb4fc2c0cc3e86dbf35c1..5e5bd088757ff28151d80ce92f9862ec3f37eece 100644 (file)
@@ -79,12 +79,24 @@ void NetworkCallbackController::OpenConnection(NSUInteger port)
 
 void NetworkCallbackController::CloseConnection()
 {
+  NSUInteger closeCount = 0;
+
+  if (readStream_) {
+    UnscheduleReadStream();
+    ++closeCount;
+  }
+  if (writeStream_) {
+    UnscheduleWriteStream();
+    ++closeCount;
+  }
+
   if (socketHandle_) {
-    close(socketHandle_);
-    //socketHandle_ = NULL;
+    for ( ; closeCount > 0; --closeCount)
+      close(socketHandle_);
+
+    socketHandle_ = NULL;
+    [connection_ socketDisconnected];
   }
-  UnscheduleReadStream();
-  UnscheduleWriteStream();
 }
 
 BOOL NetworkCallbackController::WriteStreamCanAcceptBytes()
@@ -220,13 +232,11 @@ void NetworkCallbackController::OnReadStreamEvent(CFReadStreamRef stream,
       
     case kCFStreamEventErrorOccurred:
       ReportError(CFReadStreamCopyError(stream));
-      UnscheduleReadStream();
+      CloseConnection();
       break;
       
     case kCFStreamEventEndEncountered:
-      UnscheduleReadStream();
       CloseConnection();
-      [connection_ socketDisconnected];
       break;
   };
 }
@@ -242,12 +252,11 @@ void NetworkCallbackController::OnWriteStreamEvent(CFWriteStreamRef stream,
       
     case kCFStreamEventErrorOccurred:
       ReportError(CFWriteStreamCopyError(stream));
-      UnscheduleWriteStream();
+      CloseConnection();
       break;
       
     case kCFStreamEventEndEncountered:
-      UnscheduleReadStream();
-      [connection_ socketDisconnected];
+      CloseConnection();
       break;
   }
 }
index c133614018a75460af04cb65dd5a046710748e1e..2fae29f40b11892d0c33a7f5acd576dcfe3fffac 100644 (file)
@@ -100,6 +100,9 @@ void PerformQuitSignal(void* info)
   CFRelease(quitSource_);
   quitSource_ = NULL;
 
+  if ([delegate_ respondsToSelector:@selector(connectionDidClose:)])
+    [delegate_ connectionDidClose:self];
+
   [pool release];
 }
 
@@ -157,8 +160,7 @@ void PerformQuitSignal(void* info)
  */
 - (void)socketDisconnected
 {
-  if ([delegate_ respondsToSelector:@selector(connectionDidClose:)])
-    [delegate_ connectionDidClose:self];
+  [self close];
 }
 
 /**