[39658] branches/gsoc08-framework/MacPorts_Framework_Release

armahg at macports.org armahg at macports.org
Thu Aug 28 02:25:01 PDT 2008


Revision: 39658
          http://trac.macosforge.org/projects/macports/changeset/39658
Author:   armahg at macports.org
Date:     2008-08-28 02:25:00 -0700 (Thu, 28 Aug 2008)
Log Message:
-----------
Added ConnectionOpen2() function to help debug Broken Pipe errors for Framework<->HelperTool IPC.

Modified Paths:
--------------
    branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m
    branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m
    branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.h
    branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m
    branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications.h

Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m	2008-08-28 07:55:13 UTC (rev 39657)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m	2008-08-28 09:25:00 UTC (rev 39658)
@@ -180,6 +180,78 @@
     return err;
 }
 
+static int ConnectionOpen2(ConnectionRef *connPtr, const char * sockPath)
+// Opens a connection to the server.
+//
+// On entry, connPtr must not be NULL
+// On entry, *connPtr must be NULL
+// Returns an errno-style error code
+// On success, *connPtr will not be NULL
+// On error, *connPtr will be NULL
+{
+    int                 err;
+    ConnectionRef       conn;
+    Boolean             sayGoodbye;
+    
+    assert( connPtr != NULL);
+    assert(*connPtr == NULL);
+    
+    sayGoodbye = false;
+    
+    // Allocate a ConnectionState structure and fill out some basic fields.
+    
+    err = 0;
+    conn = (ConnectionRef) calloc(1, sizeof(*conn));
+    if (conn == NULL) {
+        err = ENOMEM;
+    }
+    if (err == 0) {
+        conn->fMagic  = kConnectionStateMagic;
+        
+        // For clean up to work properly, we must make sure that, if 
+        // the connection record is allocated successfully, we always 
+        // set fSockFD to -1.  So, while the following line is redundant 
+        // in the current code, it's present to press home this point.
+		
+        conn->fSockFD = -1;
+    }
+    
+    // Create a UNIX domain socket and connect to the server. 
+    
+    if (err == 0) {
+        conn->fSockFD = socket(AF_UNIX, SOCK_STREAM, 0);
+        err = MoreUNIXErrno(conn->fSockFD);
+    }
+    if (err == 0) {
+        struct sockaddr_un connReq;
+		
+        connReq.sun_len    = sizeof(connReq);
+        connReq.sun_family = AF_UNIX;
+        //strcpy(connReq.sun_path, kServerSocketPath);
+		strcpy(connReq.sun_path, sockPath);
+		
+        err = connect(conn->fSockFD, (struct sockaddr *) &connReq, SUN_LEN(&connReq));
+        err = MoreUNIXErrno(err);
+        
+        sayGoodbye = (err == 0);
+    }
+    
+    // Clean up.
+    
+    if (err != 0) {
+        ConnectionCloseInternal(conn, sayGoodbye);
+        conn = NULL;
+    }
+    *connPtr = conn;
+    
+    assert( (err == 0) == (*connPtr != NULL) );
+    
+    return err;
+}
+
+
+
+
 static int ConnectionOpen(ConnectionRef *connPtr)
 // Opens a connection to the server.
 //
@@ -600,7 +672,7 @@
     
     // Connect to the server.
     if (err == 0) {
-        err = ConnectionOpen(&iConn);
+        //err = ConnectionOpen(&iConn);
 		//asl_NSLog(logClient , logMsg, ASL_LEVEL_DEBUG, @"MPHelperTool: Installed Signal to Socket!");
 		[ASLLogger logString:@"MPHelperTool: Installed Signal to Socket!"];
     }
@@ -752,7 +824,11 @@
 		NSString * data = [NSString stringWithUTF8String:log];
 		[ASLLogger logString:data];
 		if (notifier != nil && [notifier connected]) {
-			[notifier doShout:data];
+			if([notifier doShout:data])
+				[ASLLogger logString:@"DoShout successful"];
+			else
+				[ASLLogger logString:@"DoShout unsuccessful"];
+			
 		}
 		else
 			[ASLLogger logString:[NSString stringWithFormat:@"notifier has value %@", notifier]];

Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m	2008-08-28 07:55:13 UTC (rev 39657)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m	2008-08-28 09:25:00 UTC (rev 39658)
@@ -397,15 +397,12 @@
 		[NSThread detachNewThreadSelector:@selector(startIPCServerThread) 
 								 toTarget:notificationObject 
 							   withObject:nil];
+		//[notificationObject startIPCServerThread];
 		
 		//}
 		secondResult = [self evaluateStringWithMPHelperTool:statement error:mportError];
 		
-		//We can stop the thread now
-		//if ([notificationObject respondsToSelector:@selector(stopServerThread)]) {
-			NSLog(@"STOPPING SERVER THREAD");
-			[notificationObject stopIPCServerThread];
-		//}
+		
 		return secondResult;
 	}
 	

Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.h
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.h	2008-08-28 07:55:13 UTC (rev 39657)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.h	2008-08-28 09:25:00 UTC (rev 39658)
@@ -8,9 +8,12 @@
 
 #import "MPNotifications.h"
 
+static int clientHasQuit = 0;
+static int hasInstalledSignalsToSocket = 0;
 
 @interface MPNotifications (IPCAdditions) 
-
+-(BOOL) terminateBackgroundThread;
+-(void) setTerminateBackgroundThread:(BOOL)newStatus;
 -(void) startIPCServerThread;
 -(void) prepareIPCServerThread;
 -(void) stopIPCServerThread;

Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m	2008-08-28 07:55:13 UTC (rev 39657)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m	2008-08-28 09:25:00 UTC (rev 39658)
@@ -884,6 +884,7 @@
     return result;
 }
 
+
 static Boolean ClientQuit(ClientState *client, PacketQuit *packet)
 // A packet handler for the Quit packet.  See the large comment above for 
 // a discussion of the general form of a packet handler.
@@ -905,11 +906,17 @@
         // the client's fault (-:
         
         result = ClientSendReply(client, &packet->fHeader, 0);
-		
-		NSLog(@"CLIENT QUIT BEING CALLED (YAAAY!!)");
     }
     
-    return result;
+	if (result) {
+		//This is a shared variable, the server thread uses this to keep the while
+		//loop running. For now i'm not synchronizing variable access since the
+		//worst that could happen is that the server is late in reading a chaged
+		//value update
+		clientHasQuit = 1;
+    }
+	
+	return result;
 }
 
 static void ClientGotData(ClientState *client, const void *data)
@@ -1329,7 +1336,14 @@
 
 
 @implementation MPNotifications (IPCAdditions)
+-(BOOL) terminateBackgroundThread {
+	return terminateBackgroundThread;
+}
 
+-(void) setTerminateBackgroundThread:(BOOL)newStatus {
+	terminateBackgroundThread = newStatus;
+}
+
 -(void) startIPCServerThread {
 	NSAutoreleasePool * sPool = [[NSAutoreleasePool alloc] init];
 	
@@ -1361,6 +1375,7 @@
 	// SIGINT and SIGINFO to our runloop.  If either of these signals occurs, we 
 	// end up executing SignalRunLoopCallback.
     if (err == 0) {
+		if (hasInstalledSignalsToSocket == 0) {
         sigset_t    interestingSignals;
         (void) sigemptyset(&interestingSignals);
         (void) sigaddset(&interestingSignals, SIGINT);
@@ -1373,6 +1388,13 @@
 									SignalRunLoopCallback,
 									NULL
 									);
+			if (err == 0) {
+				NSLog(@"Successfuly loaded signals to socket");
+				hasInstalledSignalsToSocket = 1;
+			}
+			else
+				NSLog(@"Attempted to unsucessfully to Install signal to socket");
+		}
     }
 	
 	// Create the initial client set.
@@ -1429,7 +1451,8 @@
     }
 	
 	
-	double resolution = 30.0;
+	double resolution = 0.1;
+	BOOL isRunning;
 	
 	//Add input sources to my run loop 
 	//terminateBackgroundThread is going to be set to NO before the privileged operation is called
@@ -1440,10 +1463,18 @@
 	
 	do {
 		NSDate * nextDate = [NSDate dateWithTimeIntervalSinceNow:resolution];
-		[currentLoop runMode:NSDefaultRunLoopMode beforeDate:nextDate];
+		isRunning = [currentLoop runMode:NSDefaultRunLoopMode beforeDate:nextDate];
 		
+		//NSLog(@"running runloop");
 		//might add some code here to clean up and recreate autoreleasepool
-	}	while (terminateBackgroundThread == NO);
+	//}	while (isRunning && terminateBackgroundThread == NO);
+	} while (isRunning || clientHasQuit == 0);
+		
+		
+	//Forcibly terminate runloop N.B. ClientQuit() which is invoked
+	//before this call also terminates applications main runloop ...
+	//check to ensure that that doesn't create problems
+	CFRunLoopStop([currentLoop getCFRunLoop]);
 	
 	[sPool release];
 }

Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications.h
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications.h	2008-08-28 07:55:13 UTC (rev 39657)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications.h	2008-08-28 09:25:00 UTC (rev 39658)
@@ -89,6 +89,7 @@
 	NSFileHandle * readHandle;
 	
 	//BSD sockets stuff
+	id objectLock;
 	BOOL terminateBackgroundThread;
 	
 }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macports-changes/attachments/20080828/5f43b265/attachment-0001.html 


More information about the macports-changes mailing list